Registration process implemented

This commit is contained in:
Caesar2011
2017-03-26 14:43:59 +02:00
parent b9dddacbaa
commit 23073a8841
32 changed files with 1576 additions and 68 deletions

7
.idea/dictionaries/Sebastian.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<component name="ProjectDictionaryState">
<dictionary name="Sebastian">
<words>
<w>postgrachelor</w>
</words>
</dictionary>
</component>

2
.idea/gradle.xml generated
View File

@@ -3,7 +3,7 @@
<component name="GradleSettings"> <component name="GradleSettings">
<option name="linkedExternalProjectsSettings"> <option name="linkedExternalProjectsSettings">
<GradleProjectSettings> <GradleProjectSettings>
<option name="distributionType" value="LOCAL" /> <option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleHome" value="$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1" /> <option name="gradleHome" value="$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1" />
<option name="modules"> <option name="modules">

2
.idea/misc.xml generated
View File

@@ -37,7 +37,7 @@
<ConfirmationsSetting value="0" id="Add" /> <ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" /> <ConfirmationsSetting value="0" id="Remove" />
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8 (2)" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

View File

@@ -24,7 +24,9 @@ dependencies {
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations' exclude group: 'com.android.support', module: 'support-annotations'
}) })
compile 'com.android.support:appcompat-v7:25.2.0' compile 'com.android.support:gridlayout-v7:25.3.0'
compile 'com.android.support:design:25.2.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' testCompile 'junit:junit:4.12'
} }

View File

@@ -2,8 +2,10 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.hwr_berlin.it14.postgrachelor"> package="de.hwr_berlin.it14.postgrachelor">
<uses-permission android:name="android.permission.INTERNET" />
<application <application
android:allowBackup="true" android:allowBackup="false"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:supportsRtl="true" android:supportsRtl="true"
@@ -11,11 +13,14 @@
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:windowSoftInputMode="adjustResize"
android:theme="@style/AppTheme.NoActionBar"> android:theme="@style/AppTheme.NoActionBar">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
<data android:scheme="postgrachelor"
android:host="postgrachelor" />
</intent-filter> </intent-filter>
</activity> </activity>
</application> </application>

View File

@@ -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);
}
}

View File

@@ -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.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
interface OnLoginFragmentInteractionListener {
// TODO: Update argument type and name
void onLoginFragmentInteraction(Uri uri);
}
}

View File

@@ -1,9 +1,11 @@
package de.hwr_berlin.it14.postgrachelor; package de.hwr_berlin.it14.postgrachelor;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.support.design.widget.FloatingActionButton; import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar; import android.util.Log;
import android.view.View;
import android.support.design.widget.NavigationView; import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat; import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.DrawerLayout;
@@ -12,34 +14,109 @@ import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; 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 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 @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Log.d("Activity fragment", "create");
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); /*FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() { fab.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show(); .setAction("Action", null).show();
} }
}); });*/
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle); drawer.addDrawerListener(toggle);
toggle.syncState(); toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this); 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 @Override
@@ -74,28 +151,96 @@ public class MainActivity extends AppCompatActivity
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
@SuppressWarnings("StatementWithEmptyBody")
@Override @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. // 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 // Handle the camera action
} else if (id == R.id.nav_gallery) { LoginFragment fragment = (LoginFragment) myFragmentManager.findFragmentByTag(LoginFragment.NAME);
if (fragment == null) {
} else if (id == R.id.nav_slideshow) { FragmentTransaction fragmentTransaction = myFragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.relative_content, loginFragment, LoginFragment.NAME);
} else if (id == R.id.nav_manage) { fragmentTransaction.commit();
}
} else if (id == R.id.nav_share) { } else if (item == R.id.nav_gallery) {
MainFragment fragment = (MainFragment) myFragmentManager.findFragmentByTag(MainFragment.NAME);
} else if (id == R.id.nav_send) { 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); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
NavigationView navigation = (NavigationView) drawer.findViewById(R.id.nav_view);
drawer.closeDrawer(GravityCompat.START); drawer.closeDrawer(GravityCompat.START);
return true; 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);
}
} }

