diff --git a/app/build.gradle b/app/build.gradle index f739be0..a333d4f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,11 +30,19 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' - implementation 'com.google.code.gson:gson:2.8.2' - implementation 'com.squareup.retrofit2:retrofit:2.3.0' - implementation 'com.squareup.retrofit2:converter-gson:2.3.0' + implementation 'com.google.code.gson:gson:2.8.5' + implementation 'com.squareup.retrofit2:retrofit:2.4.0' + implementation 'com.squareup.retrofit2:converter-gson:2.4.0' implementation "io.swagger:swagger-annotations:1.5.15" implementation "org.threeten:threetenbp:1.3.5" - implementation "com.squareup.okhttp3:logging-interceptor:3.10.0" implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:6.4.0' + implementation 'io.reactivex.rxjava2:rxjava:2.2.0' + implementation 'com.android.support:recyclerview-v7:27.1.1' + implementation 'io.reactivex.rxjava2:rxandroid:2.1.0' + implementation "com.jakewharton:butterknife:8.8.1" + annotationProcessor "com.jakewharton:butterknife-compiler:8.8.1" + implementation "com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0" + implementation "com.squareup.okhttp3:okhttp:3.11.0" + implementation "com.squareup.okhttp3:okhttp-urlconnection:3.10.0" + implementation "com.squareup.okhttp3:logging-interceptor:3.11.0" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0192f05..55a5adf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,7 +8,8 @@ - + + () { + @Override + public void onSuccess(JwtToken jwtToken) { + PrefUtils.storeApiKey(getApplicationContext(), jwtToken.getToken()); + onPostExecute(true); + } - Log.e("Login", "jwt token: " + user); + @Override + public void onError(Throwable e) { + Log.e("LoginError", "onError: " + e.getMessage()); + } + })); + return true; - try { - Response loginResponse = service.fakeValidate(user).execute(); - Log.e("Login", "jwt token: " + loginResponse.body()); - if (loginResponse.isSuccessful()) { - String authToken = loginResponse.body().getToken(); - Log.e("Login", "jwt token: " + authToken); - - SharedPreferences sharedPref = getSharedPreferences("fmtPrefs", Context.MODE_PRIVATE); - sharedPref.edit().putString("authToken", authToken).putBoolean("loggedIn", true).apply(); - - return true; - } - - } catch (Exception e) { - Log.e("Login error", "Something went wrong while logging in..."); - return false; - } - - return false; } @Override @@ -361,6 +365,7 @@ public class LoginActivity extends AppCompatActivity implements LoaderCallbacks< mPasswordView.setError(getString(R.string.error_incorrect_password)); mPasswordView.requestFocus(); } + } @Override diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/MainActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/MainActivity.java index b379007..e2c9158 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/MainActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/MainActivity.java @@ -6,24 +6,17 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.v7.app.AppCompatActivity; -import android.util.Log; import android.view.View; -import android.widget.Button; -import android.widget.Toast; import com.mapbox.mapboxsdk.Mapbox; import com.mapbox.mapboxsdk.maps.MapView; import com.uam.wmi.findmytutor.R; import com.uam.wmi.findmytutor.model.Coordinate; -import com.uam.wmi.findmytutor.network.RetrofitClientInstance; -import com.uam.wmi.findmytutor.service.Coordinates; +import com.uam.wmi.findmytutor.network.ApiClient; +import com.uam.wmi.findmytutor.service.CoordinateService; import java.util.List; -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; - public class MainActivity extends AppCompatActivity { private MapView mapView; @@ -62,46 +55,10 @@ public class MainActivity extends AppCompatActivity { mapView = (MapView) findViewById(R.id.mapView); mapView.onCreate(savedInstanceState); - final SharedPreferences sharedPref = getSharedPreferences("fmtPrefs", Context.MODE_PRIVATE); - final String authToken = sharedPref.getString("authToken",null); - - Coordinates service = RetrofitClientInstance.createService(Coordinates.class,authToken); - - Call> call = service.getOnlineCoordinates(); + CoordinateService service = ApiClient.getClient(getApplicationContext()) + .create(CoordinateService.class); - call.enqueue(new Callback>() { - @Override - public void onResponse(Call> call, Response> response) { - Log.e("MainActivity", "rsp: " + response.body()); - - setCoordinates(response.body()); - - - /* mapView.getMapAsync(new OnMapReadyCallback() { - @Override - public void onMapReady(MapboxMap mapboxMap,List response) { - - // Add the custom icon marker to the map - for(Coordinate coord: response.body()){ - mapboxMap.addMarker(new MarkerOptions() - .position(new LatLng(coord.getLatitude(), coord.getLongitude())) - - } - - } - });*/ - } - - @Override - public void onFailure(Call> call, Throwable t) { - Toast.makeText(MainActivity.this, "Something went wrong...Error message: " + t.getMessage(), Toast.LENGTH_SHORT).show(); - } - - - - - }); } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/BaseResponse.java b/app/src/main/java/com/uam/wmi/findmytutor/model/BaseResponse.java new file mode 100644 index 0000000..21b73c1 --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/BaseResponse.java @@ -0,0 +1,9 @@ +package com.uam.wmi.findmytutor.model; + +public class BaseResponse { + String error; + + public String getError() { + return error; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/Coordinate.java b/app/src/main/java/com/uam/wmi/findmytutor/model/Coordinate.java index 017b640..95e9b59 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/Coordinate.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/Coordinate.java @@ -11,7 +11,7 @@ import io.swagger.annotations.ApiModelProperty; * Coordinate */ -public class Coordinate { +public class Coordinate extends BaseResponse{ @SerializedName("coordinateId") private UUID coordinateId = null; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHour.java b/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHour.java index a2d0fe3..46cbdb3 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHour.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/DutyHour.java @@ -11,7 +11,7 @@ import io.swagger.annotations.ApiModelProperty; * DutyHour */ -public class DutyHour { +public class DutyHour extends BaseResponse { @SerializedName("dutyHourId") private UUID dutyHourId = null; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/IsUsingListBool.java b/app/src/main/java/com/uam/wmi/findmytutor/model/IsUsingListBool.java index e11d6ac..36e0345 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/IsUsingListBool.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/IsUsingListBool.java @@ -3,7 +3,7 @@ package com.uam.wmi.findmytutor.model; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; -public class IsUsingListBool { +public class IsUsingListBool extends BaseResponse{ @SerializedName("isUsing") @Expose diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/IsUsingListBoolModel.java b/app/src/main/java/com/uam/wmi/findmytutor/model/IsUsingListBoolModel.java index 511e578..fd29619 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/IsUsingListBoolModel.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/IsUsingListBoolModel.java @@ -10,7 +10,7 @@ import io.swagger.annotations.ApiModelProperty; * IsUsingListBoolModel */ -public class IsUsingListBoolModel { +public class IsUsingListBoolModel extends BaseResponse { @SerializedName("isUsing") private Boolean isUsing = null; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/LdapUser.java b/app/src/main/java/com/uam/wmi/findmytutor/model/LdapUser.java index 22a640b..b57c702 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/LdapUser.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/LdapUser.java @@ -11,7 +11,7 @@ import io.swagger.annotations.ApiModelProperty; * LdapUser */ -public class LdapUser { +public class LdapUser extends BaseResponse{ @SerializedName("login") private String login = null; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/Model.java b/app/src/main/java/com/uam/wmi/findmytutor/model/Model.java new file mode 100644 index 0000000..3b5ee47 --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/Model.java @@ -0,0 +1,16 @@ +package com.uam.wmi.findmytutor.model; + + +import com.google.gson.annotations.SerializedName; + +public class Model +{ + @SerializedName("data") + private PagedResult data; + + public PagedResult getData () + { + return data; + } + +} diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/PagedResult.java b/app/src/main/java/com/uam/wmi/findmytutor/model/PagedResult.java index 9e7ad33..db05386 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/PagedResult.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/PagedResult.java @@ -1,14 +1,15 @@ package com.uam.wmi.findmytutor.model; -import java.util.List; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; -public class PagedResult { +import java.util.List; + +public class PagedResult { @SerializedName("results") @Expose - private List results = null; + private List results = null; @SerializedName("currentPage") @Expose private Integer currentPage; @@ -28,11 +29,11 @@ public class PagedResult { @Expose private Integer lastRowOnPage; - public List getResults() { + public List getResults() { return results; } - public void setResults(List results) { + public void setResults(List results) { this.results = results; } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/PagedResultUserResponseModel.java b/app/src/main/java/com/uam/wmi/findmytutor/model/PagedResultUserResponseModel.java index 1898ce7..0e16bb2 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/PagedResultUserResponseModel.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/PagedResultUserResponseModel.java @@ -12,7 +12,7 @@ import io.swagger.annotations.ApiModelProperty; * PagedResultUserResponseModel */ -public class PagedResultUserResponseModel { +public class PagedResultUserResponseModel extends BaseResponse { @SerializedName("results") private List results = null; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/Result.java b/app/src/main/java/com/uam/wmi/findmytutor/model/Result.java index 6fc4336..1e4f111 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/Result.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/Result.java @@ -1,9 +1,10 @@ package com.uam.wmi.findmytutor.model; -import java.util.List; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; -public class Result { +import java.util.List; + +public class Result extends BaseResponse { @SerializedName("id") @Expose diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/StudentIdModel.java b/app/src/main/java/com/uam/wmi/findmytutor/model/StudentIdModel.java index 33c8880..3eea407 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/StudentIdModel.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/StudentIdModel.java @@ -11,7 +11,7 @@ import io.swagger.annotations.ApiModelProperty; * StudentIdModel */ -public class StudentIdModel { +public class StudentIdModel extends BaseResponse{ @SerializedName("studentId") private String studentId = null; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/TutorTab.java b/app/src/main/java/com/uam/wmi/findmytutor/model/TutorTab.java index 96d1332..62916f1 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/TutorTab.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/TutorTab.java @@ -15,7 +15,7 @@ import io.swagger.annotations.ApiModelProperty; * TutorTab */ -public class TutorTab { +public class TutorTab extends BaseResponse{ @SerializedName("tutorTabId") private UUID tutorTabId = null; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/User.java b/app/src/main/java/com/uam/wmi/findmytutor/model/User.java index 3e7f9cc..f16add4 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/User.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/User.java @@ -15,7 +15,7 @@ import io.swagger.annotations.ApiModelProperty; * User */ -public class User { +public class User extends BaseResponse{ @SerializedName("isOnline") private Boolean isOnline = null; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/model/UserResponseModel.java b/app/src/main/java/com/uam/wmi/findmytutor/model/UserResponseModel.java index cef0da8..c927500 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/model/UserResponseModel.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/model/UserResponseModel.java @@ -12,7 +12,7 @@ import io.swagger.annotations.ApiModelProperty; * UserResponseModel */ -public class UserResponseModel { +public class UserResponseModel extends BaseResponse{ @SerializedName("id") private String id = null; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/network/ApiClient.java b/app/src/main/java/com/uam/wmi/findmytutor/network/ApiClient.java new file mode 100644 index 0000000..008a6cc --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/network/ApiClient.java @@ -0,0 +1,75 @@ +package com.uam.wmi.findmytutor.network; + +import android.content.Context; +import android.text.TextUtils; + +import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; +import com.uam.wmi.findmytutor.utils.PrefUtils; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import okhttp3.Interceptor; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + + +public class ApiClient { + private static Retrofit retrofit = null; + private static int REQUEST_TIMEOUT = 60; + private static OkHttpClient okHttpClient; + private static final String BASE_URL = "https://s416084.projektstudencki.pl/develop/"; + + public static Retrofit getClient(Context context) { + + if (okHttpClient == null) + initOkHttp(context); + + if (retrofit == null) { + retrofit = new Retrofit.Builder() + .baseUrl(BASE_URL) + .client(okHttpClient) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + } + return retrofit; + } + + private static void initOkHttp(final Context context) { + OkHttpClient.Builder httpClient = new OkHttpClient().newBuilder() + .connectTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS) + .readTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS) + .writeTimeout(REQUEST_TIMEOUT, TimeUnit.SECONDS); + + HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); + interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + + httpClient.addInterceptor(interceptor); + + httpClient.addInterceptor(new Interceptor() { + @Override + public Response intercept(Chain chain) throws IOException { + Request original = chain.request(); + Request.Builder requestBuilder = original.newBuilder() + .addHeader("Accept", "application/json") + .addHeader("Content-Type", "application/json"); + + // Adding Authorization token (API Key) + // Requests will be denied without API key + if (!TextUtils.isEmpty(PrefUtils.getApiKey(context))) { + requestBuilder.addHeader("Authorization", PrefUtils.getApiKey(context)); + } + + Request request = requestBuilder.build(); + return chain.proceed(request); + } + }); + + okHttpClient = httpClient.build(); + } + }; diff --git a/app/src/main/java/com/uam/wmi/findmytutor/network/RetrofitClientInstance.java b/app/src/main/java/com/uam/wmi/findmytutor/network/RetrofitClientInstance.java deleted file mode 100644 index 77db473..0000000 --- a/app/src/main/java/com/uam/wmi/findmytutor/network/RetrofitClientInstance.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.uam.wmi.findmytutor.network; - -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.logging.HttpLoggingInterceptor; -import retrofit2.Retrofit; -import retrofit2.converter.gson.GsonConverterFactory; - -public class RetrofitClientInstance { - - private static final String BASE_URL = "https://s416084.projektstudencki.pl/develop/"; - - private static Retrofit.Builder builder - = new Retrofit.Builder() - .baseUrl(BASE_URL) - .addConverterFactory(GsonConverterFactory.create()); - - private static Retrofit retrofit = builder.build(); - - private static OkHttpClient.Builder httpClient - = new OkHttpClient.Builder(); - - private static HttpLoggingInterceptor logging - = new HttpLoggingInterceptor() - .setLevel(HttpLoggingInterceptor.Level.BASIC); - - public static S createService(Class serviceClass) { - if (!httpClient.interceptors().contains(logging)) { - httpClient.addInterceptor(logging); - builder.client(httpClient.build()); - retrofit = builder.build(); - } - return retrofit.create(serviceClass); - } - - public static S createService(Class serviceClass, final String token) { - if (token != null) { - httpClient.interceptors().clear(); - httpClient.addInterceptor(chain -> { - Request original = chain.request(); - Request.Builder builder1 = original.newBuilder() - .header("Authorization", "Bearer " + token); - Request request = builder1.build(); - return chain.proceed(request); - }); - builder.client(httpClient.build()); - retrofit = builder.build(); - } - return retrofit.create(serviceClass); - } -} diff --git a/app/src/main/java/com/uam/wmi/findmytutor/service/Coordinates.java b/app/src/main/java/com/uam/wmi/findmytutor/service/CoordinateService.java similarity index 97% rename from app/src/main/java/com/uam/wmi/findmytutor/service/Coordinates.java rename to app/src/main/java/com/uam/wmi/findmytutor/service/CoordinateService.java index 088cd3c..877bec2 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/service/Coordinates.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/service/CoordinateService.java @@ -13,7 +13,7 @@ import retrofit2.http.POST; import retrofit2.http.PUT; import retrofit2.http.Path; -public interface Coordinates { +public interface CoordinateService { @GET("api/coordinates") Call> getAllCoordinates(); diff --git a/app/src/main/java/com/uam/wmi/findmytutor/service/LdapService.java b/app/src/main/java/com/uam/wmi/findmytutor/service/LdapService.java index 3583d2a..bb262f5 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/service/LdapService.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/service/LdapService.java @@ -3,7 +3,7 @@ package com.uam.wmi.findmytutor.service; import com.uam.wmi.findmytutor.model.JwtToken; import com.uam.wmi.findmytutor.model.LdapUser; -import retrofit2.Call; +import io.reactivex.Single; import retrofit2.http.Body; import retrofit2.http.GET; import retrofit2.http.POST; @@ -12,15 +12,15 @@ import retrofit2.http.Path; public interface LdapService { @POST("api/ldap/fakeValidate") - Call fakeValidate(@Body LdapUser user); + Single fakeValidate(@Body LdapUser user); @POST("api/ldap/validate") - Call validate(@Body LdapUser user); + Single validate(@Body LdapUser user); @GET("api/ldap/getUserData/{login}") - Call getUserDataByLogin(@Path("login") String userLogin); + Single getUserDataByLogin(@Path("login") String userLogin); @GET("api/ldap/getUserData/email/{email}") - Call getUserDataByMail(@Path("email") String userMail); + Single getUserDataByMail(@Path("email") String userMail); } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/service/UserService.java b/app/src/main/java/com/uam/wmi/findmytutor/service/UserService.java index 0df22c1..a0dbea3 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/service/UserService.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/service/UserService.java @@ -1,77 +1,77 @@ package com.uam.wmi.findmytutor.service; -import com.uam.wmi.findmytutor.model.JwtToken; -import com.uam.wmi.findmytutor.model.PagedResult; -import com.uam.wmi.findmytutor.model.User; + import com.uam.wmi.findmytutor.model.IsUsingListBool; +import com.uam.wmi.findmytutor.model.PagedResult; import com.uam.wmi.findmytutor.model.StudentIdModel; +import com.uam.wmi.findmytutor.model.User; + import java.util.List; -import okhttp3.ResponseBody; -import retrofit2.Call; +import io.reactivex.Completable; +import io.reactivex.Single; import retrofit2.http.Body; import retrofit2.http.DELETE; import retrofit2.http.GET; -import retrofit2.http.PUT; import retrofit2.http.POST; +import retrofit2.http.PUT; import retrofit2.http.Path; -import retrofit2.http.Header; public interface UserService { @GET("api/users") - Call> getAllUsers(); + Single > getAllUsers(); @POST("api/users") - Call createUser(@Body User user); + Completable createUser(@Body User user); @GET("api/users/page/{pageNum}") - Call getPagedUsers(@Path("pageNum") String pageNum ); + Single getPagedUsers(@Path("pageNum") String pageNum ); - @GET("/api/users/tutors/page/{pageNum}") - Call getPagedTutors(@Path("pageNum") String pageNum); + @GET("api/users/tutors/page/{pageNum}") + Single getPagedTutors(@Path("pageNum") String pageNum); - @GET("/api/users/students/page/{pageNum}") - Call getPagedStudents(@Path("pageNum") String pageNum); + @GET("api/users/students/page/{pageNum}") + Single getPagedStudents(@Path("pageNum") String pageNum); @GET("api/users/{id}") - Call getUserByID(@Path("id") String userID); + Single getUserByID(@Path("id") String userID); @PUT("api/users/{id}") - Call updateUserByID(@Path("id") String userID, @Body User user); + Completable updateUserByID(@Path("id") String userID, @Body User user); @DELETE("api/users/{id}") - Call deleteUserByID(@Path("id") String userID); + Completable deleteUserByID(@Path("id") String userID); @GET("api/users/userLogin/{ldapLogin}") - Call getUserLdapLogin(@Path("ldapLogin") String ldapLogin); + Single getUserLdapLogin(@Path("ldapLogin") String ldapLogin); @PUT("api/users/setActive/{userID}") - Call setUserActive(@Path("userID") String userID); + Completable setUserActive(@Path("userID") String userID); @PUT("api/users/setInActive/{userID}") - Call setUserInActive(@Path("userID") String userID); + Completable setUserInActive(@Path("userID") String userID); @GET("api/users/blacklist/{tutorID}") - Call> getTutorBlacklistedByID(@Path("tutorID") String tutorID); + Single> getTutorBlacklistedByID(@Path("tutorID") String tutorID); @PUT("api/users/blacklist/{tutorID}") - Call setTutorBlacklist(@Path("tutorID") String tutorID, @Body IsUsingListBool isUsing); + Completable setTutorBlacklist(@Path("tutorID") String tutorID, @Body IsUsingListBool isUsing); @POST("api/users/blacklist/{tutorID}") - Call addStudentToBlacklist(@Path("tutorID") String tutorID, @Body StudentIdModel student); + Completable addStudentToBlacklist(@Path("tutorID") String tutorID, @Body StudentIdModel student); @DELETE("api/users/blacklist/{tutorID}") - Call> removeStudentFromBlacklist(@Path("tutorID") String tutorID, @Body StudentIdModel student); + Completable removeStudentFromBlacklist(@Path("tutorID") String tutorID, @Body StudentIdModel student); @GET("api/users/whitelist/{tutorID}") - Call> getTutorwhitelistedByID(@Path("tutorID") String tutorID); + Single> getTutorwhitelistedByID(@Path("tutorID") String tutorID); @PUT("api/users/whitelist/{tutorID}") - Call setTutorWhitelist(@Path("tutorID") String tutorID, @Body IsUsingListBool isUsing); + Completable setTutorWhitelist(@Path("tutorID") String tutorID, @Body IsUsingListBool isUsing); @POST("api/users/whitelist/{tutorID}") - Call addStudentTowhitelist(@Path("tutorID") String tutorID, @Body StudentIdModel student); + Completable addStudentTowhitelist(@Path("tutorID") String tutorID, @Body StudentIdModel student); @DELETE("api/users/whitelist/{tutorID}") - Call> removeStudentFromWhitelist(@Path("tutorID") String tutorID, @Body StudentIdModel student); + Completable removeStudentFromWhitelist(@Path("tutorID") String tutorID, @Body StudentIdModel student); } diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/MyDividerItemDecoration.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/MyDividerItemDecoration.java new file mode 100644 index 0000000..96a4d62 --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/MyDividerItemDecoration.java @@ -0,0 +1,98 @@ +package com.uam.wmi.findmytutor.utils; + +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.TypedValue; +import android.view.View; + +public class MyDividerItemDecoration extends RecyclerView.ItemDecoration { + + private static final int[] ATTRS = new int[]{ + android.R.attr.listDivider + }; + + public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; + public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; + + private Drawable mDivider; + private int mOrientation; + private Context context; + private int margin; + + public MyDividerItemDecoration(Context context, int orientation, int margin) { + this.context = context; + this.margin = margin; + final TypedArray a = context.obtainStyledAttributes(ATTRS); + mDivider = a.getDrawable(0); + a.recycle(); + setOrientation(orientation); + } + + public void setOrientation(int orientation) { + if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { + throw new IllegalArgumentException("invalid orientation"); + } + mOrientation = orientation; + } + + @Override + public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { + if (mOrientation == VERTICAL_LIST) { + drawVertical(c, parent); + } else { + drawHorizontal(c, parent); + } + } + + public void drawVertical(Canvas c, RecyclerView parent) { + final int left = parent.getPaddingLeft(); + final int right = parent.getWidth() - parent.getPaddingRight(); + + final int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child + .getLayoutParams(); + final int top = child.getBottom() + params.bottomMargin; + final int bottom = top + mDivider.getIntrinsicHeight(); + mDivider.setBounds(left + dpToPx(margin), top, right - dpToPx(margin), bottom); + mDivider.draw(c); + } + } + + public void drawHorizontal(Canvas c, RecyclerView parent) { + final int top = parent.getPaddingTop(); + final int bottom = parent.getHeight() - parent.getPaddingBottom(); + + final int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = parent.getChildAt(i); + final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child + .getLayoutParams(); + final int left = child.getRight() + params.rightMargin; + final int right = left + mDivider.getIntrinsicHeight(); + mDivider.setBounds(left, top + dpToPx(margin), right, bottom - dpToPx(margin)); + mDivider.draw(c); + } + } + + @Override + public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { + if (mOrientation == VERTICAL_LIST) { + outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); + } else { + outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); + } + } + + private int dpToPx(int dp) { + Resources r = context.getResources(); + return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics())); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/PrefUtils.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/PrefUtils.java new file mode 100644 index 0000000..8613c34 --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/PrefUtils.java @@ -0,0 +1,27 @@ +package com.uam.wmi.findmytutor.utils; + +import android.content.Context; +import android.content.SharedPreferences; + +public class PrefUtils { + /** + * Storing API Key in shared preferences to + * add it in header part of every retrofit request + */ + public PrefUtils() { + } + + private static SharedPreferences getSharedPreferences(Context context) { + return context.getSharedPreferences("APP_PREF", Context.MODE_PRIVATE); + } + + public static void storeApiKey(Context context, String apiKey) { + SharedPreferences.Editor editor = getSharedPreferences(context).edit(); + editor.putString("API_KEY", apiKey); + editor.commit(); + } + + public static String getApiKey(Context context) { + return getSharedPreferences(context).getString("API_KEY", null); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/uam/wmi/findmytutor/utils/RecyclerTouchListener.java b/app/src/main/java/com/uam/wmi/findmytutor/utils/RecyclerTouchListener.java new file mode 100644 index 0000000..28aef5d --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/utils/RecyclerTouchListener.java @@ -0,0 +1,54 @@ +package com.uam.wmi.findmytutor.utils; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.GestureDetector; +import android.view.MotionEvent; +import android.view.View; + +public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { + + private ClickListener clicklistener; + private GestureDetector gestureDetector; + + public RecyclerTouchListener(Context context, final RecyclerView recycleView, final ClickListener clicklistener) { + + this.clicklistener = clicklistener; + gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { + @Override + public boolean onSingleTapUp(MotionEvent e) { + return true; + } + + @Override + public void onLongPress(MotionEvent e) { + View child = recycleView.findChildViewUnder(e.getX(), e.getY()); + if (child != null && clicklistener != null) { + clicklistener.onLongClick(child, recycleView.getChildAdapterPosition(child)); + } + } + }); + } + + @Override + public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { + View child = rv.findChildViewUnder(e.getX(), e.getY()); + if (child != null && clicklistener != null && gestureDetector.onTouchEvent(e)) { + clicklistener.onClick(child, rv.getChildAdapterPosition(child)); + } + return false; + } + + @Override + public void onTouchEvent(RecyclerView rv, MotionEvent e) { + } + + @Override + public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { + } + + public interface ClickListener { + void onClick(View view, int position); + void onLongClick(View view, int position); + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/tutor_list_row.xml b/app/src/main/res/layout/tutor_list_row.xml new file mode 100644 index 0000000..8ec9c3d --- /dev/null +++ b/app/src/main/res/layout/tutor_list_row.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml new file mode 100644 index 0000000..aadfc8e --- /dev/null +++ b/app/src/main/res/values/array.xml @@ -0,0 +1,43 @@ + + + + #e84e40 + #ec407a + #ab47bc + #7e57c2 + #5c6bc0 + #738ffe + #29b6f6 + #26c6da + #26a69a + #2baf2b + #9ccc65 + #d4e157 + #ffee58 + #ffa726 + #ff7043 + #8d6e63 + #bdbdbd + #78909c + + + #e51c23 + #e91e63 + #9c27b0 + #673ab7 + #3f51b5 + #5677fc + #03a9f4 + #00bcd4 + #009688 + #259b24 + #8bc34a + #cddc39 + #ffeb3b + #ff9800 + #ff5722 + #795548 + #9e9e9e + #607d8b + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3ab3e9c..4e15c2e 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -3,4 +3,8 @@ #3F51B5 #303F9F #FF4081 + #999 + #89c3c3c3 + #858585 + #232323 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 812cb7b..93fc64f 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -3,4 +3,18 @@ 16dp 16dp 16dp + + + + 16dp + 10dp + 26sp + 120dp + 20sp + 10dp + 20sp + 10dp + 40sp + 14sp + 13sp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b10a931..52d1d21 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,6 +3,13 @@ Sign in StartUp Activity + + Settings + Notes + No notes found! + New Note + Enter your note! + Email