0

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?

Luiggi Mendoza
  • 85,076
  • 16
  • 154
  • 332
Colleen
  • 23,899
  • 12
  • 45
  • 75
  • have you tried to send 2 values instead of 3 to check if is cut to 1, or 4 and the string received has 3 elements, or maybe a different string and check that you're receiving exactly the same string as you has posted? – Luiggi Mendoza May 28 '12 at 20:27
  • I've had this problem happen in several different variations-- 2 and I only get 1, 4 and I only get 2, and the only thing that they've had in common is that, at one point, they *were* correct-- it's like the update just didn't make it all the way though. – Colleen May 28 '12 at 20:31
  • possible duplicate of [Notifications combined with BroadcastIntents are stale , how to freshen them?](http://stackoverflow.com/questions/7910190/notifications-combined-with-broadcastintents-are-stale-how-to-freshen-them) – CommonsWare May 28 '12 at 20:54
  • Yup, it apparently is. Gotta know what to search for. I have poor google foo. – Colleen May 28 '12 at 21:37

1 Answers1

0

As it turns out, a duplicate of Android keeps caching my intents Extras, how to declare a pending intent that keeps fresh extras?, among others.

Adding FLAG_UPDATE_CURRENT appears to have solved the problem.

Community
  • 1
  • 1
Colleen
  • 23,899
  • 12
  • 45
  • 75