View File

@@ -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.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
interface OnMainFragmentInteractionListener {
// TODO: Update argument type and name
void onMainFragmentInteraction(Uri uri);
}
}

View File

@@ -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.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
interface OnQuestionEndFragmentInteractionListener {
// TODO: Update argument type and name
void onQuestionEndFragmentInteraction(Uri uri);
}
}

View File

@@ -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.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
interface OnQuestionFragmentInteractionListener {
// TODO: Update argument type and name
void onQuestionFragmentInteraction(Uri uri);
}
}

View File

@@ -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.
* <p>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
interface OnQuestionStartFragmentInteractionListener {
// TODO: Update argument type and name
void onQuestionStartFragmentInteraction(Uri uri);
}
}

View File

@@ -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<Void, Void, JSONObject> {
private final String connectionURL;
protected final String path;
private final HashMap<String, String> params;
protected final Activity activity;
private ProgressDialog pDialog;
JsonRequest(String path, HashMap<String, String> 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<String, String> 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();
}
}

View File

@@ -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<String, String> 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);
}
}

View File

@@ -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<OnLoginEventListener> 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<String, String> 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();
}
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:innerRadiusRatio="7"
android:shape="ring"
android:thickness="10dp" >
<solid android:color="@color/colorPrimaryDark" />
</shape>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
<shape>
<solid android:color="@color/colorPrimary" />
</shape>
</item>
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<solid android:color="@color/colorPrimary" />
</shape>
</clip>
</item>
<item android:id="@android:id/progress">
<clip>
<shape>
<solid android:color="@color/colorPrimaryDark" />
</shape>
</clip>
</item>
</layer-list>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24.0"
android:viewportWidth="24.0">
<path
android:fillColor="#FFFF"
android:pathData="M8 5v14l11-7z" />
</vector>

View File

@@ -21,7 +21,23 @@
</android.support.design.widget.AppBarLayout> </android.support.design.widget.AppBarLayout>
<include layout="@layout/content_main" /> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/relative_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="de.hwr_berlin.it14.postgrachelor.MainActivity"
tools:showIn="@layout/app_bar_main">
</RelativeLayout>
<!--
<android.support.design.widget.FloatingActionButton <android.support.design.widget.FloatingActionButton
android:id="@+id/fab" android:id="@+id/fab"
@@ -29,6 +45,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom|end" android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin" android:layout_margin="@dimen/fab_margin"
app:srcCompat="@android:drawable/ic_dialog_email" /> app:srcCompat="@android:drawable/ic_dialog_email" />-->
</android.support.design.widget.CoordinatorLayout> </android.support.design.widget.CoordinatorLayout>

View File

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="de.hwr_berlin.it14.postgrachelor.MainActivity"
tools:showIn="@layout/app_bar_main">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:scrollbarStyle="outsideOverlay"
tools:context="de.hwr_berlin.it14.postgrachelor.LoginFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingTop="50dp"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="100dp"
android:src="@mipmap/ic_launcher"
android:contentDescription="@string/launcher_icon"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingBottom="40dp"
android:textSize="40sp"
android:text="@string/app_name" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_margin="20dp"
android:text="@string/welcome_text" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:layout_margin="10dp"
android:hint="@string/enter_user_name"
android:id="@+id/login_edit"
android:maxLines="1"
android:inputType="textFilter|textNoSuggestions"
android:background="@android:color/background_light" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/login_btn"
android:text="@string/register_btn"/>
</LinearLayout>
</ScrollView>

