diff --git a/App/build.gradle b/App/build.gradle index 23023762..feac22fa 100755 --- a/App/build.gradle +++ b/App/build.gradle @@ -14,8 +14,8 @@ android { defaultConfig { minSdkVersion 15 targetSdkVersion 22 - versionCode 420 - versionName "4.2.0" + versionCode 421 + versionName "4.2.1" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } @@ -34,8 +34,10 @@ android { buildTypes { debug { resValue "string", "personal_android_key", defaultKey + testCoverageEnabled = true if (file("personal-android-key.txt").exists()) { resValue "string", "personal_android_key", file("personal-android-key.txt").getText() + testCoverageEnabled = false // local variables aren't shown when debugging if this is enabled, so we disable if this is developer environment } } release { @@ -46,10 +48,6 @@ android { signingConfig signingConfigs.release } } - debug { - testCoverageEnabled = true - } - } @@ -118,21 +116,13 @@ dependencies { compile 'com.fasterxml.jackson.core:jackson-annotations:2.6.3' compile 'com.fasterxml.jackson.core:jackson-databind:2.6.3' - compile 'com.fasterxml.jackson.core:jackson-core:2.6.3' - compile 'com.fasterxml.jackson.core:jackson-annotations:2.6.3' - compile 'com.fasterxml.jackson.core:jackson-databind:2.6.3' - // Espresso androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' androidTestCompile 'com.android.support.test:testing-support-lib:0.1' androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0') { exclude group: 'com.android.support' - - } - - // Mockito androidTestCompile 'org.mockito:mockito-core:1.9.5' androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.1' @@ -143,7 +133,4 @@ dependencies { // Android-compatible but recent version of HttpClient androidTestCompile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1' - - - } diff --git a/App/src/main/java/cc/softwarefactory/lokki/android/MainApplication.java b/App/src/main/java/cc/softwarefactory/lokki/android/MainApplication.java index 74d6063b..40e7b3c2 100644 --- a/App/src/main/java/cc/softwarefactory/lokki/android/MainApplication.java +++ b/App/src/main/java/cc/softwarefactory/lokki/android/MainApplication.java @@ -144,112 +144,20 @@ public void setIdMapping(Map idMapping) { public static MainUser user; - /** - * User's contacts is a map, where key is email (which is id) and value is the contact. - */ - @JsonIgnoreProperties("mapping") - public static class Contacts extends JSONMap { - - private HashMap contacts = new HashMap<>(); - - @Override - protected Map getMap() { - return contacts; - } - - /** - * Handles functionality of the mapping-field. nameToEmail is not mapped from JSON, - * because it is easier to keep in sync if it's functionality is handled in this class. - */ - @JsonIgnore - private HashMap nameToEmail = new HashMap<>(); - - public boolean hasEmail(String email) { - return contacts.containsKey(email); - } - - public List contacts() { - return new ArrayList(contacts.values()); - } - - public List names() { - return new ArrayList(nameToEmail.keySet()); - } - - public boolean hasName(String name) { - return nameToEmail.containsKey(name); - } - - public Contact getContactByEmail(String email) { - return contacts.get(email); - } - - public String getEmailByName(String name) { - return nameToEmail.get(name); - } - - public void update(String email, Contact contact) { - nameToEmail.put(contact.getName(), email); - super.put(email, contact); - } - - @Override - public void clear() { - super.clear(); - nameToEmail.clear(); - } - - @Override - public Contact put(String key, Contact value) { - nameToEmail.put(value.getName(), key); - return super.put(key, value); - } - - @Override - public void putAll(Map map) { - for (Entry entry : map.entrySet()) { - nameToEmail.put(entry.getValue().getName(), entry.getKey()); - } - super.putAll(map); - } - - @Override - public Contact remove(Object key) { - nameToEmail.remove(super.get(key).getName()); - return super.remove(key); - } - } public static List contacts; - - /** - * Contacts that aren't shown on the map. Format: - * { - * "test.friend@example.com":1, - * "family.member@example.com":1 - * } - */ - public static class IDontWantToSee extends JSONMap { - - private Map iDontWantToSee = new HashMap<>(); - - @Override - protected Map getMap() { - return iDontWantToSee; - } - } - public static IDontWantToSee iDontWantToSee; /** * Is the user visible to others? */ public static Boolean visible = true; + public static LruCache avatarCache; public static List places; public static boolean locationDisabledPromptShown; - public static List buzzPlaces; + public static boolean firstTimeZoom = true; @Override @@ -274,19 +182,6 @@ protected int sizeOf(String key, Bitmap bitmap) { } }; - String iDontWantToSeeString = PreferenceUtils.getString(this, PreferenceUtils.KEY_I_DONT_WANT_TO_SEE); - if (!iDontWantToSeeString.isEmpty()) { - try { - MainApplication.iDontWantToSee = JsonUtils.createFromJson(iDontWantToSeeString, IDontWantToSee.class); - } catch (IOException e) { - MainApplication.iDontWantToSee = null; - Log.e(TAG, e.getMessage()); - } - } else { - MainApplication.iDontWantToSee = new MainApplication.IDontWantToSee(); - } - Log.d(TAG, "MainApplication.iDontWantToSee: " + MainApplication.iDontWantToSee); - if (DEVELOPER_MODE) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() @@ -301,7 +196,7 @@ protected int sizeOf(String key, Bitmap bitmap) { .build()); } - buzzPlaces = new ArrayList(); + buzzPlaces = new ArrayList<>(); user = new MainUser(this); diff --git a/App/src/main/java/cc/softwarefactory/lokki/android/activities/MainActivity.java b/App/src/main/java/cc/softwarefactory/lokki/android/activities/MainActivity.java index a282e9e0..c97148d5 100644 --- a/App/src/main/java/cc/softwarefactory/lokki/android/activities/MainActivity.java +++ b/App/src/main/java/cc/softwarefactory/lokki/android/activities/MainActivity.java @@ -38,17 +38,14 @@ import com.androidquery.AQuery; import com.androidquery.callback.AjaxCallback; import com.androidquery.callback.AjaxStatus; -import com.fasterxml.jackson.core.JsonProcessingException; import org.json.JSONException; -import java.io.IOException; import java.util.Arrays; +import java.util.List; import cc.softwarefactory.lokki.android.MainApplication; import cc.softwarefactory.lokki.android.R; -import cc.softwarefactory.lokki.android.datasources.contacts.ContactDataSource; -import cc.softwarefactory.lokki.android.datasources.contacts.DefaultContactDataSource; import cc.softwarefactory.lokki.android.fragments.AboutFragment; import cc.softwarefactory.lokki.android.fragments.AddContactsFragment; import cc.softwarefactory.lokki.android.fragments.ContactsFragment; @@ -61,7 +58,6 @@ import cc.softwarefactory.lokki.android.models.Contact; import cc.softwarefactory.lokki.android.services.ContactService; import cc.softwarefactory.lokki.android.utilities.AnalyticsUtils; -import cc.softwarefactory.lokki.android.utilities.JsonUtils; import cc.softwarefactory.lokki.android.utilities.PreferenceUtils; import cc.softwarefactory.lokki.android.utilities.ServerApi; import cc.softwarefactory.lokki.android.utilities.Utils; @@ -87,9 +83,8 @@ public class MainActivity extends AppCompatActivity implements NavigationDrawerF private CharSequence mTitle; private int selectedOption = 0; - private ContactDataSource mContactDataSource; - private ContactService contactService; + private List phoneContacts; //Is this activity currently paused? private boolean paused = true; @@ -98,7 +93,6 @@ public class MainActivity extends AppCompatActivity implements NavigationDrawerF protected void onCreate(Bundle savedInstanceState) { Log.d(TAG, "onCreate"); - mContactDataSource = new DefaultContactDataSource(); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); @@ -128,6 +122,7 @@ public void onClick(View v) { } contactService = new ContactService(this); + phoneContacts = contactService.getPhoneContacts(); } /** @@ -430,7 +425,6 @@ public void onNavigationDrawerItemSelected(int position) { @Override public boolean onCreateOptionsMenu(Menu menu) { - return true; } @@ -501,8 +495,8 @@ public boolean onOptionsItemSelected(MenuItem item) { case R.id.add_contacts: // In Contacts (to add new ones) FragmentManager fragmentManager = getSupportFragmentManager(); - AddContactsFragment acf = new AddContactsFragment(); - acf.setContactUtils(mContactDataSource); + AddContactsFragment acf = new AddContactsFragment(this); + acf.setPhoneContacts(phoneContacts); fragmentManager.beginTransaction().replace(R.id.container, acf, TAG_ADD_CONTACTS_FRAGMENT).commit(); selectedOption = -10; @@ -608,7 +602,7 @@ private void showUserInMap(Contact contact) { // Used in Contacts mNavigationDrawerFragment.selectNavDrawerItem(1); // Position 1 is the Map } - public void toggleIDontWantToSee(View view) { + public void toggleIgnore(View view) { AnalyticsUtils.eventHit(getString(R.string.analytics_category_ux), getString(R.string.analytics_action_click), getString(R.string.analytics_label_show_on_map_checkbox)); @@ -616,29 +610,12 @@ public void toggleIDontWantToSee(View view) { return; } CheckBox checkBox = (CheckBox) view; - Boolean allow = checkBox.isChecked(); Contact contact = (Contact) checkBox.getTag(); - Log.d(TAG, "toggleIDontWantToSee: " + contact.toString() + ", Checkbox is: " + allow); - if (!allow) { - MainApplication.iDontWantToSee.put(contact.getEmail(), 1); - try { - Log.d(TAG, JsonUtils.serialize(MainApplication.iDontWantToSee)); - PreferenceUtils.setString(this, PreferenceUtils.KEY_I_DONT_WANT_TO_SEE, JsonUtils.serialize(MainApplication.iDontWantToSee)); - } catch (JsonProcessingException e) { - Log.e(TAG, "Serializing iDontWantToSee to JSON failed"); - e.printStackTrace(); - } - contactService.ignoreContact(contact); - } else if (MainApplication.iDontWantToSee.has(contact.getEmail())) { - Log.d(TAG, "unignoring user"); - MainApplication.iDontWantToSee.remove(contact.getEmail()); - try { - PreferenceUtils.setString(this, PreferenceUtils.KEY_I_DONT_WANT_TO_SEE, JsonUtils.serialize(MainApplication.iDontWantToSee)); - } catch (JsonProcessingException e) { - Log.e(TAG, "Serializing iDontWantToSee to JSON failed"); - e.printStackTrace(); - } + Log.d(TAG, "toggle ignore for contact : " + contact.toString() + ", isIgnored : " + contact.isIgnored()); + if (contact.isIgnored()) { contactService.unignoreContact(contact); + } else { + contactService.ignoreContact(contact); } } @@ -647,11 +624,9 @@ public void toggleUserCanSeeMe(View view) { // Used in Contacts getString(R.string.analytics_action_click), getString(R.string.analytics_label_can_see_me_checkbox)); if (view != null) { - CheckBox checkBox = (CheckBox) view; - Boolean allow = checkBox.isChecked(); - Contact contact = (Contact) checkBox.getTag(); - Log.d(TAG, "toggleUserCanSeeMe: " + contact.getEmail() + ", Checkbox is: " + allow); - if (!allow) { + Contact contact = (Contact) view.getTag(); + Log.d(TAG, "toggleUserCanSeeMe: " + contact.getEmail() + ", Checkbox is: " + contact.isCanSeeMe()); + if (contact.isCanSeeMe()) { contactService.disallowContact(contact); } else { contactService.allowContacts(Arrays.asList(contact), new AjaxCallback() { @@ -724,11 +699,6 @@ public void onReceive(Context context, Intent intent) { } }; - // For dependency injection - public void setContactUtils(ContactDataSource contactDataSource) { - this.mContactDataSource = contactDataSource; - } - public void logout(){ final MainActivity main = this; new AlertDialog.Builder(main) @@ -741,7 +711,6 @@ public void onClick(DialogInterface dialog, int which){ PreferenceUtils.setString(main, PreferenceUtils.KEY_USER_ACCOUNT, null); PreferenceUtils.setString(main, PreferenceUtils.KEY_USER_ID, null); PreferenceUtils.setString(main, PreferenceUtils.KEY_AUTH_TOKEN, null); - PreferenceUtils.setString(main, PreferenceUtils.KEY_I_DONT_WANT_TO_SEE, null); PreferenceUtils.setString(main, PreferenceUtils.KEY_CONTACTS, null); PreferenceUtils.setString(main, PreferenceUtils.KEY_DASHBOARD, null); PreferenceUtils.setString(main, PreferenceUtils.KEY_LOCAL_CONTACTS, null); @@ -750,7 +719,6 @@ public void onClick(DialogInterface dialog, int which){ MainApplication.dashboard = null; MainApplication.contacts = null; MainApplication.places = null; - MainApplication.iDontWantToSee = new MainApplication.IDontWantToSee(); MainApplication.firstTimeZoom = true; //Restart main activity to clear state main.recreate(); @@ -760,4 +728,10 @@ public void onClick(DialogInterface dialog, int which){ .show(); } + public void setPhoneContacts(List phoneContacts) { + this.phoneContacts = phoneContacts; + AddContactsFragment acf = new AddContactsFragment(this); + acf.setPhoneContacts(phoneContacts); + } + } diff --git a/App/src/main/java/cc/softwarefactory/lokki/android/fragments/AddContactsFragment.java b/App/src/main/java/cc/softwarefactory/lokki/android/fragments/AddContactsFragment.java index 160bdc3a..ae629780 100644 --- a/App/src/main/java/cc/softwarefactory/lokki/android/fragments/AddContactsFragment.java +++ b/App/src/main/java/cc/softwarefactory/lokki/android/fragments/AddContactsFragment.java @@ -50,8 +50,8 @@ public class AddContactsFragment extends Fragment { private static final String TAG = "AddContacts"; - private ContactDataSource mContactDataSource; private List contactList; + private List phoneContacts; private AQuery aq; private Boolean cancelAsynTasks = false; private Context context; @@ -62,20 +62,21 @@ public class AddContactsFragment extends Fragment { private TextView noContactsMessage; private ContactService contactService; - public AddContactsFragment() { + public AddContactsFragment(Context context) { + this.context = context; + this.contactService = new ContactService(context); contactList = new ArrayList<>(); - mContactDataSource = new DefaultContactDataSource(); + phoneContacts = new ArrayList<>(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.activity_add_contacts, container, false); aq = new AQuery(getActivity(), rootView); cancelAsynTasks = false; context = getActivity().getApplicationContext(); - avatarLoader = new AvatarLoader(); contactService = new ContactService(context); + avatarLoader = new AvatarLoader(); inputSearch = (EditText) rootView.findViewById(R.id.add_contact_search); inputSearch.setEnabled(false); inputSearch.setAlpha(0); @@ -104,6 +105,10 @@ private void loadContacts() { new getAllEmailAddressesAsync().execute(); } + public void setPhoneContacts(List phoneContacts) { + this.phoneContacts = phoneContacts; + } + private void enableSearchFilter() { inputSearch.addTextChangedListener(new TextWatcher() { @@ -149,21 +154,16 @@ public void onClick(View v) { }); } - - public void setContactUtils(ContactDataSource contactDataSource) { - this.mContactDataSource = contactDataSource; - } - private class getAllEmailAddressesAsync extends AsyncTask> { @Override protected List doInBackground(Void... params) { - return mContactDataSource.getContacts(context); + return phoneContacts; } @Override protected void onPostExecute(List phoneContacts) { - Log.d(TAG, "Number of contacts: " + phoneContacts.size()); + Log.d(TAG, "Number of contacts: " + phoneContacts.size()); Log.d(TAG, "Contacts: " + phoneContacts); // We create a dictionary for performance. @@ -236,7 +236,6 @@ public void onClick(DialogInterface dialog, int which) { AnalyticsUtils.eventHit(getString(R.string.analytics_category_ux), getString(R.string.analytics_action_click), getString(R.string.analytics_label_confirm_contact_add_from_list_dialog)); - if (contact.emailIsSameAs(MainApplication.user.getEmail())) { Toast.makeText(context, R.string.cant_add_self_as_contact, Toast.LENGTH_LONG).show(); } else { @@ -252,8 +251,8 @@ public void callback(String url, String result, AjaxStatus status) { contactService.getContacts(); Toast.makeText(context, R.string.contact_added, Toast.LENGTH_SHORT).show(); } - } - }); + } + }); } } }) @@ -263,7 +262,6 @@ public void onClick(DialogInterface dialog, int which) { AnalyticsUtils.eventHit(getString(R.string.analytics_category_ux), getString(R.string.analytics_action_click), getString(R.string.analytics_label_cancel_contact_add_from_list_dialog)); - } }) .show(); diff --git a/App/src/main/java/cc/softwarefactory/lokki/android/fragments/MapViewFragment.java b/App/src/main/java/cc/softwarefactory/lokki/android/fragments/MapViewFragment.java index a7c0f799..9417aa5b 100644 --- a/App/src/main/java/cc/softwarefactory/lokki/android/fragments/MapViewFragment.java +++ b/App/src/main/java/cc/softwarefactory/lokki/android/fragments/MapViewFragment.java @@ -48,6 +48,7 @@ import com.google.maps.android.clustering.ClusterManager; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -84,7 +85,7 @@ public class MapViewFragment extends Fragment { private Context context; private double radiusMultiplier = 0.9; // Dont want to fill the screen from edge to edge... private GoogleMap map; - private List markers; + private HashMap markers; private LatLng startLocation = null; private SupportMapFragment fragment; private TextView placeAddingTip; @@ -92,7 +93,7 @@ public class MapViewFragment extends Fragment { private ContactService contactService; public MapViewFragment() { - markers = new ArrayList<>(); + markers = new HashMap(); placesOverlay = new ArrayList<>(); } @@ -558,14 +559,26 @@ protected void onPostExecute(Bitmap bitmapResult) { if (bitmapResult == null || cancelAsyncTasks || !isAdded() || map == null) { return; } - Person marker = person; - - if (!markers.contains(marker)) { - markers.add(marker); + Person marker = null; + try{ + marker = (Person) person.clone(); + } + catch (CloneNotSupportedException e){ + Log.e(TAG, e.getMessage()); + return; + } + Person oldMarker = markers.get(marker.getEmail()); + if (oldMarker ==null) { + Log.v(TAG, "Adding newmarker:" + marker.toString() + " Position:" + marker.getPosition().toString()); + markers.put(marker.getEmail(), marker); clusterManager.addItem(marker); } else { - clusterManager.removeItem(marker); + Log.v(TAG, "Removing old marker:" + marker.toString() + " Position:" + oldMarker.getPosition().toString()); + clusterManager.removeItem(oldMarker); + markers.remove(oldMarker); + Log.v(TAG, "Updating marker:" + marker.toString() + " Position:" + marker.getPosition().toString()); clusterManager.addItem(marker); + markers.put(marker.getEmail(), marker); } if (marker.getEmail().equals(MainApplication.emailBeingTracked)) { diff --git a/App/src/main/java/cc/softwarefactory/lokki/android/models/Person.java b/App/src/main/java/cc/softwarefactory/lokki/android/models/Person.java index 6b2d6cfe..851b19d2 100644 --- a/App/src/main/java/cc/softwarefactory/lokki/android/models/Person.java +++ b/App/src/main/java/cc/softwarefactory/lokki/android/models/Person.java @@ -9,7 +9,7 @@ import java.util.Date; -public abstract class Person implements ClusterItem { +public abstract class Person implements ClusterItem, Cloneable { private String userId; private String email; private UserLocation location; @@ -75,4 +75,9 @@ public Bitmap getMarkerPhoto() { public void setMarkerPhoto(Bitmap markerPhoto) { this.markerPhoto = markerPhoto; } + + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } } diff --git a/App/src/main/java/cc/softwarefactory/lokki/android/models/Place.java b/App/src/main/java/cc/softwarefactory/lokki/android/models/Place.java index d2aeaef7..6c56c10f 100644 --- a/App/src/main/java/cc/softwarefactory/lokki/android/models/Place.java +++ b/App/src/main/java/cc/softwarefactory/lokki/android/models/Place.java @@ -10,7 +10,6 @@ public class Place implements Comparable { private String img; // Place image private UserLocation location; // place location - public String getId() { return id; } @@ -27,7 +26,6 @@ public void setName(String name) { this.name = name; } - public UserLocation getLocation() { return location; } diff --git a/App/src/main/java/cc/softwarefactory/lokki/android/services/ApiService.java b/App/src/main/java/cc/softwarefactory/lokki/android/services/ApiService.java index 7e1760ed..48ffb080 100644 --- a/App/src/main/java/cc/softwarefactory/lokki/android/services/ApiService.java +++ b/App/src/main/java/cc/softwarefactory/lokki/android/services/ApiService.java @@ -18,7 +18,6 @@ /** * Base class for all API services. Implementing classes should handle objects CRUD-operations and cache. - * Currently it is assumed, that all JSON is sent as objects. JSON can be gotten as lists also. */ public abstract class ApiService { diff --git a/App/src/main/java/cc/softwarefactory/lokki/android/services/ContactService.java b/App/src/main/java/cc/softwarefactory/lokki/android/services/ContactService.java index 4cd4c896..9d97177e 100644 --- a/App/src/main/java/cc/softwarefactory/lokki/android/services/ContactService.java +++ b/App/src/main/java/cc/softwarefactory/lokki/android/services/ContactService.java @@ -12,7 +12,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.json.JSONException; -import org.json.JSONObject; import java.io.IOException; import java.util.ArrayList; @@ -36,8 +35,12 @@ public class ContactService extends ApiService { public ContactService(Context context) { super(context); + generatePhoneContactsMapFromList(new DefaultContactDataSource().getContacts(context)); + } + + private void generatePhoneContactsMapFromList(List phoneContactsList) { phoneContacts = new HashMap<>(); - for(Contact contact : new DefaultContactDataSource().getContacts(context)) { + for(Contact contact : phoneContactsList) { if (contact.getEmail() != null) phoneContacts.put(contact.getEmail(), contact); } @@ -58,7 +61,7 @@ private boolean contactIdIsValid(Contact contact) { return (contact != null && contact.getUserId() != null); } private boolean contactRequestIsValid(ContactsRequest request) { - return (request.emails != null && request.emails.size() > 0); + return (request.getItems() != null && request.getItems().size() > 0); } public void getContacts() { @@ -100,26 +103,80 @@ public List getContactsVisibleToMe() { return visible; } - private class ContactsRequest { - public List emails = new ArrayList<>(); - - private void addEmail(Contact contact) { - if (contact != null && contact.getEmail() != null) emails.add(contact.getEmail()); - } + private abstract class ContactsRequest { + protected abstract void addItem(Contact contact); + protected abstract List getItems(); + protected abstract void initalizeItems(); public ContactsRequest(List contacts) { - for (Contact contact : contacts) addEmail(contact); + initalizeItems(); + for (Contact contact : contacts) addItem(contact); } public ContactsRequest(Contact contact) { - addEmail(contact); + initalizeItems(); + addItem(contact); + } + } + + private class AllowContactsRequest extends ContactsRequest { + public List emails; + + public AllowContactsRequest(List contacts) { + super(contacts); + } + + public AllowContactsRequest(Contact contact) { + super(contact); + } + + @Override + protected void addItem(Contact contact) { + if (contact != null && contact.getEmail() != null) emails.add(contact.getEmail()); + } + + @Override + protected List getItems() { + return emails; + } + + @Override + protected void initalizeItems() { + emails = new ArrayList<>(); + } + } + + private class IgnoreContactsRequest extends ContactsRequest { + public List ids; + + public IgnoreContactsRequest(List contacts) { + super(contacts); + } + + public IgnoreContactsRequest(Contact contact) { + super(contact); + } + + @Override + protected void addItem(Contact contact) { + if (contact != null && contact.getUserId() != null) ids.add(contact.getUserId()); + } + + @Override + protected List getItems() { + return ids; + } + + @Override + protected void initalizeItems() { + ids = new ArrayList<>(); } } // If you call this, you must manually remember to update contacts with getContacts() in cb. public void allowContacts(List contacts, AjaxCallback cb) { Log.d(TAG, "allowPeople"); - ContactsRequest request = new ContactsRequest(contacts); + ContactsRequest request = new AllowContactsRequest(contacts); if (!contactRequestIsValid(request)) { Log.e(TAG, "Attempted to allow 0 emails"); return; @@ -160,7 +217,7 @@ public void callback(String url, String result, AjaxStatus status) { public void ignoreContact(Contact contact) { Log.d(TAG, "ignoreUsers"); - ContactsRequest request = new ContactsRequest(contact); + ContactsRequest request = new IgnoreContactsRequest(contact); if (!contactRequestIsValid(request)) { Log.e(TAG, "Attempted to ignore invalid email"); return; @@ -267,6 +324,15 @@ public List getFromCache() throws IOException { return JsonUtils.createListFromJson(PreferenceUtils.getString(context, getCacheKey()), Contact.class); } + public List getPhoneContacts() { + return new ArrayList(phoneContacts.values()); + } + + // for dependency injenction + public void setPhoneContacts(List phoneContacts) { + generatePhoneContactsMapFromList(phoneContacts); + } + private Contact getSynchronizedWithPhone(Contact contact) { Contact synchronizedContact = new Contact(); Contact phoneContact = phoneContacts.get(contact.getEmail()); diff --git a/App/src/main/java/cc/softwarefactory/lokki/android/utilities/PreferenceUtils.java b/App/src/main/java/cc/softwarefactory/lokki/android/utilities/PreferenceUtils.java index dda348ea..1ca3a77d 100644 --- a/App/src/main/java/cc/softwarefactory/lokki/android/utilities/PreferenceUtils.java +++ b/App/src/main/java/cc/softwarefactory/lokki/android/utilities/PreferenceUtils.java @@ -11,7 +11,6 @@ public class PreferenceUtils { public static final String KEY_USER_ACCOUNT = "userAccount"; public static final String KEY_USER_ID = "userId"; public static final String KEY_CONTACTS = "contacts"; - public static final String KEY_I_DONT_WANT_TO_SEE = "iDontWantToSee"; public static final String KEY_DEVICE_ID = "deviceId"; public static final String KEY_DASHBOARD = "dashboard"; public static final String KEY_PLACES = "places"; diff --git a/App/src/main/res/layout/people_row_layout.xml b/App/src/main/res/layout/people_row_layout.xml index a0daf42d..2aeb8a4f 100644 --- a/App/src/main/res/layout/people_row_layout.xml +++ b/App/src/main/res/layout/people_row_layout.xml @@ -98,7 +98,7 @@ android:layout_marginStart="50dp" android:layout_marginTop="13dp" android:gravity="end" - android:onClick="toggleIDontWantToSee" + android:onClick="toggleIgnore" android:layout_marginRight="90dp" android:layout_marginEnd="90dp" /> @@ -110,7 +110,7 @@ android:id="@+id/people_context_menu_button" android:background="@drawable/ic_menu_overflow_dark" android:layout_marginTop="13dp" - android:onClick="toggleIDontWantToSee" + android:onClick="toggleIgnore" android:layout_marginRight="5dp" android:layout_marginEnd="5dp" /> diff --git a/App/src/test/java/cc/softwarefactory/lokki/android/espresso/AddContactsScreenTest.java b/App/src/test/java/cc/softwarefactory/lokki/android/espresso/AddContactsScreenTest.java index 245ba36e..9df2f040 100644 --- a/App/src/test/java/cc/softwarefactory/lokki/android/espresso/AddContactsScreenTest.java +++ b/App/src/test/java/cc/softwarefactory/lokki/android/espresso/AddContactsScreenTest.java @@ -1,25 +1,28 @@ package cc.softwarefactory.lokki.android.espresso; import android.content.Context; +import android.provider.ContactsContract; import android.support.test.espresso.action.ViewActions; +import android.test.mock.MockContentProvider; +import android.test.mock.MockContentResolver; import com.squareup.okhttp.mockwebserver.MockResponse; import com.squareup.okhttp.mockwebserver.RecordedRequest; -import org.json.JSONArray; import org.json.JSONException; -import org.json.JSONObject; import org.mockito.Mockito; import java.io.IOException; +import java.util.List; import java.util.concurrent.TimeoutException; import cc.softwarefactory.lokki.android.R; -import cc.softwarefactory.lokki.android.datasources.contacts.ContactDataSource; import cc.softwarefactory.lokki.android.espresso.utilities.MockJsonUtils; import cc.softwarefactory.lokki.android.espresso.utilities.RequestsHandle; import cc.softwarefactory.lokki.android.espresso.utilities.TestUtils; +import cc.softwarefactory.lokki.android.fragments.AddContactsFragment; import cc.softwarefactory.lokki.android.models.Contact; +import cc.softwarefactory.lokki.android.services.ContactService; import cc.softwarefactory.lokki.android.utilities.JsonUtils; import static android.support.test.espresso.Espresso.onView; @@ -34,8 +37,6 @@ import static android.support.test.espresso.matcher.ViewMatchers.withId; import static android.support.test.espresso.matcher.ViewMatchers.withText; import static org.hamcrest.Matchers.allOf; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.when; public class AddContactsScreenTest extends LoggedInBaseTest { @@ -48,9 +49,8 @@ public void setUp() throws Exception { } private void setMockContacts() throws IOException, JSONException { - ContactDataSource mockContactDataSource = Mockito.mock(ContactDataSource.class); - when(mockContactDataSource.getContacts(any(Context.class))).thenReturn(JsonUtils.createListFromJson(MockJsonUtils.getContactsJson(), Contact.class)); - getActivity().setContactUtils(mockContactDataSource); + List mockPhoneContacts = JsonUtils.createListFromJson(MockJsonUtils.getContactsJson(), Contact.class); + getActivity().setPhoneContacts(mockPhoneContacts); } private void enterContactsScreen() {