diff --git a/.idea/misc.xml b/.idea/misc.xml index c0f68ed..b0c7b20 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,22 +5,26 @@ diff --git a/.project b/.project new file mode 100644 index 0000000..9892213 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + FindMyTutorAndroid + Project FindMyTutorAndroid created by Buildship. + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/app/.project b/app/.project new file mode 100644 index 0000000..ac485d7 --- /dev/null +++ b/app/.project @@ -0,0 +1,23 @@ + + + app + Project app created by Buildship. + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.buildship.core.gradleprojectbuilder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.buildship.core.gradleprojectnature + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 304f508..e7eae35 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,25 +9,15 @@ - - - - - + @@ -38,7 +28,7 @@ + + + diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java new file mode 100644 index 0000000..4b0e776 --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java @@ -0,0 +1,209 @@ +package com.uam.wmi.findmytutor.activity; + +import android.content.Intent; +import android.content.res.Configuration; +import android.support.annotation.NonNull; +import android.support.design.widget.BottomNavigationView; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBar; +import android.support.v7.app.ActionBarDrawerToggle; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.SearchView; +import android.support.v7.widget.Toolbar; +import android.text.TextUtils; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.FrameLayout; +import android.widget.ListView; +import android.widget.Toast; + +import com.uam.wmi.findmytutor.ListViewAdapter; +import com.uam.wmi.findmytutor.R; + +import java.util.ArrayList; + +public abstract class BaseActivity + extends AppCompatActivity + implements BottomNavigationView.OnNavigationItemSelectedListener { + + protected BottomNavigationView navigationView; + + protected Toolbar toolbar; + + public DrawerLayout drawerLayout; + private ActionBarDrawerToggle actionBarDrawerToggle; + // 4 search + private ListView listView; + private ArrayList stringArrayList; + private ListViewAdapter adapter; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(getContentViewId()); + + navigationView = findViewById(R.id.navigation); + navigationView.setOnNavigationItemSelectedListener(this); + + } + + @Override + public void setContentView(int layoutResID) { + DrawerLayout fullView = (DrawerLayout) getLayoutInflater().inflate(R.layout.base_activity, null); + FrameLayout activityContainer = (FrameLayout) fullView.findViewById(R.id.activity_content); + getLayoutInflater().inflate(layoutResID, activityContainer, true); + super.setContentView(fullView); + + initToolbar(); + } + + private void initToolbar() { + toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + } + private void setData() { + stringArrayList = new ArrayList<>(); + stringArrayList.add("Quynh Trang"); + stringArrayList.add("Hoang Bien"); + stringArrayList.add("Duc Tuan"); + stringArrayList.add("Dang Thanh"); + stringArrayList.add("Xuan Luu"); + stringArrayList.add("Phan Thanh"); + stringArrayList.add("Kim Kien"); + stringArrayList.add("Ngo Trang"); + stringArrayList.add("Thanh Ngan"); + stringArrayList.add("Nguyen Duong"); + stringArrayList.add("Quoc Cuong"); + stringArrayList.add("Tran Ha"); + stringArrayList.add("Vu Danh"); + stringArrayList.add("Minh Meo"); + } + + + private void setUpNav() { + + drawerLayout = (DrawerLayout) findViewById(R.id.activity_container); + actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); + drawerLayout.addDrawerListener(actionBarDrawerToggle); + + ActionBar actionBar = getSupportActionBar(); + + if (actionBar != null) { + actionBar.setDisplayShowTitleEnabled(false); + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeButtonEnabled(true); + } + } + + + @Override + public void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + setUpNav(); + + actionBarDrawerToggle.syncState(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + actionBarDrawerToggle.onConfigurationChanged(newConfig); + } + + @Override + public boolean onCreateOptionsMenu( Menu menu) { + getMenuInflater().inflate( R.menu.menu_main, menu); + + MenuItem myActionMenuItem = menu.findItem( R.id.action_search); + final SearchView searchView = (SearchView) myActionMenuItem.getActionView(); + searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { + @Override + public boolean onQueryTextSubmit(String query) { + return false; + } + + @Override + public boolean onQueryTextChange(String newText) { + if (TextUtils.isEmpty(newText)) { + adapter.filter(""); + listView.clearTextFilter(); + } else { + adapter.filter(newText); + } + return true; + } + }); + + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (actionBarDrawerToggle.onOptionsItemSelected(item)) { + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + protected void onStart() { + super.onStart(); + updateNavigationBarState(); + } + + @Override + public void onPause() { + super.onPause(); + overridePendingTransition(0,0); + } + + @Override + public boolean onNavigationItemSelected(@NonNull MenuItem item) { + + navigationView.postDelayed(() -> { + int itemId = item.getItemId(); + if (itemId == R.id.nav_map) { + startActivity(new Intent(this, MapActivity.class)); + } else if (itemId == R.id.nav_profile) { + startActivity(new Intent(this, ProfileActivity.class)); + } else if (itemId == R.id.nav_notif) { + startActivity(new Intent(this, NotificationsActivity.class)); + } + finish(); + }, 300); + return true; + +// navigationView.postDelayed(() -> { +// int itemId = item.getItemId(); +// switch (itemId) { +// case R.id.nav_profile: +// startActivity(new Intent(this, ProfileActivity.class)); +// case R.id.nav_map: +// startActivity(new Intent(this, MapActivity.class)); +// case R.id.nav_notif: +// startActivity(new Intent(this, NotificationsActivity.class)); +// } +// +// finish(); +// }, 300); +// return true; + } + + private void updateNavigationBarState() { + int actionId = getNavigationMenuItemId(); + selectBottomNavigationBarItem(actionId); + } + + private void selectBottomNavigationBarItem(int itemId) { + MenuItem item = navigationView.getMenu().findItem(itemId); + item.setChecked(true); + } + + abstract int getNavigationMenuItemId(); + + abstract int getContentViewId(); +} diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java new file mode 100644 index 0000000..67dfc45 --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java @@ -0,0 +1,87 @@ +package com.uam.wmi.findmytutor.activity; + +import android.os.Bundle; + +import com.mapbox.mapboxsdk.Mapbox; +import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.maps.MapboxMap; +import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; +import com.uam.wmi.findmytutor.R; + + +public class MapActivity extends BaseActivity { + private MapView mapView; + String tag = "LifeCycleEvents"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Mapbox.getInstance(this, getString(R.string.access_token)); + mapView = findViewById(R.id.mapView); + mapView.onCreate(savedInstanceState); + + mapView.getMapAsync(new OnMapReadyCallback() { + @Override + public void onMapReady(MapboxMap mapboxMap) { + + // Customize map with markers, polylines, etc. + + } + }); + } + + + + // Add the mapView lifecycle to the activity's lifecycle methods + @Override + public void onResume() { + super.onResume(); + mapView.onResume(); + } + + @Override + protected void onStart() { + super.onStart(); + mapView.onStart(); + } + + @Override + protected void onStop() { + super.onStop(); + mapView.onStop(); + } + + @Override + public void onPause() { + super.onPause(); + mapView.onPause(); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + mapView.onLowMemory(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mapView.onDestroy(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + mapView.onSaveInstanceState(outState); + } + + @Override + protected int getContentViewId() { + return R.layout.activity_map; + } + + @Override + protected int getNavigationMenuItemId() { + return R.id.nav_map; + } +} diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/NotificationsActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/NotificationsActivity.java new file mode 100644 index 0000000..30045ae --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/NotificationsActivity.java @@ -0,0 +1,179 @@ +package com.uam.wmi.findmytutor.activity; + +import android.animation.ObjectAnimator; +import android.animation.TypeEvaluator; +import android.animation.ValueAnimator; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.util.Log; + +import com.mapbox.mapboxsdk.Mapbox; +import com.mapbox.mapboxsdk.annotations.Marker; +import com.mapbox.mapboxsdk.annotations.MarkerViewOptions; +import com.mapbox.mapboxsdk.geometry.LatLng; +import com.mapbox.mapboxsdk.maps.MapView; +import com.mapbox.mapboxsdk.maps.MapboxMap; +import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; +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.CoordinateService; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.observers.DisposableSingleObserver; +import io.reactivex.schedulers.Schedulers; + + +public class NotificationsActivity extends BaseActivity { + + private MapView mapView; + private CoordinateService coordinateService; + private CompositeDisposable disposable = new CompositeDisposable(); + private List coordinatesList = new ArrayList<>(); + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + mapInit(savedInstanceState); + +// coordinateService = ApiClient.getClient(getApplicationContext()) +// .create(CoordinateService.class); + final SharedPreferences sharedPref = getSharedPreferences("fmtPrefs", Context.MODE_PRIVATE); + final String authToken = sharedPref.getString("authToken",null); + + coordinateService = RetrofitClientInstance.createService(CoordinateService.class,"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiI2YjhmNzFiMS00NDM2LTQxZGQtYjg3MC1mNzZlNjdkNDM4NDMiLCJzdWIiOiJzdHJpbmciLCJqdGkiOiJiZGRjZTAwMC0xN2U4LTQwNDUtYWZiNS1kY2RkOWNhNDFiNmQiLCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dzLzIwMDgvMDYvaWRlbnRpdHkvY2xhaW1zL3JvbGUiOiJUdXRvciIsImV4cCI6MTU0MTcxNzk2MywiaXNzIjoiaHR0cDovL2ZpbmRteXR1dG9yLmNvbSIsImF1ZCI6Imh0dHA6Ly9maW5kbXl0dXRvci5jb20ifQ.JJVNeMAwwla6DJk6X8qZUgPFKJp-Epx55W9V_fIwpgg"); + + fetchTopCoords(); + } + + private void mapInit(Bundle savedInstanceState) { + // Mapbox access token is configured here. This needs to be called either in your application + // object or in the same activity which contains the mapview. + Mapbox.getInstance(this, getString(R.string.access_token)); + // This contains the MapView in XML and needs to be called after the access token is configured. + // setContentView(R.layout.activity_notifications); + + mapView = (MapView) findViewById(R.id.mapView2); + mapView.onCreate(savedInstanceState); + mapView.getMapAsync(new OnMapReadyCallback() { + @Override + public void onMapReady(MapboxMap mapboxMap) { + + final Marker marker = mapboxMap.addMarker(new MarkerViewOptions() + .position(new LatLng(64.900932, -18.167040))); + + mapboxMap.setOnMapClickListener(new MapboxMap.OnMapClickListener() { + @Override + public void onMapClick(@NonNull LatLng point) { + + // When the user clicks on the map, we want to animate the marker to that + // location. + ValueAnimator markerAnimator = ObjectAnimator.ofObject(marker, "position", + new LatLngEvaluator(), marker.getPosition(), point); + markerAnimator.setDuration(2000); + markerAnimator.start(); + } + }); + + } + }); + + } + + private void fetchTopCoords() { + disposable.add( + coordinateService.getTopCoordinates() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeWith(new DisposableSingleObserver>() { + @Override + public void onSuccess(List coordsList) { + + Log.d("mapTag", "co?"); + for (Coordinate element: + coordsList) { + Log.d("mapTag", element.getUserId()); + } + } + + @Override + public void onError(Throwable e) { + Log.e("Error",e.toString()); + } + }) + ); + + } + + @Override + protected void onStart() { + super.onStart(); + mapView.onStart(); + } + + @Override + public void onResume() { + super.onResume(); + mapView.onResume(); + } + + @Override + public void onPause() { + super.onPause(); + mapView.onPause(); + } + + @Override + protected void onStop() { + super.onStop(); + mapView.onStop(); + } + + @Override + public void onLowMemory() { + super.onLowMemory(); + mapView.onLowMemory(); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + mapView.onDestroy(); + disposable.dispose(); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + mapView.onSaveInstanceState(outState); + } + + private static class LatLngEvaluator implements TypeEvaluator { + // Method is used to interpolate the marker animation. + + private LatLng latLng = new LatLng(); + + @Override + public LatLng evaluate(float fraction, LatLng startValue, LatLng endValue) { + latLng.setLatitude(startValue.getLatitude() + + ((endValue.getLatitude() - startValue.getLatitude()) * fraction)); + latLng.setLongitude(startValue.getLongitude() + + ((endValue.getLongitude() - startValue.getLongitude()) * fraction)); + return latLng; + } + } + + @Override + protected int getContentViewId() { return R.layout.activity_notifications; } + + @Override + protected int getNavigationMenuItemId() { return R.id.nav_notif; } +} diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/ProfileActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/ProfileActivity.java new file mode 100644 index 0000000..5a3d92d --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/ProfileActivity.java @@ -0,0 +1,14 @@ +package com.uam.wmi.findmytutor.activity; + +import com.uam.wmi.findmytutor.R; + +public class ProfileActivity extends BaseActivity { + + @Override + protected int getContentViewId() { return R.layout.activity_profile; } + + @Override + protected int getNavigationMenuItemId() { + return R.id.nav_profile; + } +} diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/StartupActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/StartupActivity.java index c2b8491..04dfc8b 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/StartupActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/StartupActivity.java @@ -14,7 +14,7 @@ public class StartupActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { if (PrefUtils.isLoggedIn(getApplicationContext())){ - Intent startupIntent = new Intent(this, MainActivity.class); + Intent startupIntent = new Intent(this, MapActivity.class); startupIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(startupIntent); finish(); @@ -30,7 +30,7 @@ public class StartupActivity extends AppCompatActivity { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == AUTHENTICATION_REQUEST_CODE && resultCode == Activity.RESULT_OK) { - Intent startupIntent = new Intent(this, MainActivity.class); + Intent startupIntent = new Intent(this, MapActivity.class); startupIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(startupIntent); } 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 new file mode 100644 index 0000000..a3e3ee3 --- /dev/null +++ b/app/src/main/java/com/uam/wmi/findmytutor/network/RetrofitClientInstance.java @@ -0,0 +1,54 @@ +package com.uam.wmi.findmytutor.network; + +import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; + +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) + .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) + .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); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/uam/wmi/findmytutor/service/CoordinateService.java b/app/src/main/java/com/uam/wmi/findmytutor/service/CoordinateService.java index ce3d2fe..18ec984 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/service/CoordinateService.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/service/CoordinateService.java @@ -42,4 +42,3 @@ public interface CoordinateService { Single deleteCoordinatesById(@Path("id") String id); } - diff --git a/app/src/main/res/layout/activity_map.xml b/app/src/main/res/layout/activity_map.xml new file mode 100644 index 0000000..7af4e8e --- /dev/null +++ b/app/src/main/res/layout/activity_map.xml @@ -0,0 +1,31 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_notifications.xml b/app/src/main/res/layout/activity_notifications.xml new file mode 100644 index 0000000..be82ea7 --- /dev/null +++ b/app/src/main/res/layout/activity_notifications.xml @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml new file mode 100644 index 0000000..49b6e9b --- /dev/null +++ b/app/src/main/res/layout/activity_profile.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/base_activity.xml b/app/src/main/res/layout/base_activity.xml new file mode 100644 index 0000000..2edc8cc --- /dev/null +++ b/app/src/main/res/layout/base_activity.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/element_bottom_navigation.xml b/app/src/main/res/layout/element_bottom_navigation.xml new file mode 100644 index 0000000..4624eb7 --- /dev/null +++ b/app/src/main/res/layout/element_bottom_navigation.xml @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aac502f..f5d9839 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -196,4 +196,5 @@ functionality. %d locations reported + Main2Activity diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 31ff20c..edb90df 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,21 +1,22 @@ - + - + - + -