View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarStyle="outsideOverlay"
tools:context="de.hwr_berlin.it14.postgrachelor.MainFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include layout="@layout/fragment_main_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fragment_main_status"/>
<android.support.v7.widget.GridLayout
xmlns:grid="http://schemas.android.com/apk/res-auto"
android:id="@+id/choice_grid"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="4dp"
grid:alignmentMode="alignBounds"
grid:columnCount="2"
grid:rowOrderPreserved="false"
grid:useDefaultMargins="true">
<include layout="@layout/fragment_main_category"
android:layout_width="0dp"
android:layout_height="wrap_content"
grid:layout_columnWeight="1"
grid:layout_gravity="fill"
/>
<include layout="@layout/fragment_main_category"
android:layout_width="0dp"
android:layout_height="wrap_content"
grid:layout_columnWeight="1"
grid:layout_gravity="fill"
/>
<include layout="@layout/fragment_main_category"
android:layout_width="0dp"
android:layout_height="wrap_content"
grid:layout_columnWeight="1"
grid:layout_gravity="fill"
/>
<include layout="@layout/fragment_main_category"
android:layout_width="0dp"
android:layout_height="wrap_content"
grid:layout_columnWeight="1"
grid:layout_gravity="fill"
/>
</android.support.v7.widget.GridLayout>
</LinearLayout>
</ScrollView>

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="@layout/fragment_main"
android:layout_width="0dp"
android:layout_height="0dp"
android:gravity="start"
android:background="#FF33B5E6" >
<TextView
android:layout_width="wrap_content"
android:layout_height="100dp"
android:text="@string/hello_blank_fragment" />
<ProgressBar
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:progressDrawable="@drawable/circular_progress_drawable_red"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:paddingTop="10dp"
android:minHeight="70dp"
android:maxWidth="70dp"
android:indeterminate="false"
android:max="100"
android:progress="75"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:paddingTop="10dp"
android:textSize="15sp"
android:textStyle="bold"
android:textColor="@color/colorPrimary"
android:text="@string/_1337"/>
</RelativeLayout>

View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:showIn="@layout/fragment_main"
android:padding="5dp">
<ProgressBar
android:id="@+id/progressBar"
style="@style/Widget.AppCompat.ProgressBar.Horizontal"
android:progressDrawable="@drawable/horizontal_progress_drawable_red"
android:layout_width="match_parent"
android:layout_height="90dp"
android:indeterminate="false"
android:max="100"
android:minHeight="90dp"
android:maxHeight="90dp"
android:progress="20"/>
<TextView
android:id="@+id/fragment_user_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title"
android:textColor="@android:color/white"
android:padding="10dp"
android:text="@string/hello_blank_fragment" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Title"
android:textColor="@android:color/white"
android:padding="20dp"
android:textSize="55sp"
android:text="@string/_1337" />
</RelativeLayout>

View File

@@ -0,0 +1,61 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="de.hwr_berlin.it14.postgrachelor.QuestionFragment">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_margin="20dp"
android:textAppearance="@style/TextAppearance.AppCompat.Title"
android:text="@string/welcome_text" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="245sp"
android:height="75sp"
android:layout_alignParentBottom="true"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:background="@color/colorPrimary"
android:textColor="@android:color/white"
android:text="@string/welcome_text"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="165sp"
android:height="75sp"
android:layout_alignParentBottom="true"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:background="@color/colorPrimary"
android:textColor="@android:color/white"
android:text="@string/welcome_text"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="85sp"
android:height="75sp"
android:layout_alignParentBottom="true"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:background="@color/colorPrimary"
android:textColor="@android:color/white"
android:text="@string/welcome_text"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="5sp"
android:height="75sp"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:layout_alignParentBottom="true"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:background="@color/colorPrimary"
android:textColor="@android:color/white"
android:text="@string/welcome_text"/>
</RelativeLayout>

View File

@@ -0,0 +1,33 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="de.hwr_berlin.it14.postgrachelor.QuestionEndFragment"
android:orientation="vertical"
android:gravity="center">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingBottom="40dp"
android:textSize="40sp"
android:text="@string/test_completed" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingBottom="40dp"
android:textSize="80sp"
android:text="@string/_1337"
android:maxLines="1"
android:textColor="@color/colorPrimaryDark"
android:textStyle="bold"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
android:textColor="@android:color/white"
android:text="@string/return_btn"/>
</LinearLayout>

View File

