diff --git a/Android/Entrevoisins/.idea/androidTestResultsUserPreferences.xml b/Android/Entrevoisins/.idea/androidTestResultsUserPreferences.xml new file mode 100644 index 0000000..f38484e --- /dev/null +++ b/Android/Entrevoisins/.idea/androidTestResultsUserPreferences.xml @@ -0,0 +1,100 @@ + + + + + + \ No newline at end of file diff --git a/Android/Entrevoisins/.idea/compiler.xml b/Android/Entrevoisins/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/Android/Entrevoisins/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Android/Entrevoisins/.idea/gradle.xml b/Android/Entrevoisins/.idea/gradle.xml index 2996d53..a0de2a1 100644 --- a/Android/Entrevoisins/.idea/gradle.xml +++ b/Android/Entrevoisins/.idea/gradle.xml @@ -1,14 +1,19 @@ + diff --git a/Android/Entrevoisins/.idea/jarRepositories.xml b/Android/Entrevoisins/.idea/jarRepositories.xml new file mode 100644 index 0000000..0376040 --- /dev/null +++ b/Android/Entrevoisins/.idea/jarRepositories.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android/Entrevoisins/.idea/misc.xml b/Android/Entrevoisins/.idea/misc.xml index ad6da9c..a740c72 100644 --- a/Android/Entrevoisins/.idea/misc.xml +++ b/Android/Entrevoisins/.idea/misc.xml @@ -5,7 +5,7 @@ - + diff --git a/Android/Entrevoisins/.idea/runConfigurations.xml b/Android/Entrevoisins/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/Android/Entrevoisins/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Android/Entrevoisins/README.md b/Android/Entrevoisins/README.md index d12fb0c..e96c9b3 100644 --- a/Android/Entrevoisins/README.md +++ b/Android/Entrevoisins/README.md @@ -1,3 +1,37 @@ -# OpenClassrooms +# Entrevoisin -Ce dépôt contient une mini-application pour le P3 du parcours **Grande École du Numérique**. \ No newline at end of file +## Description +Ce dépôt contient une mini-application pour le P3 du parcours “Développement d’application Android” d’Openclassrooms. + +Cette application consiste à: +*Afficher une liste de voisins. +*Faire une création de nouveau voisin +*Supprimer un voisin choisi +*Afficher les détails d’un voisin sélection +*Mettre un voisin en favori +*Afficher la liste de voisins favoris +## Prérequis +* Installation de [Android Studio](https://developer.android.com/studio?gclid=CjwKCAiAlp2fBhBPEiwA2Q10DylEC18SIGfmsSq9IHXwIvfDtvdeyjUUL9axVlY7wGES4gyH5kgjdxoCqlsQAvD_BwE&gclsrc=aw.ds) +* Installation du [Java sdk](https://www.oracle.com/fr/java/technologies/downloads/) +* Installation de [Git](https://git-scm.com/book/fr/v2/D%C3%A9marrage-rapide-Installation-de-Git) +* Télécharger les fichiers du projet Entre Voisin ou faire un [clone](https://docs.github.com/fr/repositories/creating-and-managing-repositories/cloning-a-repository) sur votre ordinateur +## Comment exécuter et compiler +* Ouvrir les fichiers avec android studio +* Synchroniser le build.gradle + * minSdkVersion 21 + * targetSdkVersion 28 + * dépendances + * [glide](https://github.com/bumptech/glide) + * [butterknife](https://jakewharton.github.io/butterknife/) + * [eventbus](https://greenrobot.org/eventbus/) + * [espresso](https://developer.android.com/training/testing/espresso) +* Sélectionner le device pour l'émulateur +* Sélectionner “app” dans la configuration +* appuyer sur le bouton Run + + +![Image](images/ExecuterCompiler.JPG) + +## Crédits +Ce code est basé sur le code créé par Deyine d’Openclassrooms. +Voici le lien [Github](https://github.com/Deyine/OpenClassrooms/tree/master/Android/Entrevoisins) diff --git a/Android/Entrevoisins/app/build.gradle b/Android/Entrevoisins/app/build.gradle index cac6e75..c96a63a 100644 --- a/Android/Entrevoisins/app/build.gradle +++ b/Android/Entrevoisins/app/build.gradle @@ -21,17 +21,23 @@ android { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } + namespace 'com.openclassrooms.entrevoisins' + buildFeatures { + viewBinding true + } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:design:28.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'com.android.support.constraint:constraint-layout:2.0.4' implementation 'com.android.support:support-v4:28.0.0' implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.jakewharton:butterknife:9.0.0' + implementation 'android.arch.navigation:navigation-fragment:1.0.0' + implementation 'android.arch.navigation:navigation-ui:1.0.0' annotationProcessor 'com.jakewharton:butterknife-compiler:9.0.0' implementation 'com.github.bumptech.glide:glide:4.9.0' @@ -41,7 +47,7 @@ dependencies { implementation 'org.greenrobot:eventbus:3.1.1' // UNIT TEST - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13.2' testImplementation 'org.hamcrest:java-hamcrest:2.0.0.0' // INSTRUMENTATION TEST androidTestImplementation 'com.android.support.test:rules:1.0.2' diff --git a/Android/Entrevoisins/app/src/androidTest/java/com/openclassrooms/entrevoisins/neighbour_list/NeighboursListTest.java b/Android/Entrevoisins/app/src/androidTest/java/com/openclassrooms/entrevoisins/neighbour_list/NeighboursListTest.java index 84e2df8..12ea60f 100644 --- a/Android/Entrevoisins/app/src/androidTest/java/com/openclassrooms/entrevoisins/neighbour_list/NeighboursListTest.java +++ b/Android/Entrevoisins/app/src/androidTest/java/com/openclassrooms/entrevoisins/neighbour_list/NeighboursListTest.java @@ -2,11 +2,13 @@ package com.openclassrooms.entrevoisins.neighbour_list; import android.support.test.espresso.contrib.RecyclerViewActions; -import android.support.test.espresso.matcher.ViewMatchers; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; import com.openclassrooms.entrevoisins.R; +import com.openclassrooms.entrevoisins.di.DI; +import com.openclassrooms.entrevoisins.model.Neighbour; +import com.openclassrooms.entrevoisins.service.NeighbourApiService; import com.openclassrooms.entrevoisins.ui.neighbour_list.ListNeighbourActivity; import com.openclassrooms.entrevoisins.utils.DeleteViewAction; @@ -16,12 +18,22 @@ import org.junit.runner.RunWith; import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.action.ViewActions.swipeLeft; +import static android.support.test.espresso.action.ViewActions.swipeRight; import static android.support.test.espresso.assertion.ViewAssertions.matches; import static android.support.test.espresso.matcher.ViewMatchers.assertThat; import static android.support.test.espresso.matcher.ViewMatchers.hasMinimumChildCount; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; import static com.openclassrooms.entrevoisins.utils.RecyclerViewItemCountAssertion.withItemCount; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.anything; import static org.hamcrest.core.IsNull.notNullValue; +import java.util.List; /** @@ -34,6 +46,8 @@ public class NeighboursListTest { private static int ITEMS_COUNT = 12; private ListNeighbourActivity mActivity; + private NeighbourApiService mApiService; + private List mNeighbours; @Rule public ActivityTestRule mActivityRule = @@ -43,6 +57,8 @@ public class NeighboursListTest { public void setUp() { mActivity = mActivityRule.getActivity(); assertThat(mActivity, notNullValue()); + mApiService = DI.getNeighbourApiService(); + mNeighbours = mApiService.getNeighbours(); } /** @@ -51,8 +67,7 @@ public void setUp() { @Test public void myNeighboursList_shouldNotBeEmpty() { // First scroll to the position that needs to be matched and click on it. - onView(ViewMatchers.withId(R.id.list_neighbours)) - .check(matches(hasMinimumChildCount(1))); + onView(allOf(withId(R.id.list_neighbours), isDisplayed())).check(matches(hasMinimumChildCount(1))); } /** @@ -61,11 +76,41 @@ public void myNeighboursList_shouldNotBeEmpty() { @Test public void myNeighboursList_deleteAction_shouldRemoveItem() { // Given : We remove the element at position 2 - onView(ViewMatchers.withId(R.id.list_neighbours)).check(withItemCount(ITEMS_COUNT)); + //onView(withId(R.id.list_neighbours)) + onView(allOf(withId(R.id.list_neighbours), isDisplayed())).check(withItemCount(ITEMS_COUNT)); // When perform a click on a delete icon - onView(ViewMatchers.withId(R.id.list_neighbours)) + onView(allOf(withId(R.id.list_neighbours), isDisplayed())) .perform(RecyclerViewActions.actionOnItemAtPosition(1, new DeleteViewAction())); // Then : the number of element is 11 - onView(ViewMatchers.withId(R.id.list_neighbours)).check(withItemCount(ITEMS_COUNT-1)); + onView(allOf(withId(R.id.list_neighbours), isDisplayed())).check(withItemCount(ITEMS_COUNT-1)); + } + @Test + public void neighbourIsClicked_shouldOpenDetailPage_withCorrectInfo() { + //launches second page + onView(allOf(withId(R.id.list_neighbours), isDisplayed())).perform(RecyclerViewActions.actionOnItemAtPosition(0, click())); + Neighbour neighbour = mNeighbours.get(0); + onView(withId(R.id.constraintLayout_UserInfo)).check(matches(isDisplayed())); + + onView(withId(R.id.detail_avatar_lable_name)).check(matches(withText(neighbour.getName()))); + onView(withId(R.id.detail_info_text_name)).check(matches(withText(neighbour.getName()))); + } + @Test + public void testFavoriteList_OnlyDisplaysFavoriteNeighbours() throws InterruptedException { + //checks that the favorite list is empty at first + onView(allOf(withId(R.id.list_neighbours), isDisplayed())).perform(swipeLeft()); + Thread.sleep(500); + onView(allOf(withId(R.id.list_neighbours), isDisplayed())).check(withItemCount(0)); + onView(allOf(withId(R.id.list_neighbours), isDisplayed())).perform(swipeRight()); + Thread.sleep(500); + //adds a favorite neighbour by clicking on the fab button + onView(allOf(withId(R.id.list_neighbours), isDisplayed())).perform(RecyclerViewActions.actionOnItemAtPosition(0, click())); + Neighbour neighbour = mNeighbours.get(0); + onView(withId(R.id.detail_button_favorite)).perform(click()); + onView(withId(R.id.detail_back_arrow)).perform(click());//go back home page + //Checks the the favorite list has one member and that it is the correct neighbour + onView(allOf(withId(R.id.list_neighbours), isDisplayed())).perform(swipeLeft()); + Thread.sleep(500); + onView(allOf(withId(R.id.list_neighbours), isDisplayed())).check(withItemCount(1)); + onView(allOf(withText(neighbour.getName()),isDisplayed())).check(matches(isDisplayed())); } } \ No newline at end of file diff --git a/Android/Entrevoisins/app/src/main/AndroidManifest.xml b/Android/Entrevoisins/app/src/main/AndroidManifest.xml index b0d0645..1881e6f 100644 --- a/Android/Entrevoisins/app/src/main/AndroidManifest.xml +++ b/Android/Entrevoisins/app/src/main/AndroidManifest.xml @@ -1,6 +1,6 @@ + package="com.openclassrooms.entrevoisins" > @@ -11,14 +11,18 @@ android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/AppTheme"> + android:theme="@style/AppTheme" > + + android:theme="@style/AppTheme.NoActionBar" > diff --git a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/model/Neighbour.java b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/model/Neighbour.java index bf82fdc..ba12b0c 100644 --- a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/model/Neighbour.java +++ b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/model/Neighbour.java @@ -1,12 +1,15 @@ package com.openclassrooms.entrevoisins.model; +import android.os.Parcel; +import android.os.Parcelable; + +import java.io.Serializable; import java.util.Objects; /** * Model object representing a Neighbour */ -public class Neighbour { - +public class Neighbour implements Parcelable{ /** Identifier */ private long id; @@ -25,6 +28,10 @@ public class Neighbour { /** About me */ private String aboutMe; + private boolean isFavorite; + + + /** * Constructor * @param id @@ -39,8 +46,31 @@ public Neighbour(long id, String name, String avatarUrl, String address, this.address = address; this.phoneNumber = phoneNumber; this.aboutMe = aboutMe; + this.isFavorite = false; + } + + protected Neighbour(Parcel in) { + id = in.readLong(); + name = in.readString(); + avatarUrl = in.readString(); + address = in.readString(); + phoneNumber = in.readString(); + aboutMe = in.readString(); + isFavorite = in.readByte() != 0; } + public static final Creator CREATOR = new Creator() { + @Override + public Neighbour createFromParcel(Parcel in) { + return new Neighbour(in); + } + + @Override + public Neighbour[] newArray(int size) { + return new Neighbour[size]; + } + }; + public long getId() { return id; } @@ -88,17 +118,27 @@ public String getAboutMe() { public void setAboutMe(String aboutMe) { this.aboutMe = aboutMe; } + public boolean getIsFavorite() { + return isFavorite; + } + + public void setIsFavorite(boolean favorite) { + isFavorite = favorite; + } @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Neighbour neighbour = (Neighbour) o; - return Objects.equals(id, neighbour.id); + public int describeContents() { + return 0; } @Override - public int hashCode() { - return Objects.hash(id); + public void writeToParcel(Parcel parcel, int i) { + parcel.writeLong(id); + parcel.writeString(name); + parcel.writeString(avatarUrl); + parcel.writeString(address); + parcel.writeString(phoneNumber); + parcel.writeString(aboutMe); + parcel.writeByte((byte) (isFavorite ? 1 : 0)); } } diff --git a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/service/DummyNeighbourApiService.java b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/service/DummyNeighbourApiService.java index 5c487af..6d95548 100644 --- a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/service/DummyNeighbourApiService.java +++ b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/service/DummyNeighbourApiService.java @@ -36,4 +36,13 @@ public void deleteNeighbour(Neighbour neighbour) { public void createNeighbour(Neighbour neighbour) { neighbours.add(neighbour); } + + @Override + public void changeFavoriteStatus(Neighbour neighbour) { + for (Neighbour n : neighbours) {//Loops to retrieve the correct Neighbour by ID + if (n.getId()==neighbour.getId()) { + n.setIsFavorite(neighbour.getIsFavorite()); + } + } + } } diff --git a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/service/DummyNeighbourGenerator.java b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/service/DummyNeighbourGenerator.java index 5f93524..af48e9a 100644 --- a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/service/DummyNeighbourGenerator.java +++ b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/service/DummyNeighbourGenerator.java @@ -12,7 +12,7 @@ public abstract class DummyNeighbourGenerator { new Neighbour(1, "Caroline", "https://i.pravatar.cc/150?u=a042581f4e29026704d", "Saint-Pierre-du-Mont ; 5km", "+33 6 86 57 90 14", "Bonjour !Je souhaiterais faire de la marche nordique. Pas initiée, je recherche une ou plusieurs personnes susceptibles de m'accompagner !J'aime les jeux de cartes tels la belote et le tarot.."), new Neighbour(2, "Jack", "https://i.pravatar.cc/150?u=a042581f4e29026704e", "Saint-Pierre-du-Mont ; 5km", - "+33 6 86 57 90 14", "Bonjour !Je souhaiterais faire de la marche nordique. Pas initiée, je recherche une ou plusieurs personnes susceptibles de m'accompagner !J'aime les jeux de cartes tels la belote et le tarot.."), + "+33 6 86 57 90 15", "Bonjour !Je souhaiterais faire de la marche nordique. Pas initiée, je recherche une ou plusieurs personnes susceptibles de m'accompagner !J'aime les jeux de cartes tels la belote et le tarot.."), new Neighbour(3, "Chloé", "https://i.pravatar.cc/150?u=a042581f4e29026704f", "Saint-Pierre-du-Mont ; 5km", "+33 6 86 57 90 14", "Bonjour !Je souhaiterais faire de la marche nordique. Pas initiée, je recherche une ou plusieurs personnes susceptibles de m'accompagner !J'aime les jeux de cartes tels la belote et le tarot.."), new Neighbour(4, "Vincent", "https://i.pravatar.cc/150?u=a042581f4e29026704a", "Saint-Pierre-du-Mont ; 5km", diff --git a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/service/NeighbourApiService.java b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/service/NeighbourApiService.java index 20fa34c..6fafe2a 100644 --- a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/service/NeighbourApiService.java +++ b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/service/NeighbourApiService.java @@ -27,4 +27,9 @@ public interface NeighbourApiService { * @param neighbour */ void createNeighbour(Neighbour neighbour); + /** + * Changes the isFavorite sattus of a neighbour + * @param neighbour + */ + void changeFavoriteStatus(Neighbour neighbour); } diff --git a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/ListNeighbourActivity.java b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/ListNeighbourActivity.java index 1503f7f..bb80605 100644 --- a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/ListNeighbourActivity.java +++ b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/ListNeighbourActivity.java @@ -8,6 +8,9 @@ import android.widget.Button; import com.openclassrooms.entrevoisins.R; +import com.openclassrooms.entrevoisins.model.Neighbour; + +import java.io.Console; import butterknife.BindView; import butterknife.ButterKnife; @@ -32,7 +35,8 @@ protected void onCreate(Bundle savedInstanceState) { ButterKnife.bind(this); setSupportActionBar(mToolbar); - mPagerAdapter = new ListNeighbourPagerAdapter(getSupportFragmentManager()); + + mPagerAdapter = new ListNeighbourPagerAdapter(this, getSupportFragmentManager()); mViewPager.setAdapter(mPagerAdapter); mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout)); mTabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager)); diff --git a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/ListNeighbourPagerAdapter.java b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/ListNeighbourPagerAdapter.java index 8eb6cb7..bbf6a0e 100644 --- a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/ListNeighbourPagerAdapter.java +++ b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/ListNeighbourPagerAdapter.java @@ -1,14 +1,16 @@ package com.openclassrooms.entrevoisins.ui.neighbour_list; +import android.content.Context; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; public class ListNeighbourPagerAdapter extends FragmentPagerAdapter { - - public ListNeighbourPagerAdapter(FragmentManager fm) { + private Context myContext; + public ListNeighbourPagerAdapter(Context context, FragmentManager fm) { super(fm); + myContext = context; } /** @@ -18,15 +20,16 @@ public ListNeighbourPagerAdapter(FragmentManager fm) { */ @Override public Fragment getItem(int position) { - return NeighbourFragment.newInstance(); + return NeighbourFragment.newInstance(position); } + /** * get the number of pages * @return */ @Override public int getCount() { - return 1; + return 2; } } \ No newline at end of file diff --git a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/MyNeighbourRecyclerViewAdapter.java b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/MyNeighbourRecyclerViewAdapter.java index e78eb0b..ef36b18 100644 --- a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/MyNeighbourRecyclerViewAdapter.java +++ b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/MyNeighbourRecyclerViewAdapter.java @@ -1,5 +1,7 @@ package com.openclassrooms.entrevoisins.ui.neighbour_list; +import android.content.Intent; +import android.support.constraint.ConstraintLayout; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; @@ -16,6 +18,7 @@ import org.greenrobot.eventbus.EventBus; +import java.util.ArrayList; import java.util.List; import butterknife.BindView; @@ -25,8 +28,16 @@ public class MyNeighbourRecyclerViewAdapter extends RecyclerView.Adapter mNeighbours; - public MyNeighbourRecyclerViewAdapter(List items) { - mNeighbours = items; + public MyNeighbourRecyclerViewAdapter(List items, boolean isFavorite) { + if(isFavorite) { + mNeighbours = new ArrayList<>(); //empty List + for(Neighbour item: items){ + if(item.getIsFavorite()) mNeighbours.add(item);//add favorite to List + } + } + else { + mNeighbours = items;//all Neighbours + } } @Override @@ -51,6 +62,14 @@ public void onClick(View v) { EventBus.getDefault().post(new DeleteNeighbourEvent(neighbour)); } }); + holder.cl_neighbour.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(v.getContext(), NeighbourDetailActivity.class); + intent.putExtra("Neighbour", neighbour); + v.getContext().startActivity(intent); + } + }); } @Override @@ -65,6 +84,8 @@ public class ViewHolder extends RecyclerView.ViewHolder { public TextView mNeighbourName; @BindView(R.id.item_list_delete_button) public ImageButton mDeleteButton; + @BindView(R.id.cl_neighbour) + public ConstraintLayout cl_neighbour; public ViewHolder(View view) { super(view); diff --git a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/NeighbourDetailActivity.java b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/NeighbourDetailActivity.java new file mode 100644 index 0000000..899c452 --- /dev/null +++ b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/NeighbourDetailActivity.java @@ -0,0 +1,81 @@ +package com.openclassrooms.entrevoisins.ui.neighbour_list; + +import android.support.design.widget.FloatingActionButton; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.widget.ImageView; +import android.widget.TextView; + +import com.bumptech.glide.Glide; +import com.openclassrooms.entrevoisins.R; +import com.openclassrooms.entrevoisins.di.DI; +import com.openclassrooms.entrevoisins.model.Neighbour; +import com.openclassrooms.entrevoisins.service.NeighbourApiService; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +public class NeighbourDetailActivity extends AppCompatActivity { + private Neighbour mNeighbour; + @BindView(R.id.detail_avatar) + ImageView mAvatar; + @BindView(R.id.detail_avatar_lable_name) + TextView mAvatarLableName; + @BindView(R.id.detail_info_text_name) + TextView mInfoName; + @BindView(R.id.detail_info_text_address) + TextView mInfoAddress; + @BindView(R.id.detail_info_text_url) + TextView mInfoUrl; + @BindView(R.id.detail_info_text_phone) + TextView mInfoPhone; + @BindView(R.id.detail_info_text_aboutMe) + TextView mInfoAboutMe; + private NeighbourApiService mApiService; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_neighbour_detail); + ButterKnife.bind(this); + getSupportActionBar().hide(); + + mApiService = DI.getNeighbourApiService(); + + mNeighbour = getIntent().getParcelableExtra("Neighbour");//retrieve Neighbour + //fill in neighbour detail + mAvatarLableName.setText(mNeighbour.getName()); + mInfoName.setText(mNeighbour.getName()); + mInfoAddress.setText(mNeighbour.getAddress()); + mInfoPhone.setText(mNeighbour.getPhoneNumber()); + mInfoAboutMe.setText(mNeighbour.getAboutMe()); + mInfoUrl.setText("www.facebook.fr/"+mNeighbour.getName()); + Glide.with(this) + .load(mNeighbour.getAvatarUrl()) // image url + .centerCrop() + .into(mAvatar); + + checkFavoriteStatus();//checks isFavorite status in order to select button image + } + @OnClick(R.id.detail_button_favorite) + void changeFavorite() {//inverts the boolean favorite attribute of current neighbour + mNeighbour.setIsFavorite(!mNeighbour.getIsFavorite()); + mApiService.changeFavoriteStatus(mNeighbour); + checkFavoriteStatus(); + + } + void checkFavoriteStatus(){//used to update the favorite button image from empty star to filled star + FloatingActionButton fab = findViewById(R.id.detail_button_favorite); + if(mNeighbour.getIsFavorite()){ + fab.setImageResource(R.drawable.ic_star_yellow_24dp); + } + else{ + fab.setImageResource(R.drawable.ic_star_border_yellow_24dp); + } + } + @OnClick(R.id.detail_back_arrow) + void backHome() { + finish(); + } + +} \ No newline at end of file diff --git a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/NeighbourFragment.java b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/NeighbourFragment.java index afd3300..e9c84aa 100644 --- a/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/NeighbourFragment.java +++ b/Android/Entrevoisins/app/src/main/java/com/openclassrooms/entrevoisins/ui/neighbour_list/NeighbourFragment.java @@ -19,6 +19,7 @@ import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; +import java.util.ArrayList; import java.util.List; @@ -26,15 +27,18 @@ public class NeighbourFragment extends Fragment { private NeighbourApiService mApiService; private List mNeighbours; + private List mFavoriteNeighbours; private RecyclerView mRecyclerView; + private int choice; /** * Create and return a new instance * @return @{@link NeighbourFragment} */ - public static NeighbourFragment newInstance() { + public static NeighbourFragment newInstance(int pos) { NeighbourFragment fragment = new NeighbourFragment(); + fragment.choice=pos; return fragment; } @@ -60,7 +64,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, */ private void initList() { mNeighbours = mApiService.getNeighbours(); - mRecyclerView.setAdapter(new MyNeighbourRecyclerViewAdapter(mNeighbours)); + + mRecyclerView.setAdapter(new MyNeighbourRecyclerViewAdapter(mNeighbours, choice !=0)); } @Override diff --git a/Android/Entrevoisins/app/src/main/res/drawable/baseline_arrow_back_24.xml b/Android/Entrevoisins/app/src/main/res/drawable/baseline_arrow_back_24.xml new file mode 100644 index 0000000..31e7df2 --- /dev/null +++ b/Android/Entrevoisins/app/src/main/res/drawable/baseline_arrow_back_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Android/Entrevoisins/app/src/main/res/drawable/baseline_language_24.xml b/Android/Entrevoisins/app/src/main/res/drawable/baseline_language_24.xml new file mode 100644 index 0000000..c0ef7e4 --- /dev/null +++ b/Android/Entrevoisins/app/src/main/res/drawable/baseline_language_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Android/Entrevoisins/app/src/main/res/drawable/baseline_location_on_24.xml b/Android/Entrevoisins/app/src/main/res/drawable/baseline_location_on_24.xml new file mode 100644 index 0000000..4bb0846 --- /dev/null +++ b/Android/Entrevoisins/app/src/main/res/drawable/baseline_location_on_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Android/Entrevoisins/app/src/main/res/drawable/baseline_phone_24.xml b/Android/Entrevoisins/app/src/main/res/drawable/baseline_phone_24.xml new file mode 100644 index 0000000..689637d --- /dev/null +++ b/Android/Entrevoisins/app/src/main/res/drawable/baseline_phone_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Android/Entrevoisins/app/src/main/res/drawable/ic_star_border_yellow_24dp.xml b/Android/Entrevoisins/app/src/main/res/drawable/ic_star_border_yellow_24dp.xml new file mode 100644 index 0000000..bf69de5 --- /dev/null +++ b/Android/Entrevoisins/app/src/main/res/drawable/ic_star_border_yellow_24dp.xml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/Android/Entrevoisins/app/src/main/res/drawable/ic_star_yellow_24dp.xml b/Android/Entrevoisins/app/src/main/res/drawable/ic_star_yellow_24dp.xml new file mode 100644 index 0000000..63ad6ad --- /dev/null +++ b/Android/Entrevoisins/app/src/main/res/drawable/ic_star_yellow_24dp.xml @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/Android/Entrevoisins/app/src/main/res/drawable/white_detail_block.xml b/Android/Entrevoisins/app/src/main/res/drawable/white_detail_block.xml new file mode 100644 index 0000000..11a9021 --- /dev/null +++ b/Android/Entrevoisins/app/src/main/res/drawable/white_detail_block.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/Android/Entrevoisins/app/src/main/res/layout/activity_neighbour_detail.xml b/Android/Entrevoisins/app/src/main/res/layout/activity_neighbour_detail.xml new file mode 100644 index 0000000..7a48cb3 --- /dev/null +++ b/Android/Entrevoisins/app/src/main/res/layout/activity_neighbour_detail.xml @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Android/Entrevoisins/app/src/main/res/layout/fragment_neighbour.xml b/Android/Entrevoisins/app/src/main/res/layout/fragment_neighbour.xml index 385952f..abccfc6 100644 --- a/Android/Entrevoisins/app/src/main/res/layout/fragment_neighbour.xml +++ b/Android/Entrevoisins/app/src/main/res/layout/fragment_neighbour.xml @@ -2,6 +2,7 @@ diff --git a/Android/Entrevoisins/app/src/main/res/navigation/nav_graph.xml b/Android/Entrevoisins/app/src/main/res/navigation/nav_graph.xml new file mode 100644 index 0000000..edd31b3 --- /dev/null +++ b/Android/Entrevoisins/app/src/main/res/navigation/nav_graph.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/Android/Entrevoisins/app/src/main/res/values-land/dimens.xml b/Android/Entrevoisins/app/src/main/res/values-land/dimens.xml new file mode 100644 index 0000000..10125a3 --- /dev/null +++ b/Android/Entrevoisins/app/src/main/res/values-land/dimens.xml @@ -0,0 +1,3 @@ + + 48dp + \ No newline at end of file diff --git a/Android/Entrevoisins/app/src/main/res/values-w1240dp/dimens.xml b/Android/Entrevoisins/app/src/main/res/values-w1240dp/dimens.xml new file mode 100644 index 0000000..ec434d3 --- /dev/null +++ b/Android/Entrevoisins/app/src/main/res/values-w1240dp/dimens.xml @@ -0,0 +1,3 @@ + + 200dp + \ No newline at end of file diff --git a/Android/Entrevoisins/app/src/main/res/values-w600dp/dimens.xml b/Android/Entrevoisins/app/src/main/res/values-w600dp/dimens.xml new file mode 100644 index 0000000..10125a3 --- /dev/null +++ b/Android/Entrevoisins/app/src/main/res/values-w600dp/dimens.xml @@ -0,0 +1,3 @@ + + 48dp + \ No newline at end of file diff --git a/Android/Entrevoisins/app/src/main/res/values/colors.xml b/Android/Entrevoisins/app/src/main/res/values/colors.xml index 885e153..becacc0 100644 --- a/Android/Entrevoisins/app/src/main/res/values/colors.xml +++ b/Android/Entrevoisins/app/src/main/res/values/colors.xml @@ -3,4 +3,6 @@ #03A9F4 #0287c3 #FF80AB + #454545 + #E2498E diff --git a/Android/Entrevoisins/app/src/main/res/values/strings.xml b/Android/Entrevoisins/app/src/main/res/values/strings.xml index c153138..07b5598 100644 --- a/Android/Entrevoisins/app/src/main/res/values/strings.xml +++ b/Android/Entrevoisins/app/src/main/res/values/strings.xml @@ -3,4 +3,13 @@ My neighbours Favorites New neighbour + NeighbourDetailActivity + + First Fragment + Second Fragment + Next + Previous + + Hello first fragment + Hello second fragment. Arg: %1$s diff --git a/Android/Entrevoisins/app/src/test/java/com/openclassrooms/entrevoisins/service/NeighbourServiceTest.java b/Android/Entrevoisins/app/src/test/java/com/openclassrooms/entrevoisins/service/NeighbourServiceTest.java index ebc1d06..4ffe675 100644 --- a/Android/Entrevoisins/app/src/test/java/com/openclassrooms/entrevoisins/service/NeighbourServiceTest.java +++ b/Android/Entrevoisins/app/src/test/java/com/openclassrooms/entrevoisins/service/NeighbourServiceTest.java @@ -3,6 +3,7 @@ import com.openclassrooms.entrevoisins.di.DI; import com.openclassrooms.entrevoisins.model.Neighbour; + import org.hamcrest.collection.IsIterableContainingInAnyOrder; import org.junit.Before; import org.junit.Test; @@ -11,8 +12,10 @@ import java.util.List; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; /** * Unit test on Neighbour service @@ -40,4 +43,19 @@ public void deleteNeighbourWithSuccess() { service.deleteNeighbour(neighbourToDelete); assertFalse(service.getNeighbours().contains(neighbourToDelete)); } + @Test + public void createNeighbourWithSuccess(){ + service.getNeighbours().clear(); + Neighbour neighbour = new Neighbour(1, "Emma", "https://i.pravatar.cc/150?u=a042581f4e29026706d", "Saint-Pierre-du-Mont ; 5km", + "+33 6 86 57 90 14", "Bonjour !Je souhaiterais faire de la marche nordique. Pas initiée, je recherche une ou plusieurs personnes susceptibles de m'accompagner !J'aime les jeux de cartes tels la belote et le tarot.."); + service.createNeighbour(neighbour); + assertEquals(1,service.getNeighbours().size()); + } + @Test + public void makeNeighbourFavoriteWithSuccess(){ + Neighbour neighbourToFavorite = service.getNeighbours().get(0); + neighbourToFavorite.setIsFavorite(true); + service.changeFavoriteStatus(neighbourToFavorite); + assertTrue(neighbourToFavorite.getIsFavorite()); + } } diff --git a/Android/Entrevoisins/build.gradle b/Android/Entrevoisins/build.gradle index e11a5b3..0998836 100644 --- a/Android/Entrevoisins/build.gradle +++ b/Android/Entrevoisins/build.gradle @@ -7,7 +7,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.3.2' + classpath 'com.android.tools.build:gradle:4.2.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/Android/Entrevoisins/gradle/wrapper/gradle-wrapper.properties b/Android/Entrevoisins/gradle/wrapper/gradle-wrapper.properties index e8ccc44..868959e 100644 --- a/Android/Entrevoisins/gradle/wrapper/gradle-wrapper.properties +++ b/Android/Entrevoisins/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip diff --git a/Android/Entrevoisins/images/ExecuterCompiler.JPG b/Android/Entrevoisins/images/ExecuterCompiler.JPG new file mode 100644 index 0000000..d139bbb Binary files /dev/null and b/Android/Entrevoisins/images/ExecuterCompiler.JPG differ