diff --git a/.idea/misc.xml b/.idea/misc.xml index a78c257..99202cc 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,34 +1,34 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/de/overview/wg/its/mispauth/activity/SyncActivity.java b/app/src/main/java/de/overview/wg/its/mispauth/activity/SyncActivity.java index 71e294a..72e7308 100644 --- a/app/src/main/java/de/overview/wg/its/mispauth/activity/SyncActivity.java +++ b/app/src/main/java/de/overview/wg/its/mispauth/activity/SyncActivity.java @@ -1,45 +1,136 @@ package de.overview.wg.its.mispauth.activity; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentStatePagerAdapter; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; import com.android.volley.VolleyError; import de.overview.wg.its.mispauth.R; import de.overview.wg.its.mispauth.auxiliary.PreferenceManager; +import de.overview.wg.its.mispauth.fragment.ScanQrFragment; +import de.overview.wg.its.mispauth.fragment.ShowQrFragment; +import de.overview.wg.its.mispauth.fragment.SyncStartFragment; +import de.overview.wg.its.mispauth.fragment.UploadFragment; import de.overview.wg.its.mispauth.model.Organisation; import de.overview.wg.its.mispauth.network.MispRequest; -import org.json.JSONObject; +import de.overview.wg.its.mispauth.custom_viewpager.ExtendedViewPager; +import org.json.JSONArray; public class SyncActivity extends AppCompatActivity { private PreferenceManager preferenceManager; + private static final int PAGE_COUNT = 3; + private ExtendedViewPager viewPager; + private PagerAdapter pagerAdapter; + private LinearLayout bottomLayout; + + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sync); preferenceManager = PreferenceManager.Instance(this); - uploadOrganisation(preferenceManager.getMyOrganisation()); + + setupViewPager(); + } + + private void setupViewPager() { + bottomLayout = findViewById(R.id.linearLayout); + + pagerAdapter = new SimplePagerAdapter(getSupportFragmentManager()); + + viewPager = findViewById(R.id.viewPager); + viewPager.setPagingEnabled(false); + viewPager.setAdapter(pagerAdapter); + + viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { + + @Override + public void onPageSelected(int position) { + if (position == 0) { + bottomLayout.setVisibility(View.GONE); + } else { + bottomLayout.setVisibility(View.VISIBLE); + } + } + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + // SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING + @Override + public void onPageScrollStateChanged(int state) { + + } + }); + + Button next = findViewById(R.id.nextButton); + Button back = findViewById(R.id.backButton); + + next.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + viewPager.setCurrentItem(viewPager.getCurrentItem() + 1, true); + } + }); + + back.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + viewPager.setCurrentItem(viewPager.getCurrentItem() - 1, true); + } + }); + } + + private class SimplePagerAdapter extends FragmentStatePagerAdapter { + + public SimplePagerAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public Fragment getItem(int position) { + + switch (position) { + case 0: + return new SyncStartFragment(); // start fragment + + case 1: + return new ScanQrFragment(); // scan fragment + + case 2: + return new ShowQrFragment(); // show QR fragment + + case 3: + return new UploadFragment(); // show upload fragment + + default: + return null; // This should not be happening + } + } + + @Override + public int getCount() { + return PAGE_COUNT; + } } private void uploadOrganisation(Organisation org) { MispRequest mispRequest = MispRequest.Instance(this); -// mispRequest.addOrganisation(org, new MispRequest.OrganisationCallback() { -// @Override -// public void onResult(JSONObject organisationInformation) { -// -// } -// -// @Override -// public void onError(VolleyError volleyError) { -// -// } -// }); - - mispRequest.getServers(new MispRequest.ServerCallback() { + mispRequest.getOrganisations(new MispRequest.OrganisationsCallback() { @Override - public void onResult(JSONObject servers) { + public void onResult(JSONArray organisations) { } diff --git a/app/src/main/java/de/overview/wg/its/mispauth/custom_viewpager/ExtendedViewPager.java b/app/src/main/java/de/overview/wg/its/mispauth/custom_viewpager/ExtendedViewPager.java new file mode 100644 index 0000000..4467f81 --- /dev/null +++ b/app/src/main/java/de/overview/wg/its/mispauth/custom_viewpager/ExtendedViewPager.java @@ -0,0 +1,38 @@ +package de.overview.wg.its.mispauth.custom_viewpager; + +import android.content.Context; +import android.support.v4.view.ViewPager; +import android.util.AttributeSet; +import android.view.MotionEvent; + +public class ExtendedViewPager extends ViewPager { + + private boolean enabled; + + public ExtendedViewPager(Context context, AttributeSet attrs) { + super(context, attrs); + this.enabled = true; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if (this.enabled) { + return super.onTouchEvent(event); + } + + return false; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent event) { + if (this.enabled) { + return super.onInterceptTouchEvent(event); + } + + return false; + } + + public void setPagingEnabled(boolean enabled) { + this.enabled = enabled; + } +} diff --git a/app/src/main/java/de/overview/wg/its/mispauth/fragment/ScanQrFragment.java b/app/src/main/java/de/overview/wg/its/mispauth/fragment/ScanQrFragment.java new file mode 100644 index 0000000..a4265ff --- /dev/null +++ b/app/src/main/java/de/overview/wg/its/mispauth/fragment/ScanQrFragment.java @@ -0,0 +1,17 @@ +package de.overview.wg.its.mispauth.fragment; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import de.overview.wg.its.mispauth.R; + +public class ScanQrFragment extends Fragment { + + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.fragment_sync_scan, null); + return v; + } + +} diff --git a/app/src/main/java/de/overview/wg/its/mispauth/fragment/ShowQrFragment.java b/app/src/main/java/de/overview/wg/its/mispauth/fragment/ShowQrFragment.java new file mode 100644 index 0000000..d905921 --- /dev/null +++ b/app/src/main/java/de/overview/wg/its/mispauth/fragment/ShowQrFragment.java @@ -0,0 +1,27 @@ +package de.overview.wg.its.mispauth.fragment; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import de.overview.wg.its.mispauth.R; +import net.glxn.qrgen.android.QRCode; + +public class ShowQrFragment extends Fragment { + + private ImageView qrImageView; + + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.fragment_sync_show, null); + + qrImageView = v.findViewById(R.id.image_view_qr); + setQr("Hallo hier steht leide nur scheiße, aber ansonsten hat alles geklappt! (Y)"); + return v; + } + + public void setQr(String msg) { + qrImageView.setImageBitmap(QRCode.from(msg).bitmap()); + } +} diff --git a/app/src/main/java/de/overview/wg/its/mispauth/fragment/SyncStartFragment.java b/app/src/main/java/de/overview/wg/its/mispauth/fragment/SyncStartFragment.java new file mode 100644 index 0000000..8a81c35 --- /dev/null +++ b/app/src/main/java/de/overview/wg/its/mispauth/fragment/SyncStartFragment.java @@ -0,0 +1,17 @@ +package de.overview.wg.its.mispauth.fragment; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import de.overview.wg.its.mispauth.R; + +public class SyncStartFragment extends Fragment { + + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.fragment_sync_start, null); + return v; + } + +} diff --git a/app/src/main/java/de/overview/wg/its/mispauth/fragment/UploadFragment.java b/app/src/main/java/de/overview/wg/its/mispauth/fragment/UploadFragment.java new file mode 100644 index 0000000..f30e64d --- /dev/null +++ b/app/src/main/java/de/overview/wg/its/mispauth/fragment/UploadFragment.java @@ -0,0 +1,17 @@ +package de.overview.wg.its.mispauth.fragment; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import de.overview.wg.its.mispauth.R; + +public class UploadFragment extends Fragment { + + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.fragment_sync_upload, null); + return v; + } + +} diff --git a/app/src/main/java/de/overview/wg/its/mispauth/network/JsonArrayRequestWithJsonObject.java b/app/src/main/java/de/overview/wg/its/mispauth/network/JsonArrayRequestWithJsonObject.java new file mode 100644 index 0000000..0afaa09 --- /dev/null +++ b/app/src/main/java/de/overview/wg/its/mispauth/network/JsonArrayRequestWithJsonObject.java @@ -0,0 +1,42 @@ +package de.overview.wg.its.mispauth.network; + +import com.android.volley.NetworkResponse; +import com.android.volley.ParseError; +import com.android.volley.Response; +import com.android.volley.toolbox.HttpHeaderParser; +import com.android.volley.toolbox.JsonRequest; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.UnsupportedEncodingException; + +public class JsonArrayRequestWithJsonObject extends JsonRequest { + /** + * Creates a new request. + * @param method the HTTP method to use + * @param url URL to fetch the JSON from + * @param jsonRequest A {@link JSONObject} to post with the request. Null is allowed and + * indicates no parameters will be posted along with request. + * @param listener Listener to receive the JSON response + * @param errorListener Error listener, or null to ignore errors. + */ + + public JsonArrayRequestWithJsonObject(int method, String url, JSONObject jsonRequest, Response.Listener listener, Response.ErrorListener errorListener) { + super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener, errorListener); + } + + @Override + protected Response parseNetworkResponse(NetworkResponse response) { + try { + + String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET)); + return Response.success(new JSONArray(jsonString), HttpHeaderParser.parseCacheHeaders(response)); + + } catch (UnsupportedEncodingException | JSONException e) { + + return Response.error(new ParseError(e)); + + } + } +} diff --git a/app/src/main/java/de/overview/wg/its/mispauth/network/MispRequest.java b/app/src/main/java/de/overview/wg/its/mispauth/network/MispRequest.java index 37551d1..81c4a5b 100644 --- a/app/src/main/java/de/overview/wg/its/mispauth/network/MispRequest.java +++ b/app/src/main/java/de/overview/wg/its/mispauth/network/MispRequest.java @@ -7,11 +7,13 @@ import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; +import com.android.volley.toolbox.JsonArrayRequest; import com.android.volley.toolbox.JsonObjectRequest; import com.android.volley.toolbox.Volley; import de.overview.wg.its.mispauth.auxiliary.PreferenceManager; import de.overview.wg.its.mispauth.auxiliary.ReadableError; import de.overview.wg.its.mispauth.model.Organisation; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -163,11 +165,25 @@ public class MispRequest { requestQueue.add(r); } - public void getServers(ServerCallback callback) { - Response.Listener listener = new Response.Listener() { + public void getOrganisations(final OrganisationsCallback callback) { + Response.Listener listener = new Response.Listener() { @Override - public void onResponse(JSONObject response) { - Log.d(TAG, "onResponse: " + response.toString()); + public void onResponse(JSONArray response) { + + JSONArray resultArray = new JSONArray(); + + int orgCount = response.length(); + + for(int i = 0; i < orgCount; i++) { + try { + resultArray.put(response.getJSONObject(i).getJSONObject("Organisation")); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + callback.onResult(resultArray); + Log.d(TAG, "onResponse: " + resultArray.toString()); } }; @@ -178,9 +194,9 @@ public class MispRequest { } }; - Request r = objectRequest( + Request r = arrayRequestWithJsonObject( Request.Method.GET, - serverUrl + "/servers/view/", + serverUrl + "/organisations/index", null, listener, errorListener); @@ -188,15 +204,12 @@ public class MispRequest { requestQueue.add(r); } + private JsonArrayRequestWithJsonObject arrayRequestWithJsonObject(int method, String url, + @Nullable JSONObject body, + Response.Listener listener, + Response.ErrorListener errorListener) { - private JsonObjectRequest objectRequest(int method, - String url, - @Nullable JSONObject body, - Response.Listener listener, - Response.ErrorListener errorListener) { - - return new JsonObjectRequest(method, url, body, listener, errorListener) { - + return new JsonArrayRequestWithJsonObject(method, url, body, listener, errorListener) { @Override public Map getHeaders() { Map params = new HashMap<>(); @@ -207,10 +220,27 @@ public class MispRequest { return params; } - }; } + private JsonObjectRequest objectRequest(int method, String url, + @Nullable JSONObject body, + Response.Listener listener, + Response.ErrorListener errorListener) { + + return new JsonObjectRequest(method, url, body, listener, errorListener) { + @Override + public Map getHeaders() { + Map params = new HashMap<>(); + + params.put("Authorization", apiKey); + params.put("Accept", "application/json"); + params.put("Content-Type", "application/json; utf-8"); + + return params; + } + }; + } public void setServerCredentials(String serverUrl, String apiKey) { this.serverUrl = serverUrl; @@ -225,15 +255,12 @@ public class MispRequest { return instance; } - - public interface IntegerCallback { - void onResult(int result); - + public interface OrganisationsCallback { + void onResult(JSONArray organisations); void onError(VolleyError volleyError); } public interface OrganisationCallback { void onResult(JSONObject organisationInformation); - void onError(VolleyError volleyError); } public interface UserCallback { diff --git a/app/src/main/res/drawable/ic_sync_alpha.xml b/app/src/main/res/drawable/ic_sync_alpha.xml new file mode 100644 index 0000000..65dac7d --- /dev/null +++ b/app/src/main/res/drawable/ic_sync_alpha.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/test_image.jpg b/app/src/main/res/drawable/test_image.jpg deleted file mode 100644 index 22c1196..0000000 Binary files a/app/src/main/res/drawable/test_image.jpg and /dev/null differ diff --git a/app/src/main/res/drawable/test_image_1.jpg b/app/src/main/res/drawable/test_image_1.jpg deleted file mode 100644 index 84f38c3..0000000 Binary files a/app/src/main/res/drawable/test_image_1.jpg and /dev/null differ diff --git a/app/src/main/res/drawable/test_image_2.jpg b/app/src/main/res/drawable/test_image_2.jpg deleted file mode 100755 index 7c91d8d..0000000 Binary files a/app/src/main/res/drawable/test_image_2.jpg and /dev/null differ diff --git a/app/src/main/res/drawable/test_image_low_res.jpg b/app/src/main/res/drawable/test_image_low_res.jpg deleted file mode 100644 index 4b7e275..0000000 Binary files a/app/src/main/res/drawable/test_image_low_res.jpg and /dev/null differ diff --git a/app/src/main/res/drawable/test_image_no_meta.jpg b/app/src/main/res/drawable/test_image_no_meta.jpg deleted file mode 100644 index a4e46d0..0000000 Binary files a/app/src/main/res/drawable/test_image_no_meta.jpg and /dev/null differ diff --git a/app/src/main/res/layout/activity_sync.xml b/app/src/main/res/layout/activity_sync.xml index 069dd4a..f54358c 100644 --- a/app/src/main/res/layout/activity_sync.xml +++ b/app/src/main/res/layout/activity_sync.xml @@ -1,270 +1,76 @@ + tools:context=".activity.SyncActivity" + android:background="@color/colorPrimary"> - + - + - + - + - + - - + - - +