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..ec89e042 100644 --- a/App/src/main/java/cc/softwarefactory/lokki/android/MainApplication.java +++ b/App/src/main/java/cc/softwarefactory/lokki/android/MainApplication.java @@ -11,25 +11,17 @@ import android.support.v4.util.LruCache; import android.util.Log; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; import com.google.android.gms.maps.GoogleMap; -import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; import cc.softwarefactory.lokki.android.models.BuzzPlace; import cc.softwarefactory.lokki.android.models.Contact; -import cc.softwarefactory.lokki.android.models.JSONMap; import cc.softwarefactory.lokki.android.models.MainUser; import cc.softwarefactory.lokki.android.models.Place; import cc.softwarefactory.lokki.android.models.User; import cc.softwarefactory.lokki.android.utilities.AnalyticsUtils; -import cc.softwarefactory.lokki.android.utilities.JsonUtils; import cc.softwarefactory.lokki.android.utilities.PreferenceUtils; public class MainApplication extends Application { @@ -74,182 +66,25 @@ public class MainApplication extends Application { * "visibility":true * } */ - public static class Dashboard extends User { - /** - * List of user ids that can see me - */ - @JsonProperty("canseeme") - private List canSeeMe; - /** - * Map where key is user id and value is the user object. Users that I can see. - */ - @JsonProperty("icansee") - private Map iCanSee; - - /** - * Map between user ids and email addresses. - */ - @JsonProperty("idmapping") - private Map idMapping; - - public List getUserIdsICanSee() { - return new ArrayList(iCanSee.keySet()); - } - - public List getUserIds() { - return new ArrayList(idMapping.keySet()); - } - - public String getEmailByUserId(String userId) { - return idMapping.get(userId); - } - - public boolean containsEmail(String email) { - for (String containedEmail : idMapping.values()) { - if (email.equals(containedEmail)) return true; - } - return false; - } - - public User getUserICanSeeByUserId(String userId) { - return iCanSee.get(userId); - } - - public List getCanSeeMe() { - return canSeeMe; - } - - public void setCanSeeMe(List canSeeMe) { - this.canSeeMe = canSeeMe; - } - - public Map getiCanSee() { - return iCanSee; - } - - public void setiCanSee(Map iCanSee) { - this.iCanSee = iCanSee; - } - - public Map getIdMapping() { - return idMapping; - } - - public void setIdMapping(Map idMapping) { - this.idMapping = idMapping; - } - } - public static Dashboard dashboard = null; + public static User dashboard = null; 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 +109,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 +123,7 @@ protected int sizeOf(String key, Bitmap bitmap) { .build()); } - buzzPlaces = new ArrayList(); + buzzPlaces = new ArrayList<>(); user = new MainUser(this); @@ -312,6 +134,7 @@ private void loadSetting() { PreferenceManager.setDefaultValues(this, R.xml.preferences, false); visible = PreferenceUtils.getBoolean(getApplicationContext(), PreferenceUtils.KEY_SETTING_VISIBILITY); Log.d(TAG, "Visible: " + visible); + dashboard.setVisibility(visible); // get mapValue from preferences try { @@ -323,3 +146,4 @@ private void loadSetting() { } } } + 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..e3e0f383 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; @@ -60,8 +57,8 @@ import cc.softwarefactory.lokki.android.androidServices.LocationService; import cc.softwarefactory.lokki.android.models.Contact; import cc.softwarefactory.lokki.android.services.ContactService; +import cc.softwarefactory.lokki.android.services.UserPreferenceService; 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,18 +84,16 @@ 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; + private UserPreferenceService userPreferenceService; @Override protected void onCreate(Bundle savedInstanceState) { Log.d(TAG, "onCreate"); - mContactDataSource = new DefaultContactDataSource(); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); @@ -128,6 +123,8 @@ public void onClick(View v) { } contactService = new ContactService(this); + phoneContacts = contactService.getPhoneContacts(); + userPreferenceService = new UserPreferenceService(this); } /** @@ -223,7 +220,7 @@ protected void onResume() { Log.i(TAG, "onResume - check if dashboard is null"); if (MainApplication.dashboard == null) { Log.w(TAG, "onResume - dashboard was null, get dashboard from server"); - ServerApi.getDashboard(getApplicationContext()); + userPreferenceService.getDashboard(getApplicationContext()); } if (MainApplication.contacts == null) { Log.w(TAG, "onResume - dashboard was null, get contacts from server"); @@ -430,7 +427,6 @@ public void onNavigationDrawerItemSelected(int position) { @Override public boolean onCreateOptionsMenu(Menu menu) { - return true; } @@ -501,8 +497,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 +604,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 +612,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 +626,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 +701,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 +713,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 +721,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 +730,11 @@ 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/models/Contact.java b/App/src/main/java/cc/softwarefactory/lokki/android/models/Contact.java index cd3a7b7c..27523fe6 100644 --- a/App/src/main/java/cc/softwarefactory/lokki/android/models/Contact.java +++ b/App/src/main/java/cc/softwarefactory/lokki/android/models/Contact.java @@ -10,9 +10,14 @@ public class Contact extends Person implements Comparable { @Override public int compareTo(Contact another) { - if (this.getName() != null && another.getName() != null) + if (this.getName() != null && another.getName() != null){ + if(this.getName().equalsIgnoreCase(another.getName())){ + return this.getEmail().compareTo(another.getEmail()); + } return this.getName().compareTo(another.getName()); - return this.getEmail().compareTo(another.getEmail()); + } + else + return this.getEmail().compareTo(another.getEmail()); } public String getName() { diff --git a/App/src/main/java/cc/softwarefactory/lokki/android/models/User.java b/App/src/main/java/cc/softwarefactory/lokki/android/models/User.java index 3dc89f7c..f3cbaf27 100644 --- a/App/src/main/java/cc/softwarefactory/lokki/android/models/User.java +++ b/App/src/main/java/cc/softwarefactory/lokki/android/models/User.java @@ -10,6 +10,7 @@ public class User { private UserLocation location; // track user location private boolean visibility; // define visibility scope private String battery; // battery status house keeping info + private String serverMessage; public String getBattery() { return battery; @@ -42,4 +43,12 @@ public void setLocation(UserLocation location) { this.location = location; } + public String getServerMessage() { + return serverMessage; + } + + public void setServerMessage(String serverMessage) { + this.serverMessage = serverMessage; + } } + diff --git a/App/src/main/java/cc/softwarefactory/lokki/android/models/UserPreference.java b/App/src/main/java/cc/softwarefactory/lokki/android/models/UserPreference.java new file mode 100644 index 00000000..0a119caf --- /dev/null +++ b/App/src/main/java/cc/softwarefactory/lokki/android/models/UserPreference.java @@ -0,0 +1,66 @@ +package cc.softwarefactory.lokki.android.models; + +/** + * Created by panchamu on 16.11.2015. + */ + +public class UserPreference { + + private String battery; + private UserLocation location; + private boolean visibility; + private int mapMode; + private boolean shareUsageData; + private boolean receiveExpirimentalFeature; + + public String getBattery() { + return battery; + } + + public void setBattery(String battery) { + this.battery = battery; + } + + public UserLocation getLocation() { + return location; + } + + public void setLocation(UserLocation location) { + this.location = location; + } + + public boolean isVisibility() { + return visibility; + } + + public void setVisibility(boolean visibility) { + this.visibility = visibility; + } + + public int getMapMode() { + return mapMode; + } + + public void setMapMode(int mapMode) { + this.mapMode = mapMode; + } + + public boolean isShareUsageData() { + return shareUsageData; + } + + public void setShareUsageData(boolean shareUsageData) { + this.shareUsageData = shareUsageData; + } + + public boolean isReceiveExpirimentalFeature() { + return receiveExpirimentalFeature; + } + + public void setReceiveExpirimentalFeature(boolean receiveExpirimentalFeature) { + this.receiveExpirimentalFeature = receiveExpirimentalFeature; + } + + +} + diff --git a/App/src/main/java/cc/softwarefactory/lokki/android/services/UserPreferenceService.java b/App/src/main/java/cc/softwarefactory/lokki/android/services/UserPreferenceService.java new file mode 100644 index 00000000..99831916 --- /dev/null +++ b/App/src/main/java/cc/softwarefactory/lokki/android/services/UserPreferenceService.java @@ -0,0 +1,95 @@ +package cc.softwarefactory.lokki.android.services; + +import android.content.Context; +import android.content.Intent; +import android.support.v4.content.LocalBroadcastManager; +import android.util.Log; + +import com.androidquery.AQuery; +import com.androidquery.callback.AjaxCallback; +import com.androidquery.callback.AjaxStatus; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; + +import cc.softwarefactory.lokki.android.MainApplication; +import cc.softwarefactory.lokki.android.constants.Constants; +import cc.softwarefactory.lokki.android.models.User; +import cc.softwarefactory.lokki.android.utilities.JsonUtils; +import cc.softwarefactory.lokki.android.utilities.PreferenceUtils; + +public class UserPreferenceService extends ApiService { + + + private final String restPath = "dashboard"; + private final String TAG = "getDashboard"; + private static String ApiUrl = Constants.API_URL; + + + public UserPreferenceService(Context context){ + super(context); + } + + @Override + String getTag() { + return TAG; + } + + @Override + String getCacheKey() { + return PreferenceUtils.KEY_USER_PREFERENCE; + } + + public void getDashboard(final Context context) { + Log.d(TAG, "getDashboard"); + + + get(restPath, new AjaxCallback() { + @Override + public void callback(String url, String json, AjaxStatus status) { + + Log.d(TAG, "dashboard callback"); + + if (json == null) { + Log.e(TAG, "Error: " + status.getCode() + " - " + status.getMessage()); + return; + } else { + try { + + MainApplication.dashboard = JsonUtils.createFromJson(json.toString(), User.class); + if (MainApplication.dashboard.getServerMessage().equals("serverMessage")) { + String message = MainApplication.dashboard.getServerMessage(); + Intent intent = new Intent("MESSAGE"); + intent.putExtra("message", message); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); + return; + } + PreferenceUtils.setString(context, PreferenceUtils.KEY_DASHBOARD, JsonUtils.serialize(MainApplication.dashboard)); + MainApplication.user.setLocation(MainApplication.dashboard.getLocation()); + } catch (IOException e) { + Log.e(TAG, "Parsing JSON failed!"); + e.printStackTrace(); + } + Intent intent = new Intent("LOCATION-UPDATE"); + LocalBroadcastManager.getInstance(context).sendBroadcast(intent); + + } + AQuery aq = new AQuery(context); + } + + }.header("authorizationtoken", PreferenceUtils.getString(context, PreferenceUtils.KEY_AUTH_TOKEN))); + + } + + private void updateCache() { + try { + updateCache(new ObjectMapper().writeValueAsString(MainApplication.dashboard)); + } catch (JsonProcessingException e) { + Log.e(TAG, "Serializing places to JSON failed"); + e.printStackTrace(); + } + } + +} + 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..ff8b5111 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"; @@ -23,7 +22,7 @@ public class PreferenceUtils { public static final String KEY_NOT_FIRST_TIME_LAUNCH = "notFirstTimeLaunch"; public static final String KEY_LAT = "lat"; public static final String KEY_LON = "lon"; - + public static final String KEY_USER_PREFERENCE = "userpreference"; /** * Get a string value from default shared preferences * @param context Application context @@ -94,3 +93,4 @@ public static double getDouble(Context context, String key){ return Double.parseDouble(prefs.getString(key, "0.0")); } } +