Skip to content

Commit c667e3c

Browse files
committed
[smarcet]
* push notification api pooling (WIP)
1 parent 3de46c0 commit c667e3c

30 files changed

+409
-250
lines changed

app/src/main/java/org/openstack/android/summit/common/DTOs/Assembler/Converters/AbstractPushNotification2PushNotificationListItemDTO.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import org.joda.time.DateTimeZone;
55
import org.modelmapper.AbstractConverter;
66
import org.openstack.android.summit.common.DTOs.PushNotificationListItemDTO;
7-
import org.openstack.android.summit.common.entities.notifications.IEventPushNotification;
87
import org.openstack.android.summit.common.entities.notifications.IPushNotification;
98

109
import java.util.Date;
@@ -29,9 +28,8 @@ protected D convert(S source) {
2928
DateTime localTime = new DateTime(utcCreatedAt.getTime(), localTimeZone);
3029
dto.setReceivedDate(localTime.toDate());
3130
dto.setType(source.getChannel());
32-
if(source instanceof IEventPushNotification){
33-
dto.setEventId(((IEventPushNotification) source).getEvent().getId());
34-
}
31+
if(source.getEvent() != null)
32+
dto.setEventId(source.getEvent().getId());
3533
return dto;
3634
}
3735

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.openstack.android.summit.common.api;
2+
3+
import io.reactivex.Observable;
4+
import okhttp3.ResponseBody;
5+
import retrofit2.Response;
6+
import retrofit2.http.GET;
7+
import retrofit2.http.Path;
8+
import retrofit2.http.Query;
9+
10+
public interface INotificationsApi {
11+
12+
@GET("v1/summits/{summit_id}/notifications/sent")
13+
Observable<Response<ResponseBody>> getSent(
14+
@Path("summit_id") int summitId,
15+
@Query("page") int page,
16+
@Query("per_page") int per_page
17+
);
18+
19+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.openstack.android.summit.common.data_access;
2+
3+
import org.openstack.android.summit.common.entities.notifications.PushNotification;
4+
import java.util.List;
5+
import io.reactivex.Observable;
6+
7+
public interface IPushNotificationRemoteDataStore {
8+
9+
/**
10+
*
11+
* @param searchTerm
12+
* @param page
13+
* @param objectsPerPage
14+
* @return
15+
*/
16+
Observable<List<PushNotification>> get(String searchTerm, int page, int objectsPerPage);
17+
}

app/src/main/java/org/openstack/android/summit/common/data_access/ISummitEventRemoteDataStore.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.openstack.android.summit.common.data_access;
22

33
import org.openstack.android.summit.common.entities.Feedback;
4-
import org.openstack.android.summit.common.entities.Summit;
54
import org.openstack.android.summit.common.entities.SummitEvent;
65

76
import java.util.List;
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package org.openstack.android.summit.common.data_access;
2+
3+
import org.openstack.android.summit.common.api.INotificationsApi;
4+
import org.openstack.android.summit.common.api.ISummitSelector;
5+
import org.openstack.android.summit.common.data_access.deserialization.IDeserializer;
6+
import org.openstack.android.summit.common.entities.notifications.PushNotification;
7+
import org.openstack.android.summit.common.security.ISecurityManager;
8+
import org.openstack.android.summit.common.utils.RealmFactory;
9+
import java.util.List;
10+
import javax.inject.Named;
11+
import io.reactivex.Observable;
12+
import io.reactivex.schedulers.Schedulers;
13+
import retrofit2.Retrofit;
14+
15+
16+
public class PushNotificationRemoteDataStore
17+
extends BaseRemoteDataStore implements IPushNotificationRemoteDataStore {
18+
19+
private IDeserializer deserializer;
20+
private Retrofit restClientUserProfile;
21+
private Retrofit restClientServiceProfile;
22+
private ISummitSelector summitSelector;
23+
private ISecurityManager securityManager;
24+
25+
public PushNotificationRemoteDataStore
26+
(
27+
ISecurityManager securityManager,
28+
IDeserializer deserializer,
29+
@Named("MemberProfile") Retrofit restClientUserProfile,
30+
@Named("ServiceProfile") Retrofit restClientServiceProfile,
31+
ISummitSelector summitSelector
32+
) {
33+
this.securityManager = securityManager;
34+
this.deserializer = deserializer;
35+
this.deserializer.setSecurityManager(this.securityManager);
36+
this.restClientUserProfile = restClientUserProfile;
37+
this.restClientServiceProfile = restClientServiceProfile;
38+
this.summitSelector = summitSelector;
39+
}
40+
41+
/**
42+
*
43+
* @param searchTerm
44+
* @param page
45+
* @param objectsPerPage
46+
* @return
47+
*/
48+
@Override
49+
public Observable<List<PushNotification>> get(String searchTerm, int page, int objectsPerPage) {
50+
51+
Retrofit restClient = securityManager.isLoggedIn() ?
52+
this.restClientUserProfile :
53+
this.restClientServiceProfile;
54+
55+
return restClient.create(INotificationsApi.class)
56+
.getSent(summitSelector.getCurrentSummitId(), page, objectsPerPage)
57+
.subscribeOn(Schedulers.io())
58+
.map( response -> {
59+
if(!response.isSuccessful()){
60+
throw new Exception
61+
(
62+
String.format
63+
(
64+
"getFeedback: http error %d",
65+
response.code()
66+
)
67+
);
68+
}
69+
return RealmFactory.transaction(session ->
70+
deserializer.deserializePage(response.body().string(), PushNotification.class)
71+
);
72+
}).doOnTerminate( () ->
73+
RealmFactory.closeSession()
74+
);
75+
}
76+
}

app/src/main/java/org/openstack/android/summit/common/data_access/deserialization/Deserializer.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import org.openstack.android.summit.common.entities.Venue;
2424
import org.openstack.android.summit.common.entities.VenueFloor;
2525
import org.openstack.android.summit.common.entities.VenueRoom;
26+
import org.openstack.android.summit.common.entities.notifications.PushNotification;
27+
import org.openstack.android.summit.common.security.ISecurityManager;
2628

2729
import java.util.ArrayList;
2830
import java.util.List;
@@ -51,11 +53,19 @@ public class Deserializer implements IDeserializer {
5153
IVenueRoomDeserializer venueRoomDeserializer;
5254
IGroupEventDeserializer groupEventDeserializer;
5355
IWifiConnectionDeserializer wifiConnectionDeserializer;
56+
IPushNotificationDeserializer pushNotificationDeserializer;
57+
ISecurityManager securityManager;
5458

5559
public Deserializer()
5660
{
5761
}
5862

63+
@Override
64+
public void setSecurityManager(ISecurityManager securityManager) {
65+
this.securityManager = securityManager;
66+
this.pushNotificationDeserializer.setSecurityManager(this.securityManager);
67+
}
68+
5969
@Inject
6070
public Deserializer(
6171
IGenericDeserializer genericDeserializer,
@@ -72,7 +82,8 @@ public Deserializer(
7282
IVenueDeserializer venueDeserializer,
7383
IVenueFloorDeserializer venueFloorDeserializer,
7484
IGroupEventDeserializer groupEventDeserializer,
75-
IWifiConnectionDeserializer wifiConnectionDeserializer
85+
IWifiConnectionDeserializer wifiConnectionDeserializer,
86+
IPushNotificationDeserializer pushNotificationDeserializer
7687
)
7788
{
7889
this.genericDeserializer = genericDeserializer;
@@ -90,6 +101,7 @@ public Deserializer(
90101
this.venueFloorDeserializer = venueFloorDeserializer;
91102
this.groupEventDeserializer = groupEventDeserializer;
92103
this.wifiConnectionDeserializer = wifiConnectionDeserializer;
104+
this.pushNotificationDeserializer = pushNotificationDeserializer;
93105
}
94106

95107
@Override
@@ -137,6 +149,9 @@ else if (type == VenueFloor.class) {
137149
else if (type == SummitWIFIConnection.class) {
138150
return (T)wifiConnectionDeserializer.deserialize(jsonString);
139151
}
152+
else if (type == PushNotification.class) {
153+
return (T)pushNotificationDeserializer.deserialize(jsonString);
154+
}
140155
else {
141156
return genericDeserializer.deserialize(jsonString, type);
142157
}

app/src/main/java/org/openstack/android/summit/common/data_access/deserialization/IDeserializer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.json.JSONException;
44
import org.openstack.android.summit.common.entities.IEntity;
5+
import org.openstack.android.summit.common.security.ISecurityManager;
56

67
import java.util.List;
78

@@ -11,6 +12,9 @@
1112
* Created by Claudio Redi on 11/12/2015.
1213
*/
1314
public interface IDeserializer {
15+
16+
void setSecurityManager(ISecurityManager securityManager);
17+
1418
<T extends RealmObject & IEntity> T deserialize(String jsonString, Class<T> type) throws JSONException, IllegalArgumentException;
1519
<T extends RealmObject & IEntity> List<T> deserializeList(String jsonString, Class<T> type) throws JSONException, IllegalArgumentException;
1620
<T extends RealmObject & IEntity> List<T> deserializePage(String jsonString, Class<T> type) throws JSONException, IllegalArgumentException;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.openstack.android.summit.common.data_access.deserialization;
2+
3+
import org.json.JSONException;
4+
import org.openstack.android.summit.common.entities.notifications.PushNotification;
5+
import org.openstack.android.summit.common.security.ISecurityManager;
6+
7+
public interface IPushNotificationDeserializer {
8+
PushNotification deserialize(String jsonString) throws JSONException;
9+
10+
void setSecurityManager(ISecurityManager securityManager);
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package org.openstack.android.summit.common.data_access.deserialization;
2+
3+
import org.json.JSONException;
4+
import org.json.JSONObject;
5+
import org.openstack.android.summit.OpenStackSummitApplication;
6+
import org.openstack.android.summit.common.entities.Summit;
7+
import org.openstack.android.summit.common.entities.SummitEvent;
8+
import org.openstack.android.summit.common.entities.notifications.PushNotification;
9+
import org.openstack.android.summit.common.security.ISecurityManager;
10+
import org.openstack.android.summit.common.utils.RealmFactory;
11+
import org.openstack.android.summit.R;
12+
import java.util.Date;
13+
14+
public class PushNotificationDeserializer
15+
extends BaseDeserializer
16+
implements IPushNotificationDeserializer {
17+
18+
private ISecurityManager securityManager;
19+
20+
public PushNotificationDeserializer(){
21+
}
22+
23+
@Override
24+
public PushNotification deserialize(String jsonString) throws JSONException {
25+
JSONObject jsonObject = new JSONObject(jsonString);
26+
int id = jsonObject.getInt("id");
27+
28+
PushNotification notification = RealmFactory.getSession().where(PushNotification.class).equalTo("id", id).findFirst();
29+
30+
if(notification == null)
31+
notification = RealmFactory.getSession().createObject(PushNotification.class, id);
32+
33+
notification.setBody(
34+
!jsonObject.isNull("message") ? jsonObject.getString("message") : null
35+
);
36+
37+
notification.setChannel(
38+
!jsonObject.isNull("channel") ? jsonObject.getString("channel") : null
39+
);
40+
41+
notification.setCreatedAt(
42+
new Date(jsonObject.optLong("created") * 1000L)
43+
);
44+
45+
notification.setTitle(
46+
!jsonObject.isNull("title") ? jsonObject.getString("title") : OpenStackSummitApplication.context.getString(R.string.push_notification_default_title)
47+
);
48+
49+
if(jsonObject.has("event")){
50+
JSONObject jsonObjectEvent = jsonObject.getJSONObject("event");
51+
int eventId = jsonObjectEvent.getInt("id");
52+
SummitEvent summitEvent = RealmFactory.getSession().where(SummitEvent.class).equalTo("id", eventId).findFirst();
53+
54+
if(summitEvent != null){
55+
notification.setEvent(summitEvent);
56+
notification.setTitle(summitEvent.getName());
57+
}
58+
}
59+
60+
if(jsonObject.has("summit_id")){
61+
int summitId = jsonObject.getInt("summit_id");
62+
Summit summit = RealmFactory.getSession().where(Summit.class).equalTo("id", summitId).findFirst();
63+
64+
if(summit != null){
65+
notification.setSummit(summit);
66+
}
67+
}
68+
69+
notification.clearOwner();
70+
71+
if(this.securityManager.isLoggedIn()){
72+
notification.setOwner(this.securityManager.getCurrentMember());
73+
}
74+
75+
return notification;
76+
}
77+
78+
@Override
79+
public void setSecurityManager(ISecurityManager securityManager) {
80+
this.securityManager = securityManager;
81+
}
82+
}

app/src/main/java/org/openstack/android/summit/common/data_access/repositories/IEventPushNotificationDataStore.java

Lines changed: 0 additions & 10 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
package org.openstack.android.summit.common.data_access.repositories;
22

33
import org.openstack.android.summit.common.entities.Member;
4-
import org.openstack.android.summit.common.entities.notifications.IPushNotification;
54
import org.openstack.android.summit.common.entities.notifications.PushNotification;
65
import java.util.List;
76

7+
import io.reactivex.Observable;
8+
89
/**
910
* Created by sebastian on 8/20/2016.
1011
*/
1112
public interface IPushNotificationDataStore extends IGenericDataStore<PushNotification> {
1213

1314
long getNotOpenedCountBy(Member member);
1415

15-
List<IPushNotification> getByFilter(String searchTerm, Member member, int page, int objectsPerPage);
16+
List<PushNotification> getByFilter(String searchTerm, Member member, int page, int objectsPerPage);
17+
18+
Observable<List<PushNotification>> getByFilterRemote(String searchTerm, int page, int objectsPerPage);
1619
}

app/src/main/java/org/openstack/android/summit/common/data_access/repositories/impl/EventPushNotificationDataStore.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)