From 23073a8841d0e5bb8c515709a8c4b26c7f88d77a Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Sun, 26 Mar 2017 14:43:59 +0200 Subject: [PATCH] Registration process implemented --- .idea/dictionaries/Sebastian.xml | 7 + .idea/gradle.xml | 2 +- .idea/misc.xml | 2 +- app/build.gradle | 6 +- app/src/main/AndroidManifest.xml | 9 +- .../Exceptions/NotInstantiatedException.java | 26 +++ .../it14/postgrachelor/LoginFragment.java | 131 ++++++++++++ .../it14/postgrachelor/MainActivity.java | 187 ++++++++++++++++-- .../it14/postgrachelor/MainFragment.java | 128 ++++++++++++ .../postgrachelor/QuestionEndFragment.java | 109 ++++++++++ .../it14/postgrachelor/QuestionFragment.java | 109 ++++++++++ .../postgrachelor/QuestionStartFragment.java | 109 ++++++++++ .../postgrachelor/Services/JsonRequest.java | 141 +++++++++++++ .../postgrachelor/Services/JsonRequestPG.java | 68 +++++++ .../postgrachelor/Services/LoginService.java | 162 +++++++++++++++ .../circular_progress_drawable_red.xml | 7 + .../horizontal_progress_drawable_red.xml | 22 +++ app/src/main/res/drawable/ic_play_arrow.xml | 10 + app/src/main/res/layout/app_bar_main.xml | 20 +- app/src/main/res/layout/content_main.xml | 20 -- app/src/main/res/layout/fragment_login.xml | 53 +++++ app/src/main/res/layout/fragment_main.xml | 64 ++++++ .../res/layout/fragment_main_category.xml | 35 ++++ .../main/res/layout/fragment_main_status.xml | 40 ++++ app/src/main/res/layout/fragment_question.xml | 61 ++++++ .../main/res/layout/fragment_question_end.xml | 33 ++++ .../res/layout/fragment_question_start.xml | 25 +++ app/src/main/res/layout/nav_header_main.xml | 13 +- .../main/res/menu/activity_main_drawer.xml | 25 +-- app/src/main/res/values/strings.xml | 14 ++ build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 +- 32 files changed, 1576 insertions(+), 68 deletions(-) create mode 100644 .idea/dictionaries/Sebastian.xml create mode 100644 app/src/main/java/de/hwr_berlin/it14/postgrachelor/Exceptions/NotInstantiatedException.java create mode 100644 app/src/main/java/de/hwr_berlin/it14/postgrachelor/LoginFragment.java create mode 100644 app/src/main/java/de/hwr_berlin/it14/postgrachelor/MainFragment.java create mode 100644 app/src/main/java/de/hwr_berlin/it14/postgrachelor/QuestionEndFragment.java create mode 100644 app/src/main/java/de/hwr_berlin/it14/postgrachelor/QuestionFragment.java create mode 100644 app/src/main/java/de/hwr_berlin/it14/postgrachelor/QuestionStartFragment.java create mode 100644 app/src/main/java/de/hwr_berlin/it14/postgrachelor/Services/JsonRequest.java create mode 100644 app/src/main/java/de/hwr_berlin/it14/postgrachelor/Services/JsonRequestPG.java create mode 100644 app/src/main/java/de/hwr_berlin/it14/postgrachelor/Services/LoginService.java create mode 100644 app/src/main/res/drawable/circular_progress_drawable_red.xml create mode 100644 app/src/main/res/drawable/horizontal_progress_drawable_red.xml create mode 100644 app/src/main/res/drawable/ic_play_arrow.xml delete mode 100644 app/src/main/res/layout/content_main.xml create mode 100644 app/src/main/res/layout/fragment_login.xml create mode 100644 app/src/main/res/layout/fragment_main.xml create mode 100644 app/src/main/res/layout/fragment_main_category.xml create mode 100644 app/src/main/res/layout/fragment_main_status.xml create mode 100644 app/src/main/res/layout/fragment_question.xml create mode 100644 app/src/main/res/layout/fragment_question_end.xml create mode 100644 app/src/main/res/layout/fragment_question_start.xml diff --git a/.idea/dictionaries/Sebastian.xml b/.idea/dictionaries/Sebastian.xml new file mode 100644 index 0000000..11dae5c --- /dev/null +++ b/.idea/dictionaries/Sebastian.xml @@ -0,0 +1,7 @@ + + + + postgrachelor + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 0e23f8e..afaee01 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -3,7 +3,7 @@ - + diff --git a/app/build.gradle b/app/build.gradle index 5ba9d61..d9ef5eb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,7 +24,9 @@ dependencies { androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) - compile 'com.android.support:appcompat-v7:25.2.0' - compile 'com.android.support:design:25.2.0' + compile 'com.android.support:gridlayout-v7:25.3.0' + compile 'com.android.support:appcompat-v7:25.3.0' + compile 'com.android.support:design:25.3.0' + compile 'com.android.support:support-v4:25.3.0' testCompile 'junit:junit:4.12' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 06b9bf5..aad18c2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,8 +2,10 @@ + + - + + diff --git a/app/src/main/java/de/hwr_berlin/it14/postgrachelor/Exceptions/NotInstantiatedException.java b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/Exceptions/NotInstantiatedException.java new file mode 100644 index 0000000..2c94e85 --- /dev/null +++ b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/Exceptions/NotInstantiatedException.java @@ -0,0 +1,26 @@ +package de.hwr_berlin.it14.postgrachelor.Exceptions; + +/** + * Created by sebastian on 25.03.17. + * Exception to indicate a not instantiated service + */ + +public class NotInstantiatedException extends Exception { + private static final long serialVersionUID = 1997753363232807009L; + + public NotInstantiatedException() { + super(); + } + + public NotInstantiatedException(String message) { + super(message); + } + + public NotInstantiatedException(Throwable cause) { + super(cause); + } + + public NotInstantiatedException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/app/src/main/java/de/hwr_berlin/it14/postgrachelor/LoginFragment.java b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/LoginFragment.java new file mode 100644 index 0000000..eab0c75 --- /dev/null +++ b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/LoginFragment.java @@ -0,0 +1,131 @@ +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.Button; +import android.widget.EditText; + +import de.hwr_berlin.it14.postgrachelor.Exceptions.NotInstantiatedException; +import de.hwr_berlin.it14.postgrachelor.Services.LoginService; + + +/** + * A simple {@link Fragment} subclass. + * Activities that contain this fragment must implement the + * {@link LoginFragment.OnLoginFragmentInteractionListener} interface + * to handle interaction events. + * Use the {@link LoginFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class LoginFragment extends Fragment { + public static final String NAME = "LOGIN_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 OnLoginFragmentInteractionListener mListener; + + public LoginFragment() { + // 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 LoginFragment. + */ + // TODO: Rename and change types and number of parameters + public static LoginFragment newInstance(String param1, String param2) { + LoginFragment fragment = new LoginFragment(); + 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 + View layout = inflater.inflate(R.layout.fragment_login, container, false); + Button login_btn = (Button) layout.findViewById(R.id.login_btn); + final EditText login_edit = (EditText) layout.findViewById(R.id.login_edit); + login_btn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.d(NAME, "Button click: "+login_edit.getText().toString()); + + try { + LoginService.doLogin(login_edit.getText().toString()); + } catch (NotInstantiatedException e) { + e.printStackTrace(); + } + } + }); + + return layout; + } + + // TODO: Rename method, update argument and hook method into UI event + public void onButtonPressed(Uri uri) { + if (mListener != null) { + mListener.onLoginFragmentInteraction(uri); + } + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnLoginFragmentInteractionListener) { + mListener = (OnLoginFragmentInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnLoginFragmentInteractionListener"); + } + } + + @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 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 { + private final String connectionURL; + protected final String path; + private final HashMap params; + protected final Activity activity; + private ProgressDialog pDialog; + + JsonRequest(String path, HashMap params, Activity activity) { + this.connectionURL = getConnectionURL(); + this.path = path; + this.params = params; + this.activity = activity; + Log.d("fragment, JSONRequest", connectionURL+path); + } + + protected abstract String getConnectionURL(); + + @Override + protected void onPreExecute() { + super.onPreExecute(); + Log.d("fragment, JSONRequest", "onPre1"); + // Showing progress dialog + pDialog = new ProgressDialog(this.activity); + pDialog.setMessage("Please wait..."); + pDialog.setCancelable(false); + pDialog.show(); + } + + + @Override + protected JSONObject doInBackground(Void... arg0) { + URL url = null; + String jsonText = ""; + JSONObject jsonObj = null; + try { + url = new URL(parseURL(this.connectionURL+this.path, this.params)); + } catch (MalformedURLException e) { + e.printStackTrace(); + } + HttpURLConnection urlConnection = null; + if (url == null) + return new JSONObject(); + try { + urlConnection = (HttpURLConnection) url.openConnection(); + } catch (IOException e) { + e.printStackTrace(); + } + if (urlConnection == null) + return new JSONObject(); + try { + InputStream in = new BufferedInputStream(urlConnection.getInputStream()); + java.util.Scanner s = new java.util.Scanner(in).useDelimiter("\\A"); + jsonText = s.hasNext() ? s.next() : ""; + } catch (IOException e) { + e.printStackTrace(); + } finally { + urlConnection.disconnect(); + } + + //jsonText = "{\"meta\":{\"status\": 0, \"message\": \"Success\"}, \"data\": {}}"; + + // register + // jsonText = "{\"meta\":{\"status\": 0, \"message\": \"Success\"}, \"data\": {}}"; + + if (!jsonText.equals("")) { + try { + jsonObj = new JSONObject(jsonText); + } catch (final JSONException e) { + Log.e(TAG, "Json parsing error: " + e.getMessage()); + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(activity.getApplicationContext(), + "Json parsing error: " + e.getMessage(), + Toast.LENGTH_LONG) + .show(); + } + }); + + } + } else { + Log.e(TAG, "Couldn't get json from server."); + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(activity.getApplicationContext(), + "Couldn't get json from server. Check LogCat for possible errors!", + Toast.LENGTH_LONG) + .show(); + } + }); + + } + + return jsonObj; + } + + @Override + protected void onPostExecute(JSONObject result) { + super.onPostExecute(result); + if (pDialog.isShowing()) + pDialog.dismiss(); + } + + private String parseURL(String url, Map params) + { + Uri.Builder builder = Uri.parse(url).buildUpon(); + if (params != null) { + for (String key : params.keySet()) { + builder.appendQueryParameter(key, params.get(key)); + } + } + return builder.build().toString(); + } +} diff --git a/app/src/main/java/de/hwr_berlin/it14/postgrachelor/Services/JsonRequestPG.java b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/Services/JsonRequestPG.java new file mode 100644 index 0000000..588d968 --- /dev/null +++ b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/Services/JsonRequestPG.java @@ -0,0 +1,68 @@ +package de.hwr_berlin.it14.postgrachelor.Services; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.ProgressDialog; +import android.content.DialogInterface; + +import org.json.JSONObject; + +import java.util.HashMap; + +/** + * Created by sebastian on 19.03.17. + * Implementation of JsonRequest + */ + +class JsonRequestPG extends JsonRequest { + + private final AsyncResponse delegate; + + interface AsyncResponse { + void processFinish(JSONObject data); + void processError(int status, String message); + } + + JsonRequestPG(String path, HashMap params, Activity activity, AsyncResponse delegate) { + super(path, params, activity); + this.delegate = delegate; + } + + @Override + protected String getConnectionURL() { + return "http://leander.sebse.de/"; + } + + @Override + protected void onPostExecute(JSONObject result) { + super.onPostExecute(result); + if (result == null) { + delegate.processError(-1, "Internal error occurred!"); + return; + } + JSONObject meta = result.optJSONObject("meta"); + if (meta==null) { + delegate.processError(-2, "Invalid JSON: Meta tag not found!"); + return; + } + int status = meta.optInt("status", -3); + String message = meta.optString("message", ""); + if (status != 0) { + new AlertDialog.Builder(this.activity) + .setTitle("Error "+status) + .setMessage(message) + .setNegativeButton(android.R.string.ok, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + // do nothing + } + }) + .setIcon(android.R.drawable.ic_dialog_alert) + .show(); + delegate.processError(status, message); + return; + } + JSONObject data = result.optJSONObject("data"); + delegate.processFinish(data); + } +} diff --git a/app/src/main/java/de/hwr_berlin/it14/postgrachelor/Services/LoginService.java b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/Services/LoginService.java new file mode 100644 index 0000000..e4c417e --- /dev/null +++ b/app/src/main/java/de/hwr_berlin/it14/postgrachelor/Services/LoginService.java @@ -0,0 +1,162 @@ +package de.hwr_berlin.it14.postgrachelor.Services; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.SharedPreferences; +import android.util.Log; + +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.HashMap; + +import de.hwr_berlin.it14.postgrachelor.Exceptions.NotInstantiatedException; + +/** + * Created by sebastian on 25.03.17. + * Login service + */ + +public class LoginService { + private static final String PREFS_NAME = "PrefsLogin"; + private static SharedPreferences settings = null; + private static boolean instantiated = false; + @SuppressLint("StaticFieldLeak") + private static Activity activity = null; + private static ArrayList loginEventListeners = new ArrayList<>(); + + public interface OnLoginEventListener { + void onLoginEvent(String name, String uid); + void onLogoutEvent(int status, String message); + } + + public static void addLoginEventListener(OnLoginEventListener onLoginEventListener) { + loginEventListeners.add(onLoginEventListener); + if (isLoggedInSave()) { + try { + onLoginEventListener.onLoginEvent(getLoginName(), getLoginUID()); + } catch (NotInstantiatedException e) { + e.printStackTrace(); + } + } else { + onLoginEventListener.onLogoutEvent(-6, null); + } + } + + private static void emitLoginEvent(String name, String uid) { + for (OnLoginEventListener listener: loginEventListeners) { + listener.onLoginEvent(name, uid); + } + } + + private static void emitLogoutEvent(int status, String message) { + for (OnLoginEventListener listener: loginEventListeners) { + listener.onLogoutEvent(status, message); + } + } + + public static void instantiate(Activity activity) { + settings = activity.getSharedPreferences(PREFS_NAME, 0); + LoginService.activity = activity; + instantiated = true; + String name = null; + String uid = null; + try { + name = getLoginName(); + uid = getLoginUID(); + } catch (NotInstantiatedException e) { + e.printStackTrace(); + } + if (isLoggedInSave()) { + emitLoginEvent(name, uid); + } else { + emitLogoutEvent(-5, null); + } + } + + public static boolean isLoggedIn() throws NotInstantiatedException { + if (!instantiated) + throw new NotInstantiatedException(); + return settings.getBoolean("isLoggedIn", false); + } + + private static boolean isLoggedInSave() { + try { + return isLoggedIn(); + } catch (NotInstantiatedException e) { + return false; + } + } + + private static String getLoginName() throws NotInstantiatedException { + if (!LoginService.isLoggedIn()) + return ""; + return settings.getString("loginName", ""); + } + + private static String getLoginUID() throws NotInstantiatedException { + if (!LoginService.isLoggedIn()) + return ""; + return settings.getString("loginUID", ""); + } + + private static void setLogin(String name, String uid) throws NotInstantiatedException { + if (!instantiated) + throw new NotInstantiatedException(); + SharedPreferences.Editor editor = settings.edit(); + editor.putString("loginName", name); + editor.putString("loginUID", uid); + editor.putBoolean("isLoggedIn", true); + editor.apply(); + emitLoginEvent(name, uid); + } + + private static void setLogout(int status, String message) throws NotInstantiatedException { + if (!instantiated) + throw new NotInstantiatedException(); + SharedPreferences.Editor editor = settings.edit(); + editor.clear(); + editor.apply(); + emitLogoutEvent(status, message); + } + + private static void setLoginSave(String name, String uid) { + try { + setLogin(name, uid); + } catch (NotInstantiatedException ignored) { + } + } + + private static void setLogoutSave(int status, String message) { + try { + setLogout(status, message); + } catch (NotInstantiatedException ignored) { + } + } + + public static void doLogin(String name) throws NotInstantiatedException { + if (!instantiated) + throw new NotInstantiatedException(); + HashMap params = new HashMap<>(); + params.put("name", name); + JsonRequestPG requester = new JsonRequestPG("register.php", params, activity, new JsonRequestPG.AsyncResponse() { + @Override + public void processFinish(JSONObject output) { + Log.d("Activity fragment", "output"); + Log.d("Activity fragment", output.toString()); + + // never reached if not instantiated + LoginService.setLoginSave(output.optString("name", ""), output.optString("uid", "")); + } + + @Override + public void processError(int status, String message) { + Log.d("Activity fragment", "error"); + Log.d("Activity fragment", "status: "+status+" - message: "+message); + // never reached if not instantiated + LoginService.setLogoutSave(status, message); + } + }); + requester.execute(); + } +} diff --git a/app/src/main/res/drawable/circular_progress_drawable_red.xml b/app/src/main/res/drawable/circular_progress_drawable_red.xml new file mode 100644 index 0000000..406d4c9 --- /dev/null +++ b/app/src/main/res/drawable/circular_progress_drawable_red.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/horizontal_progress_drawable_red.xml b/app/src/main/res/drawable/horizontal_progress_drawable_red.xml new file mode 100644 index 0000000..6e2ac52 --- /dev/null +++ b/app/src/main/res/drawable/horizontal_progress_drawable_red.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_play_arrow.xml b/app/src/main/res/drawable/ic_play_arrow.xml new file mode 100644 index 0000000..663a87d --- /dev/null +++ b/app/src/main/res/drawable/ic_play_arrow.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml index 16733c8..0b3f90d 100644 --- a/app/src/main/res/layout/app_bar_main.xml +++ b/app/src/main/res/layout/app_bar_main.xml @@ -21,7 +21,23 @@ - + + + + + diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml deleted file mode 100644 index 1b9cfae..0000000 --- a/app/src/main/res/layout/content_main.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml new file mode 100644 index 0000000..27d806a --- /dev/null +++ b/app/src/main/res/layout/fragment_login.xml @@ -0,0 +1,53 @@ + + + + + + + + +