I'm working on an android app wherein users can send "referrals" to other users. On startup I run the following method, which queries the remote database and checks for new referrals:
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
String username = extras.getString(WeShouldActivity.ACCOUNT_NAME);
HttpClient httpclient = new DefaultHttpClient();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("user_email", username));
String paramString = URLEncodedUtils.format(nameValuePairs, "utf-8");
HttpGet httpget = new HttpGet("http://23.23.237.174/check-referrals?"+paramString);
JSONObject resp = new JSONObject();
JSONArray data = new JSONArray();
try {
HttpResponse response = httpclient.execute(httpget);
InputStream is = response.getEntity().getContent();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i=0;
while(i != -1){
i = is.read();
baos.write(i);
}
byte[] buf = baos.toByteArray();
//is.read(buf);
Log.v("REFERRAL RESPONSE", new String(buf));
resp = new JSONObject(new String(buf));
data = resp.getJSONArray("referrals");
Log.v("GETREFERRALSSERVICE", "Checking for new referrals");
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
Log.v("GETREFERRALSSERVICE", e.getMessage());
} catch (IOException e) {
// TODO Auto-generated catch block
Log.v("GETREFERRALSSERVICE", e.getMessage());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.v("GET REFFERAL SERVICE", "JSON EXCEPTION "+e.getMessage());
}
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager nm = (NotificationManager) getSystemService(ns);
int icon = R.drawable.restaurant;
String tickerText = "New referrals!";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
Context context = getApplicationContext();
CharSequence contentTitle = "New referrals!";
Log.v("REFERRAL DATA", data.toString());
if(data.length() >0){
CharSequence contentText = "You have "+data.length()+" new referrals awaiting your approval.";
Intent notificationIntent = new Intent(this, ApproveReferral.class);
notificationIntent.putExtra("we.should.communication.data", data.toString());
//Log.v("AFTER EXTRAS INSERT", notificationIntent.getStringExtra("data"));
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
notification.flags = notification.flags | Notification.FLAG_AUTO_CANCEL;
nm.notify(ActivityKey.NEW_REFERRAL.ordinal(), notification);
}
}
So, if there are any referrals on the remote db, a notification will pop up. Clicking on the notification triggers the ApproveReferral activity, shown below:
@Override
public void onCreate(Bundle savedInstanceState) {
final Context c = this.getApplicationContext(); //I don't know if this is the right way to do this!
super.onCreate(savedInstanceState);
setContentView(R.layout.approve_referral);
ListView lv = (ListView) findViewById(R.id.referralList);
final List<Referral> list = new ArrayList<Referral>();
Intent intent = this.getIntent();
Bundle bundle = intent.getExtras();
String dataAsString = bundle.getString("we.should.communication.data");
Log.v("DATA EXTRA", dataAsString);
JSONArray data = new JSONArray();
//get referral items from extras
try {
data = new JSONArray(dataAsString);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i=0; i<data.length(); i++){
try {
JSONObject o = data.getJSONObject(i);
Log.v("REFFERAL OBJECT DATA", o.toString());
JSONObject d = new JSONObject(o.getString("data"));
list.add(new Referral(o.getString("item_name"), o.getString("referred_by"), false, d));
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.v("REFERRAL OBJECT DATA", e.getMessage());
}
}
Log.v("REFERRAL LIST", list.toString());
mAdapter = new ReferralAdapter(this, list);
lv.setAdapter(mAdapter);
mSave = (Button) findViewById(R.id.save);
mSave.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
List<Referral> approvedList = mAdapter.getApprovedList();
//TODO: send approved/rejected to remote db and delete
Referrals refs = Referrals.getReferralCategory(c);
for(Referral r: approvedList){
ReferralItem ref = refs.newItem(r.getData());
try{
ref.save();
} catch(Exception e) {
Toast.makeText(c, e.getMessage(), Toast.LENGTH_SHORT).show();
return;
}
}
deleteRefs(list);
finish();
}
});
}
I've been having a problem that I will send myself a referral (which is allowed, so it's not that), or someone else will send me a referral, and I'll get a notification that says, for example "you have 3 new referrals", but when I open the approve referral view, I will only get 2.
I've traced this down to the fact that the "data" string that I put into the extras for ApproveReferral is not the string that comes out.
E.g.
Log.v("REFERRAL DATA", data.toString());
notificationIntent.putExtra("we.should.communication.data", data.toString());
and data.toString() looks like:
05-28 12:53:10.874: V/REFERRAL DATA(13610): [{"data":"{\"website:0:1\":\"http:\\\/\\\/m.imdb.com\\\/title\\\/tt0848228\",\"name:0:0\":\"The Avengers\",\"comment:1:5\":\"2012\",\"rating:3:4\":\"5.0\",\"tags:1:6\":\"[{\\\"id\\\":2,\\\"color\\\":\\\"Red\\\",\\\"tag\\\":\\\"again\\\"}]\"}","item_name":"The Avengers","referred_by":"troyschuring@gmail.com"},{"data":"{\"website:0:1\":\"http:\\\/\\\/www.edgewaterhotel.com\\\/edgewater_dining.aspx\",\"name:0:0\":\"Six Seven\",\"comment:1:5\":\"\",\"phone number:2:2\":\"(206) 269-4575\",\"rating:3:4\":\"\",\"tags:1:6\":\"[]\",\"address:1:3\":\"{\\\"long\\\":-122.352644,\\\"address\\\":\\\"2411 Alaskan Way, Seattle, WA, United States\\\",\\\"lat\\\":47.612579}\"}","item_name":"Six Seven","referred_by":"cc.emeraldeyes@gmail.com"},{"data":"{\"website:0:1\":\"http:\\\/\\\/www.paseoseattle.com\\\/\",\"name:0:0\":\"Paseo\",\"comment:1:5\":\"\",\"phone number:2:2\":\"(206) 545-7440\",\"rating:3:4\":\"5.0\",\"tags:1:6\":\"[{\\\"id\\\":1,\\\"color\\\":\\\"Purple\\\",\\\"tag\\\":\\\"Colin\\\"}]\",\"address:1:3\":\"{\\\"long\\\":-122.3501502,\\\"address\\\":\\\"4225 Fremont Avenue North, Seattle, WA, United States\\\",\\\"lat\\\":47.6586176}\"}","item_name":"Paseo","referred_by":"cc.emeraldeyes@gmail.com"}]
See, there are 3 items!
and then at the beginning of approveReferral:
05-28 12:53:13.877: V/DATA EXTRA(13610): [{"data":"{\"website:0:1\":\"http:\\\/\\\/m.imdb.com\\\/title\\\/tt0848228\",\"name:0:0\":\"The Avengers\",\"comment:1:5\":\"2012\",\"rating:3:4\":\"5.0\",\"tags:1:6\":\"[{\\\"id\\\":2,\\\"color\\\":\\\"Red\\\",\\\"tag\\\":\\\"again\\\"}]\"}","item_name":"The Avengers","referred_by":"troyschuring@gmail.com"},{"data":"{\"website:0:1\":\"http:\\\/\\\/www.edgewaterhotel.com\\\/edgewater_dining.aspx\",\"name:0:0\":\"Six Seven\",\"comment:1:5\":\"\",\"phone number:2:2\":\"(206) 269-4575\",\"rating:3:4\":\"\",\"tags:1:6\":\"[]\",\"address:1:3\":\"{\\\"long\\\":-122.352644,\\\"address\\\":\\\"2411 Alaskan Way, Seattle, WA, United States\\\",\\\"lat\\\":47.612579}\"}","item_name":"Six Seven","referred_by":"cc.emeraldeyes@gmail.com"}]
Now there are only 2.
The only thing that I can think of is that approveReferral, for some reason, is "caching" (I put it in quotes because I'm unfamiliar with android and am not sure how applicable the term is) its extras and isn't using the updated extras.
How do I fix this?