@@ -0,0 +1,25 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="de.hwr_berlin.it14.postgrachelor.QuestionStartFragment"
android:orientation="vertical"
android:gravity="center">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingBottom="60dp"
android:textSize="40sp"
android:text="@string/start_test" />
<android.support.design.widget.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:scaleX="2"
android:scaleY="2"
android:src="@drawable/ic_play_arrow" />
</LinearLayout>

View File

@@ -17,19 +17,22 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="@dimen/nav_header_vertical_spacing" android:paddingTop="@dimen/nav_header_vertical_spacing"
app:srcCompat="@android:drawable/sym_def_app_icon" /> android:contentDescription="@string/launcher_icon"
app:srcCompat="@mipmap/ic_launcher" />
<TextView <TextView
android:id="@+id/user_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingTop="@dimen/nav_header_vertical_spacing" android:paddingTop="@dimen/nav_header_vertical_spacing"
android:text="Android Studio" android:text="@string/android_studio"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> android:textAppearance="@style/TextAppearance.AppCompat.Body2" />
<TextView <TextView
android:id="@+id/textView" android:id="@+id/user_uid"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="android.studio@android.com" /> android:textSize="12sp"
android:text="@string/android_studio_email" />
</LinearLayout> </LinearLayout>

View File

@@ -1,35 +1,38 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <menu xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single"> <group android:checkableBehavior="single">
<item <item
android:id="@+id/nav_camera" android:id="@+id/nav_camera"
android:icon="@drawable/ic_menu_camera" android:icon="@drawable/ic_menu_camera"
android:title="Import" /> android:title="Login"
tools:ignore="HardcodedText" />
<item <item
android:id="@+id/nav_gallery" android:id="@+id/nav_gallery"
android:icon="@drawable/ic_menu_gallery" android:icon="@drawable/ic_menu_gallery"
android:title="Gallery" /> android:title="Gallery"
tools:ignore="HardcodedText" />
<item <item
android:id="@+id/nav_slideshow" android:id="@+id/nav_slideshow"
android:icon="@drawable/ic_menu_slideshow" android:icon="@drawable/ic_menu_slideshow"
android:title="Slideshow" /> android:title="Slideshow"
tools:ignore="HardcodedText" />
<item <item
android:id="@+id/nav_manage" android:id="@+id/nav_manage"
android:icon="@drawable/ic_menu_manage" android:icon="@drawable/ic_menu_manage"
android:title="Tools" /> android:title="Tools"
tools:ignore="HardcodedText" />
</group> </group>
<item android:title="Communicate"> <item android:title="Communicate"
tools:ignore="HardcodedText">
<menu> <menu>
<item <item
android:id="@+id/nav_share" android:id="@+id/nav_share"
android:icon="@drawable/ic_menu_share" android:icon="@drawable/ic_menu_share"
android:title="Share" /> android:title="Share"
<item tools:ignore="HardcodedText" />
android:id="@+id/nav_send"
android:icon="@drawable/ic_menu_send"
android:title="Send" />
</menu> </menu>
</item> </item>

View File

@@ -5,4 +5,18 @@
<string name="navigation_drawer_close">Close navigation drawer</string> <string name="navigation_drawer_close">Close navigation drawer</string>
<string name="action_settings">Settings</string> <string name="action_settings">Settings</string>
<string name="enter_user_name">Enter User Name…</string>
<string name="hello_blank_fragment">Hello blank fragment</string>
<string name="hello_login_fragment">Hello login fragment</string>
<string name="welcome_text">Welcome to our stupid app. Prove that you are smarter than we are and answer our questions!</string>
<string name="register_btn">Register</string>
<string name="start_test">Start Test!</string>
<string name="test_completed">Test completed!</string>
<string name="_1337">1337</string>
<string name="return_btn">Return</string>
<string name="launcher_icon">Launcher Icon</string>
<string name="android_studio">Android Studio</string>
<string name="android_studio_email">android.studio@android.com</string>
</resources> </resources>

View File

@@ -5,7 +5,7 @@ buildscript {
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.android.tools.build:gradle:2.3.0'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files

View File

@@ -1,6 +1,6 @@
#Mon Dec 28 10:00:20 PST 2015 #Fri Mar 03 08:16:04 CET 2017
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip