List of usage examples for android.content DialogInterface cancel
void cancel();
From source file:com.free.searcher.MainFragment.java
@Override public boolean onQueryTextSubmit(String query) { currentSearching = query;/*from ww w. ja va2s. co m*/ findBox.setText(currentSearching); statusView.setText("Query = '" + query + "' : submitted"); webView.requestFocus(); try { // cha load source files if (query.trim().length() == 0) { status = "Nothing to search. Please type something for searching"; showToast(status.toString()); statusView.setText(status); return true; } Log.d("selectedFiles", selectedFiles + ""); if (selectedFiles == null || selectedFiles.length == 0 || selectedFiles[0].length() == 0) { // (cache == // null && // (!new // File(folderStr).exists())) status = "No file to search. Please select files or folders for searching"; showToast(status.toString()); statusView.setText(status); Log.d("search", "No file to search"); return true; } if (getSourceFileTask == null) { // Zip Reader or Restart app if (currentZipFileName.length() > 0) { // Zip reader AlertDialog.Builder alert = new AlertDialog.Builder(activity); alert.setTitle("Searching files"); alert.setMessage("Do you want to search this file " + currentZipFileName + "?"); alert.setCancelable(true); alert.setNegativeButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { showToast("Start loading files, please wait..."); requestSearching = true; getSourceFileTask = new GetSourceFileTask(MainFragment.this); getSourceFileTask.execute(); } }); alert.setPositiveButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); AlertDialog alertDialog = alert.create(); alertDialog.show(); } else { // SEARCH Dup Comp showToast("Start loading files, please wait..."); requestSearching = true; getSourceFileTask = new GetSourceFileTask(MainFragment.this); getSourceFileTask.execute(); } } else if (getSourceFileTask.getStatus() == Status.RUNNING || getSourceFileTask.getStatus() == Status.PENDING) { showToast("Still loading files, please wait..."); requestSearching = true; } else if (searchTask == null || searchTask.getStatus() == Status.FINISHED) { // load ri nhng cha chy g searchView(query); } else if (searchTask.getStatus() == Status.RUNNING || searchTask.getStatus() == Status.PENDING) { // load source file nhng ang chy ci khc showToast("Stopping previous seaching, please wait..."); searchTask.cancel(true); searchTask = null; searchView(query); } } catch (Throwable e) { Log.d("onQueryTextSubmit()", e.getMessage(), e); statusView.setText(e.getMessage()); } return true; }
From source file:com.dmsl.anyplace.UnifiedNavigationActivity.java
@Override public void onNewFloor(final String floorNumber) { if (floorChangeRequestDialog) return;//w w w .j a v a2 s .c om final BuildingModel b = userData.getSelectedBuilding(); if (b == null) { Log.e("Unified Activity/onNewFloor", "Floor Number Not found"); return; } // Check if the floor is the loaded floor if (b.getSelectedFloor().floor_number.equals(floorNumber)) { lastFloor = null; return; } // User clicked Cancel if (lastFloor != null && lastFloor.equals(floorNumber)) { return; } lastFloor = floorNumber; final FloorModel f = b.getFloorFromNumber(floorNumber); if (f != null) { AlertDialog.Builder alertDialog = new AlertDialog.Builder(UnifiedNavigationActivity.this); alertDialog.setTitle("Floor Change Detected"); alertDialog.setMessage("Floor Number: " + floorNumber + ". Do you want to proceed?"); alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); floorChangeRequestDialog = false; bypassSelectBuildingActivity(b, f); } }); alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); floorChangeRequestDialog = false; } }); alertDialog.show(); floorChangeRequestDialog = true; } }
From source file:com.example.alyshia.customsimplelauncher.MainActivity.java
void inflateDialog(int type) { AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("PASSWORD"); LayoutInflater inflater = LayoutInflater.from(this); final View view = inflater.inflate(R.layout.dialoglayout, null); EditText edittext = (EditText) view.findViewById(R.id.pswEditText); alert.setView(R.layout.dialoglayout); if (type == TYPE_EXIT) { alert.setPositiveButton("Enter", new DialogInterface.OnClickListener() { @Override/*from www. j a va 2 s .c o m*/ public void onClick(DialogInterface dialog, int which) { Dialog d = (Dialog) dialog; EditText et = (EditText) d.findViewById(R.id.pswEditText); Log.d(TAG, "TEXT is " + et.getText().toString()); if (et.getText().toString().equals("")) { dialog.dismiss(); Toast.makeText(MainActivity.this, "wrong password", Toast.LENGTH_SHORT).show(); } else if (et.getText().toString().equals(getPW())) { setkioskReceiver(); if (km == null) { km = KioskMode.getInstance(getApplicationContext()); } if (km.isKioskModeEnabled()) { Log.d(TAG, "Kioskmode being disabled bc it is enabled"); km.disableKioskMode(); } } } }); } else if (type == TYPE_ADMIN) { alert.setPositiveButton("Enter", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Dialog d = (Dialog) dialog; EditText et = (EditText) d.findViewById(R.id.pswEditText); Log.d(TAG, "TEXT is " + et.getText().toString()); if (et.getText().toString().equals("")) { dialog.dismiss(); } else if (et.getText().toString().equals(getPW())) { Intent intent = new Intent(MainActivity.this, AdminActivity.class); startActivity(intent); } } }); } alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); alert.setCancelable(true); AlertDialog cdialog = alert.create(); cdialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); cdialog.show(); }
From source file:com.free.searcher.MainFragment.java
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.d("data", "" + data); Log.d("requestCode", "" + requestCode); Log.d("resultCode", "" + resultCode); locX = 0;/*from w ww.jav a 2s . c o m*/ locY = 0; try { if (data != null) { String[] stringExtra = data.getStringArrayExtra(FolderChooserActivity.SELECTED_DIR); if (requestCode == SEARCH_REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { stopReadAndSearch(); Log.d("SEARCH_REQUEST_CODE.selectedFiles", Util.arrayToString(stringExtra, true, MainFragment.LINE_SEP)); currentZipFileName = ""; // lm du kh?i show web getSourceFile selectedFiles = stringExtra; getSourceFileTask = new GetSourceFileTask(MainFragment.this); getSourceFileTask.execute(); load = "Search"; } else { // RESULT_CANCEL if (selectedFiles.length == 0) { showToast("Nothing to search"); statusView.setText("Nothing to search"); } } } else if (requestCode == ZIP_REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { stopReadAndSearch(); currentZipFileName = stringExtra[0]; selectedFiles = stringExtra; load = "Zip Reader"; Log.d("ZIP_REQUEST_CODE.currentZFile", currentZipFileName); statusView.setText("reading " + currentZipFileName + "..."); try { zr = new ZipReadingTask(MainFragment.this); zr.execute(); } catch (Exception e) { statusView.setText(e.getMessage()); Log.d("zip result", e.getMessage(), e); showToast(e.getMessage()); } } else if (currentZipFileName.length() == 0) { showToast("Nothing to read"); statusView.setText("Nothing to read"); } // } else if (requestCode == COMPARE_REQUEST_CODE1) { // if (resultCode == Activity.RESULT_OK) { // oriDoc = stringExtra[0]; // Log.d("COMPARE_REQUEST_CODE1.oriDoc", oriDoc); // Intent intent = new Intent(activity, FolderChooserActivity.class); // intent.putExtra(MainFragment.SELECTED_DIR, // new String[] { oriDoc }); // intent.putExtra(MainFragment.SUFFIX, DOC_FILES_SUFFIX); // intent.putExtra(MainFragment.MODE, !MULTI_FILES); // intent.putExtra(MainFragment.CHOOSER_TITLE,MODI_SUFFIX_TITLE); // activity.startActivityForResult(intent, COMPARE_REQUEST_CODE2); // } else { // RESULT_CANCEL // if (selectedFiles.length == 0) { // showToast("Nothing to compare"); // statusView.setText("Nothing to compare"); // } // } // } else if (requestCode == COMPARE_REQUEST_CODE2) { // if (resultCode == Activity.RESULT_OK) { // stopReadAndSearch(); // modifiedDoc = stringExtra[0]; // Log.d("COMPARE_REQUEST_CODE2.modifiedDoc", modifiedDoc); // currentZipFileName = ""; // lm du kh?i show web getSourceFile // selectedFiles = new String[] {oriDoc, modifiedDoc}; // load = "Search"; // requestCompare = true; // requestSearching = false; // getSourceFileTask = new GetSourceFileTask(MainFragment.this); // getSourceFileTask.execute(); // } else { // RESULT_CANCEL // if (selectedFiles.length == 0) { // showToast("Nothing to compare"); // statusView.setText("Nothing to compare"); // } // } } else if (requestCode == GEN_REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { Log.d("GEN_REQUEST_CODE.selectedFiles", stringExtra[0]); genStardictTask = new GenStardictTask(MainFragment.this, stringExtra[0]); genStardictTask.execute(); } else { // RESULT_CANCEL if (selectedFiles.length == 0) { showToast("Nothing to generate"); statusView.setText("Nothing to generate"); } } } else if (requestCode == RESTORE_REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { Log.d("RESTORE_REQUEST_CODE.selectedFiles", stringExtra[0]); restoreStardictTask = new RestoreStardictTask(MainFragment.this, stringExtra[0]); restoreStardictTask.execute(); } else { // RESULT_CANCEL if (selectedFiles.length == 0) { showToast("Nothing to restore"); statusView.setText("Nothing to restore"); } } } else if (requestCode == DUP_REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { stopReadAndSearch(); Log.d("DUP_REQUEST_CODE.selectedFiles", Util.arrayToString(stringExtra, true, MainFragment.LINE_SEP)); if (FileUtils.treeUri == null) {// && !checkFolder(new File(st).getParentFile(), WRITE_REQUEST_CODE)) { FileUtils.applicationContext = activity; FileUtils.treeUri = FileUtils .getSharedPreferenceUri(R.string.key_internal_uri_extsdcard); if (FileUtils.treeUri == null) { AlertDialog.Builder alert = new AlertDialog.Builder(activity); alert.setTitle("Grant Permission in extSdCard"); alert.setMessage("In the following Android dialog, " + "please select the external SD card and confirm at the bottom."); alert.setCancelable(true); alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { triggerStorageAccessFramework(INTENT_WRITE_REQUEST_CODE); } }); alert.setNegativeButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); AlertDialog alertDialog = alert.create(); alertDialog.show(); } } dupTask = new DupFinderTask(MainFragment.this, stringExtra); dupTask.execute(); } else { // RESULT_CANCEL if (selectedFiles.length == 0) { showToast("Nothing to find"); statusView.setText("Nothing to find"); } } } else if (requestCode == INTENT_WRITE_REQUEST_CODE) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { onActivityResultLollipop(requestCode, resultCode, data); } } else if (requestCode == TRANSLATE_REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { Log.d("TRANSLATE_REQUEST_CODE.selectedFiles", stringExtra[0]); stopReadAndSearch(); currentZipFileName = ""; // lm du kh?i show web getSourceFile selectedFiles = stringExtra; load = "Search"; requestCompare = false; requestTranslate = true; requestSearching = false; getSourceFileTask = new GetSourceFileTask(MainFragment.this); getSourceFileTask.execute(); } else { // RESULT_CANCEL if (selectedFiles.length == 0) { showToast("Nothing to translate"); statusView.setText("Nothing to translate"); } } // } else if (requestCode == REPLACE_REQUEST_CODE) { // if (resultCode == Activity.RESULT_OK) { // Log.d("REPLACE_REQUEST_CODE.selectedFiles", stringExtra[0]); // stopReadAndSearch(); // currentZipFileName = ""; // lm du kh?i show web getSourceFile // selectedFiles = stringExtra; // load = "Search"; // requestCompare = false; // requestTranslate = false; // requestSearching = false; // List<File> lf = FileUtil.getFiles(selectedFiles); // if (includeEnter) { // multiline // new ReplaceAllTask(this, lf, isRegex, caseSensitive, new String[]{replace}, new String[]{by}).execute(); // } else { // String[] replaces = replace.split("\r?\n"); // String[] bys = by.split("\r?\n"); // Log.d("bys.length ", bys.length + "."); // if (replaces.length == bys.length) { // new ReplaceAllTask(this, lf, isRegex, caseSensitive, replaces, bys).execute(); // } else { // showToast("The number of lines of replace and by are not equal"); // } // } // getSourceFileTask = new GetSourceFileTask(MainFragment.this); // getSourceFileTask.execute(); // } else { // RESULT_CANCEL // if (selectedFiles.length == 0) { // showToast("Nothing to translate"); // statusView.setText("Nothing to translate"); // } // } // } else if (requestCode == BATCH_REQUEST_CODE_1) { // if (resultCode == Activity.RESULT_OK) { // selectedFiles = stringExtra; // Log.d("BATCH_REQUEST_CODE_1.selectedFiles", Util.arrayToString(selectedFiles, true, "\n")); // Intent intent = new Intent(activity, FolderChooserActivity.class); // intent.putExtra(SearchFragment.SELECTED_DIR, // selectedFiles); // intent.putExtra(SearchFragment.SUFFIX, ""); // intent.putExtra(SearchFragment.MODE, !MULTI_FILES); // intent.putExtra(SearchFragment.CHOOSER_TITLE, "Output Folder"); // activity.startActivityForResult(intent, BATCH_REQUEST_CODE_2); // } else { // RESULT_CANCEL // if (selectedFiles.length == 0) { // showToast("Nothing to convert"); // statusView.setText("Nothing to convert"); // } // } // } else if (requestCode == BATCH_REQUEST_CODE_2) { // if (resultCode == Activity.RESULT_OK) { // stopReadAndSearch(); // outputFolder = stringExtra[0]; // Log.d("BATCH_REQUEST_CODE_2.outputfolder", outputFolder); // currentZipFileName = ""; // lm du kh?i show web getSourceFile // load = "Convert"; // // Log.i(Prefs.TAG, "onCreate ffmpeg4android ProgressBarExample"); //// demoVideoFolder = Environment.getExternalStorageDirectory().getAbsolutePath() + "/videokit/"; // Log.i(Prefs.TAG, getString(R.string.app_name) + " version: " + GeneralUtils.getVersionName(activity.getApplicationContext()) ); // workFolder = SearchFragment.PRIVATE_PATH + "/"; //activity.getApplicationContext().getFilesDir() + "/"; // Log.i(Prefs.TAG, "workFolder (license and logs location) path: " + workFolder); // vkLogPath = SearchFragment.PRIVATE_PATH + "/vk.log"; // Log.i(Prefs.TAG, "vk log (native log) path: " + vkLogPath); // GeneralUtils.copyLicenseFromAssetsToSDIfNeeded(activity, workFolder); // //GeneralUtils.copyDemoVideoFromAssetsToSDIfNeeded(activity, demoVideoFolder); // int rc = GeneralUtils.isLicenseValid(activity.getApplicationContext(), workFolder); // Log.i(Prefs.TAG, "License check RC: " + rc); // new Thread (new Runnable() { // @Override // public void run() { // List<File> lf = FileUtil.getFiles(selectedFiles); // for (File f : lf) { // Log.i(Prefs.TAG, "f = " + f); // synchronized (command) { // convertingFile = f.getAbsolutePath(); // Log.i(Prefs.TAG, convertingFile + "2=" + convertingFile); // runTranscoding(); // while (!progresssBarFinished) { // try { // Thread.sleep(250); // } catch (InterruptedException e) {} // } // } // } // } // }).start(); // } else { // RESULT_CANCEL // if (selectedFiles.length == 0) { // showToast("Nothing to convert"); // statusView.setText("Nothing to convert"); // } // } } } } catch (Throwable t) { Log.e("onActivityResult", t.getMessage(), t); } Log.d("onActivityResult.load", load + " onActivityResult"); webView.requestFocus(); }
From source file:com.citrus.sample.WalletPaymentFragment.java
@OnClick(R.id.btnMasterpass) public void testMasterPass() { final AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); String message = null;/*w w w . j a v a2s . c om*/ String positiveButtonText = null; message = "Please enter the transaction amount."; positiveButtonText = "Make Payment"; LinearLayout linearLayout = new LinearLayout(getActivity()); linearLayout.setOrientation(LinearLayout.VERTICAL); alert.setTitle("Transaction Amount?"); alert.setMessage(message); // Set an EditText view to get user input final EditText input = new EditText(getActivity()); input.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); alert.setView(input); alert.setPositiveButton(positiveButtonText, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { String value = input.getText().toString(); input.clearFocus(); // Hide the keyboard. InputMethodManager imm = (InputMethodManager) getActivity() .getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(input.getWindowToken(), 0); try { MasterPassOption masterPassOption = new MasterPassOption(); PaymentType.PGPayment pgPayment = new PaymentType.PGPayment(new Amount(value), Constants.BILL_URL, masterPassOption, null); mCitrusClient.simpliPay(pgPayment, new Callback<TransactionResponse>() { @Override public void success(TransactionResponse transactionResponse) { Toast.makeText(getActivity(), transactionResponse.getMessage(), Toast.LENGTH_SHORT) .show(); } @Override public void error(CitrusError error) { Toast.makeText(getActivity(), error.getMessage(), Toast.LENGTH_SHORT).show(); } }); } catch (CitrusException e) { e.printStackTrace(); } } }); alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.cancel(); } }); input.requestFocus(); alert.show(); }
From source file:com.microsoft.onedrive.apiexplorer.ItemFragment.java
/** * Creates a link on this item/*from w ww. j a v a 2 s. com*/ * @param item The item to delete */ private void createLink(final Item item) { final CharSequence[] items = { "view", "edit" }; final int nothingSelected = -1; final AtomicInteger selection = new AtomicInteger(nothingSelected); final AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).setTitle(R.string.create_link) .setIcon(android.R.drawable.ic_menu_share) .setPositiveButton(R.string.create_link, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { if (selection.get() == nothingSelected) { return; } final BaseApplication application = (BaseApplication) getActivity().getApplication(); application.getOneDriveClient().getDrive().getItems(item.id) .getCreateLink(items[selection.get()].toString()).buildRequest() .create(new DefaultCallback<Permission>(getActivity()) { @Override public void success(final Permission permission) { final ClipboardManager cm = (ClipboardManager) getActivity() .getSystemService(Context.CLIPBOARD_SERVICE); final ClipData data = ClipData.newPlainText("Link Url", permission.link.webUrl); cm.setPrimaryClip(data); Toast.makeText(getActivity(), application.getString(R.string.created_link), Toast.LENGTH_LONG).show(); getActivity().onBackPressed(); } }); } }).setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { selection.set(which); } }).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int which) { dialog.cancel(); } }).create(); alertDialog.show(); }
From source file:org.ednovo.goorusearchwidget.SearchResults_resource.java
/** * @function name : showDialog/* w ww .jav a 2s. c om*/ * * This function is used to show alert dialog * * @param String * message to show * * @return void * * */ public void showDialog(String data) { AlertDialog.Builder alertDialog = new AlertDialog.Builder(this); alertDialog.setMessage(data).setCancelable(false).setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { // dialog.cancel(); dialog.cancel(); } }); AlertDialog alert = alertDialog.create(); // Title for AlertDialog alert.setTitle(" Info "); alert.show(); }
From source file:com.kll.collect.android.activities.FormEntryActivity.java
/** * Create a dialog with options to save and exit, save, or quit without * saving/* w ww . j av a 2 s. c o m*/ */ private void createQuitDialog() { FormController formController = Collect.getInstance().getFormController(); String[] items; if (mAdminPreferences.getBoolean(AdminPreferencesActivity.KEY_SAVE_MID, true)) { String[] two = { getString(R.string.keep_changes), getString(R.string.do_not_save) }; items = two; } else { String[] one = { getString(R.string.do_not_save) }; items = one; } Collect.getInstance().getActivityLogger().logInstanceAction(this, "createQuitDialog", "show"); mAlertDialog = new AlertDialog.Builder(this).setIcon(android.R.drawable.ic_dialog_info) .setTitle(getString(R.string.quit_application, formController.getFormTitle())) .setNeutralButton(getString(R.string.do_not_exit), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { Collect.getInstance().getActivityLogger().logInstanceAction(this, "createQuitDialog", "cancel"); dialog.cancel(); } }).setItems(items, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: // save and exit // this is slightly complicated because if the // option is disabled in // the admin menu, then case 0 actually becomes // 'discard and exit' // whereas if it's enabled it's 'save and exit' if (mAdminPreferences.getBoolean(AdminPreferencesActivity.KEY_SAVE_MID, true)) { Collect.getInstance().getActivityLogger().logInstanceAction(this, "createQuitDialog", "saveAndExit"); saveDataToDisk(EXIT, isInstanceComplete(false), null); } else { Collect.getInstance().getActivityLogger().logInstanceAction(this, "createQuitDialog", "discardAndExit"); removeTempInstance(); finishReturnInstance(); } break; case 1: // discard changes and exit Collect.getInstance().getActivityLogger().logInstanceAction(this, "createQuitDialog", "discardAndExit"); // close all open databases of external data. Collect.getInstance().getExternalDataManager().close(); removeTempInstance(); finishReturnInstance(); break; case 2:// do nothing Collect.getInstance().getActivityLogger().logInstanceAction(this, "createQuitDialog", "cancel"); break; } } }).create(); mAlertDialog.show(); }
From source file:com.piusvelte.sonet.core.SonetNotifications.java
@Override public boolean onOptionsItemSelected(MenuItem item) { final ProgressDialog loadingDialog = new ProgressDialog(this); final AsyncTask<Integer, String, Boolean> asyncTask = new AsyncTask<Integer, String, Boolean>() { @Override//from ww w .j a va 2 s . co m protected Boolean doInBackground(Integer... arg0) { if (arg0[0] == R.id.menu_notifications_refresh) { // select all accounts with notifications set Cursor widgets = getContentResolver().query( Widgets_settings.getDistinctContentUri(SonetNotifications.this), new String[] { Widgets.ACCOUNT }, Widgets.ACCOUNT + "!=-1 and (" + Widgets.LIGHTS + "=1 or " + Widgets.VIBRATE + "=1 or " + Widgets.SOUND + "=1)", null, null); if (widgets.moveToFirst()) { mSonetCrypto = SonetCrypto.getInstance(getApplicationContext()); HttpClient httpClient = SonetHttpClient.getThreadSafeClient(getApplicationContext()); while (!widgets.isAfterLast()) { long accountId = widgets.getLong(0); ArrayList<String> notificationSids = new ArrayList<String>(); Cursor account = getContentResolver().query( Accounts.getContentUri(SonetNotifications.this), new String[] { Accounts.TOKEN, Accounts.SECRET, Accounts.SERVICE, Accounts.SID }, Accounts._ID + "=?", new String[] { Long.toString(accountId) }, null); if (account.moveToFirst()) { // for each account, for each notification, check for updates // if there are no updates past 24hrs and cleared, delete String token = mSonetCrypto.Decrypt(account.getString(0)); String secret = mSonetCrypto.Decrypt(account.getString(1)); int service = account.getInt(2); String accountEsid = mSonetCrypto.Decrypt(account.getString(3)); mSimpleDateFormat = null; if (service == TWITTER) { Cursor currentNotifications = getContentResolver().query( Notifications.getContentUri(SonetNotifications.this), new String[] { Notifications.SID }, Notifications.ACCOUNT + "=?", new String[] { Long.toString(accountId) }, null); // loop over notifications if (currentNotifications.moveToFirst()) { // store sids, to avoid duplicates when requesting the latest feed String sid = mSonetCrypto.Decrypt(currentNotifications.getString(0)); if (!notificationSids.contains(sid)) { notificationSids.add(sid); } } currentNotifications.close(); // limit to newest status SonetOAuth sonetOAuth = new SonetOAuth(TWITTER_KEY, TWITTER_SECRET, token, secret); String last_sid = null; Cursor last_status = getContentResolver().query( Statuses.getContentUri(SonetNotifications.this), new String[] { Statuses.SID }, Statuses.ACCOUNT + "=?", new String[] { Long.toString(accountId) }, Statuses.CREATED + " ASC LIMIT 1"); if (last_status.moveToFirst()) { last_sid = mSonetCrypto.Decrypt(last_status.getString(0)); } last_status.close(); // get all mentions since the oldest status for this account String response = SonetHttpClient.httpResponse(httpClient, sonetOAuth.getSignedRequest( new HttpGet(String.format(TWITTER_MENTIONS, TWITTER_BASE_URL, last_sid != null ? String.format(TWITTER_SINCE_ID, last_sid) : "")))); if (response != null) { try { JSONArray comments = new JSONArray(response); for (int i = 0, i2 = comments.length(); i < i2; i++) { JSONObject comment = comments.getJSONObject(i); JSONObject user = comment.getJSONObject(Suser); if (!user.getString(Sid).equals(accountEsid) && !notificationSids.contains(comment.getString(Sid))) { String friend = user.getString(Sname); addNotification(comment.getString(Sid), user.getString(Sid), friend, comment.getString("text"), parseDate(comment.getString("created_at"), TWITTER_DATE_FORMAT), accountId, friend + " mentioned you on Twitter"); } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } } else if (service == IDENTICA) { Cursor currentNotifications = getContentResolver().query( Notifications.getContentUri(SonetNotifications.this), new String[] { Notifications.SID }, Notifications.ACCOUNT + "=?", new String[] { Long.toString(accountId) }, null); // loop over notifications if (currentNotifications.moveToFirst()) { // store sids, to avoid duplicates when requesting the latest feed String sid = mSonetCrypto.Decrypt(currentNotifications.getString(0)); if (!notificationSids.contains(sid)) { notificationSids.add(sid); } } currentNotifications.close(); // limit to newest status SonetOAuth sonetOAuth = new SonetOAuth(IDENTICA_KEY, IDENTICA_SECRET, token, secret); String last_sid = null; Cursor last_status = getContentResolver().query( Statuses.getContentUri(SonetNotifications.this), new String[] { Statuses.SID }, Statuses.ACCOUNT + "=?", new String[] { Long.toString(accountId) }, Statuses.CREATED + " ASC LIMIT 1"); if (last_status.moveToFirst()) { last_sid = mSonetCrypto.Decrypt(last_status.getString(0)); } last_status.close(); // get all mentions since the oldest status for this account String response = SonetHttpClient.httpResponse(httpClient, sonetOAuth.getSignedRequest( new HttpGet(String.format(IDENTICA_MENTIONS, IDENTICA_BASE_URL, last_sid != null ? String.format(IDENTICA_SINCE_ID, last_sid) : "")))); if (response != null) { try { JSONArray comments = new JSONArray(response); for (int i = 0, i2 = comments.length(); i < i2; i++) { JSONObject comment = comments.getJSONObject(i); JSONObject user = comment.getJSONObject(Suser); if (!user.getString(Sid).equals(accountEsid) && !notificationSids.contains(comment.getString(Sid))) { String friend = user.getString(Sname); addNotification(comment.getString(Sid), user.getString(Sid), friend, comment.getString("text"), parseDate(comment.getString("created_at"), TWITTER_DATE_FORMAT), accountId, friend + " mentioned you on Identi.ca"); } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } } else { Cursor currentNotifications = getContentResolver().query( Notifications.getContentUri(SonetNotifications.this), new String[] { Notifications._ID, Notifications.SID, Notifications.UPDATED, Notifications.CLEARED, Notifications.ESID }, Notifications.ACCOUNT + "=?", new String[] { Long.toString(accountId) }, null); if (currentNotifications.moveToFirst()) { String response; SonetOAuth sonetOAuth; switch (service) { case FACEBOOK: // loop over notifications while (!currentNotifications.isAfterLast()) { long notificationId = currentNotifications.getLong(0); String sid = mSonetCrypto .Decrypt(currentNotifications.getString(1)); long updated = currentNotifications.getLong(2); boolean cleared = currentNotifications.getInt(3) == 1; // store sids, to avoid duplicates when requesting the latest feed if (!notificationSids.contains(sid)) { notificationSids.add(sid); } // get comments for current notifications if ((response = SonetHttpClient.httpResponse(httpClient, new HttpGet( String.format(FACEBOOK_COMMENTS, FACEBOOK_BASE_URL, sid, Saccess_token, token)))) != null) { // check for a newer post, if it's the user's own, then set CLEARED=0 try { JSONArray comments = new JSONObject(response) .getJSONArray(Sdata); int i2 = comments.length(); if (i2 > 0) { for (int i = 0; i < i2; i++) { JSONObject comment = comments.getJSONObject(i); long created_time = comment.getLong(Screated_time) * 1000; if (created_time > updated) { // new comment ContentValues values = new ContentValues(); values.put(Notifications.UPDATED, created_time); JSONObject from = comment.getJSONObject(Sfrom); if (accountEsid.equals(from.getString(Sid))) { // user's own comment, clear the notification values.put(Notifications.CLEARED, 1); } else if (cleared) { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), from.getString(Sname))); values.put(Notifications.CLEARED, 0); } else { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), from.getString(Sname) + " and others")); } getContentResolver().update( Notifications.getContentUri( SonetNotifications.this), values, Notifications._ID + "=?", new String[] { Long .toString(notificationId) }); } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } currentNotifications.moveToNext(); } // check the latest feed if ((response = SonetHttpClient.httpResponse(httpClient, new HttpGet(String.format(FACEBOOK_HOME, FACEBOOK_BASE_URL, Saccess_token, token)))) != null) { try { JSONArray jarr = new JSONObject(response).getJSONArray(Sdata); // if there are updates, clear the cache int d2 = jarr.length(); if (d2 > 0) { for (int d = 0; d < d2; d++) { JSONObject o = jarr.getJSONObject(d); String sid = o.getString(Sid); // if already notified, ignore if (!notificationSids.contains(sid)) { // only parse status types, not photo, video or link if (o.has(Stype) && o.has(Sfrom)) { JSONObject f = o.getJSONObject(Sfrom); if (f.has(Sname) && f.has(Sid)) { String notification = null; String esid = f.getString(Sid); String friend = f.getString(Sname); if (o.has(Sto)) { // handle wall messages from one friend to another JSONObject t = o.getJSONObject(Sto); if (t.has(Sdata)) { JSONObject n = t.getJSONArray(Sdata) .getJSONObject(0); if (n.has(Sname)) { if (n.has(Sid) && (n .getString(Sid) .equals(accountEsid))) { notification = String .format(getString( R.string.friendcommented), friend); } } } } int commentCount = 0; if (o.has(Scomments)) { JSONObject jo = o .getJSONObject(Scomments); if (jo.has(Sdata)) { JSONArray comments = jo .getJSONArray(Sdata); commentCount = comments.length(); // notifications if ((sid != null) && (commentCount > 0)) { // default hasCommented to whether or not these comments are for the own user's status boolean hasCommented = notification != null || esid.equals( accountEsid); for (int c2 = 0; c2 < commentCount; c2++) { JSONObject c3 = comments .getJSONObject(c2); if (c3.has(Sfrom)) { JSONObject c4 = c3 .getJSONObject( Sfrom); if (c4.getString(Sid) .equals(accountEsid)) { if (!hasCommented) { // the user has commented on this thread, notify any updates hasCommented = true; } // clear any notifications, as the user is already aware if (notification != null) { notification = null; } } else if (hasCommented) { // don't notify about user's own comments // send the parent comment sid notification = String .format(getString( R.string.friendcommented), c4.getString( Sname)); } } } } } } if (notification != null) { String message = o.has(Smessage) ? o.getString(Smessage) : null; if (!o.getString(Stype).equals(Sstatus) && o.has(Slink)) { message = message == null ? "[" + o.getString(Stype) + "]" : "[" + o.getString(Stype) + "]"; } // new notification addNotification(sid, esid, friend, message, o.getLong(Screated_time) * 1000, accountId, notification); } } } } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } break; case MYSPACE: sonetOAuth = new SonetOAuth(MYSPACE_KEY, MYSPACE_SECRET, token, secret); // loop over notifications while (!currentNotifications.isAfterLast()) { long notificationId = currentNotifications.getLong(0); String sid = mSonetCrypto .Decrypt(currentNotifications.getString(1)); long updated = currentNotifications.getLong(2); boolean cleared = currentNotifications.getInt(3) == 1; String esid = mSonetCrypto .Decrypt(currentNotifications.getString(4)); // store sids, to avoid duplicates when requesting the latest feed if (!notificationSids.contains(sid)) { notificationSids.add(sid); } // get comments for current notifications if ((response = SonetHttpClient.httpResponse(httpClient, sonetOAuth.getSignedRequest(new HttpGet( String.format(MYSPACE_URL_STATUSMOODCOMMENTS, MYSPACE_BASE_URL, esid, sid))))) != null) { // check for a newer post, if it's the user's own, then set CLEARED=0 try { JSONArray comments = new JSONObject(response) .getJSONArray(Sentry); int i2 = comments.length(); if (i2 > 0) { for (int i = 0; i < i2; i++) { JSONObject comment = comments.getJSONObject(i); long created_time = parseDate( comment.getString(SpostedDate), MYSPACE_DATE_FORMAT); if (created_time > updated) { // new comment ContentValues values = new ContentValues(); values.put(Notifications.UPDATED, created_time); JSONObject author = comment .getJSONObject(Sauthor); if (accountEsid.equals(author.getString(Sid))) { // user's own comment, clear the notification values.put(Notifications.CLEARED, 1); } else if (cleared) { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), comment.getString( SdisplayName))); values.put(Notifications.CLEARED, 0); } else { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), comment.getString( SdisplayName) + " and others")); } getContentResolver().update( Notifications.getContentUri( SonetNotifications.this), values, Notifications._ID + "=?", new String[] { Long .toString(notificationId) }); } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } currentNotifications.moveToNext(); } // check the latest feed if ((response = SonetHttpClient .httpResponse(httpClient, sonetOAuth.getSignedRequest( new HttpGet(String.format(MYSPACE_HISTORY, MYSPACE_BASE_URL))))) != null) { try { JSONArray jarr = new JSONObject(response).getJSONArray(Sentry); // if there are updates, clear the cache int d2 = jarr.length(); if (d2 > 0) { for (int d = 0; d < d2; d++) { JSONObject o = jarr.getJSONObject(d); String sid = o.getString(SstatusId); // if already notified, ignore if (!notificationSids.contains(sid)) { if (o.has(Sauthor) && o.has(SrecentComments)) { JSONObject f = o.getJSONObject(Sauthor); if (f.has(SdisplayName) && f.has(Sid)) { String notification = null; String esid = f.getString(Sid); String friend = f.getString(SdisplayName); JSONArray comments = o .getJSONArray(SrecentComments); int commentCount = comments.length(); // notifications if ((sid != null) && (commentCount > 0)) { // default hasCommented to whether or not these comments are for the own user's status boolean hasCommented = notification != null || esid.equals(accountEsid); for (int c2 = 0; c2 < commentCount; c2++) { JSONObject c3 = comments .getJSONObject(c2); if (c3.has(Sauthor)) { JSONObject c4 = c3 .getJSONObject(Sauthor); if (c4.getString(Sid) .equals(accountEsid)) { if (!hasCommented) { // the user has commented on this thread, notify any updates hasCommented = true; } // clear any notifications, as the user is already aware if (notification != null) { notification = null; } } else if (hasCommented) { // don't notify about user's own comments // send the parent comment sid notification = String .format(getString( R.string.friendcommented), c4.getString( SdisplayName)); } } } } if (notification != null) { // new notification addNotification(sid, esid, friend, o.getString(Sstatus), parseDate(o.getString( "moodStatusLastUpdated"), MYSPACE_DATE_FORMAT), accountId, notification); } } } } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } break; case FOURSQUARE: // loop over notifications while (!currentNotifications.isAfterLast()) { long notificationId = currentNotifications.getLong(0); String sid = mSonetCrypto .Decrypt(currentNotifications.getString(1)); long updated = currentNotifications.getLong(2); boolean cleared = currentNotifications.getInt(3) == 1; // store sids, to avoid duplicates when requesting the latest feed if (!notificationSids.contains(sid)) { notificationSids.add(sid); } // get comments for current notifications if ((response = SonetHttpClient.httpResponse(httpClient, new HttpGet(String.format(FOURSQUARE_GET_CHECKIN, FOURSQUARE_BASE_URL, sid, token)))) != null) { // check for a newer post, if it's the user's own, then set CLEARED=0 try { JSONArray comments = new JSONObject(response) .getJSONObject(Sresponse).getJSONObject(Scheckin) .getJSONObject(Scomments).getJSONArray(Sitems); int i2 = comments.length(); if (i2 > 0) { for (int i = 0; i < i2; i++) { JSONObject comment = comments.getJSONObject(i); long created_time = comment.getLong(ScreatedAt) * 1000; if (created_time > updated) { // new comment ContentValues values = new ContentValues(); values.put(Notifications.UPDATED, created_time); JSONObject user = comment.getJSONObject(Suser); if (accountEsid.equals(user.getString(Sid))) { // user's own comment, clear the notification values.put(Notifications.CLEARED, 1); } else if (cleared) { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), user.getString(SfirstName) + " " + user.getString( SlastName))); values.put(Notifications.CLEARED, 0); } else { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), user.getString(SfirstName) + " " + user.getString( SlastName) + " and others")); } getContentResolver().update( Notifications.getContentUri( SonetNotifications.this), values, Notifications._ID + "=?", new String[] { Long .toString(notificationId) }); } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } currentNotifications.moveToNext(); } // check the latest feed if ((response = SonetHttpClient.httpResponse(httpClient, new HttpGet(String.format(FOURSQUARE_CHECKINS, FOURSQUARE_BASE_URL, token)))) != null) { try { JSONArray jarr = new JSONObject(response) .getJSONObject(Sresponse).getJSONArray(Srecent); // if there are updates, clear the cache int d2 = jarr.length(); if (d2 > 0) { for (int d = 0; d < d2; d++) { JSONObject o = jarr.getJSONObject(d); String sid = o.getString(Sid); // if already notified, ignore if (!notificationSids.contains(sid)) { if (o.has(Suser) && o.has(Scomments)) { JSONObject f = o.getJSONObject(Suser); if (f.has(SfirstName) && f.has(SlastName) && f.has(Sid)) { String notification = null; String esid = f.getString(Sid); String friend = f.getString(SfirstName) + " " + f.getString(SlastName); JSONArray comments = o .getJSONArray(Scomments); int commentCount = comments.length(); // notifications if (commentCount > 0) { // default hasCommented to whether or not these comments are for the own user's status boolean hasCommented = notification != null || esid.equals(accountEsid); for (int c2 = 0; c2 < commentCount; c2++) { JSONObject c3 = comments .getJSONObject(c2); if (c3.has(Suser)) { JSONObject c4 = c3 .getJSONObject(Suser); if (c4.getString(Sid) .equals(accountEsid)) { if (!hasCommented) { // the user has commented on this thread, notify any updates hasCommented = true; } // clear any notifications, as the user is already aware if (notification != null) { notification = null; } } else if (hasCommented) { // don't notify about user's own comments // send the parent comment sid notification = String .format(getString( R.string.friendcommented), c4.getString( SfirstName) + " " + c4.getString( SlastName)); } } } } if (notification != null) { String message = ""; if (o.has(Sshout)) { message = o.getString(Sshout) + "\n"; } if (o.has(Svenue)) { JSONObject venue = o .getJSONObject(Svenue); if (venue.has(Sname)) { message += "@" + venue .getString(Sname); } } // new notification addNotification(sid, esid, friend, message, o.getLong(ScreatedAt) * 1000, accountId, notification); } } } } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } break; case LINKEDIN: sonetOAuth = new SonetOAuth(LINKEDIN_KEY, LINKEDIN_SECRET, token, secret); // loop over notifications while (!currentNotifications.isAfterLast()) { long notificationId = currentNotifications.getLong(0); String sid = mSonetCrypto .Decrypt(currentNotifications.getString(1)); long updated = currentNotifications.getLong(2); boolean cleared = currentNotifications.getInt(3) == 1; // store sids, to avoid duplicates when requesting the latest feed if (!notificationSids.contains(sid)) { notificationSids.add(sid); } // get comments for current notifications HttpGet httpGet = new HttpGet(String .format(LINKEDIN_UPDATE_COMMENTS, LINKEDIN_BASE_URL, sid)); for (String[] header : LINKEDIN_HEADERS) httpGet.setHeader(header[0], header[1]); if ((response = SonetHttpClient.httpResponse(httpClient, sonetOAuth.getSignedRequest(httpGet))) != null) { // check for a newer post, if it's the user's own, then set CLEARED=0 try { JSONObject jsonResponse = new JSONObject(response); if (jsonResponse.has(S_total) && (jsonResponse.getInt(S_total) != 0)) { JSONArray comments = jsonResponse.getJSONArray(Svalues); int i2 = comments.length(); if (i2 > 0) { for (int i = 0; i < i2; i++) { JSONObject comment = comments.getJSONObject(i); long created_time = comment.getLong(Stimestamp); if (created_time > updated) { // new comment ContentValues values = new ContentValues(); values.put(Notifications.UPDATED, created_time); JSONObject person = comment .getJSONObject(Sperson); if (accountEsid .equals(person.getString(Sid))) { // user's own comment, clear the notification values.put(Notifications.CLEARED, 1); } else if (cleared) { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), person.getString( SfirstName) + " " + person.getString( SlastName))); values.put(Notifications.CLEARED, 0); } else { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), person.getString( SfirstName) + " " + person.getString( SlastName) + " and others")); } getContentResolver().update( Notifications.getContentUri( SonetNotifications.this), values, Notifications._ID + "=?", new String[] { Long.toString( notificationId) }); } } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } currentNotifications.moveToNext(); } // check the latest feed HttpGet httpGet = new HttpGet( String.format(LINKEDIN_UPDATES, LINKEDIN_BASE_URL)); for (String[] header : LINKEDIN_HEADERS) { httpGet.setHeader(header[0], header[1]); } if ((response = SonetHttpClient.httpResponse(httpClient, sonetOAuth.getSignedRequest(httpGet))) != null) { try { JSONArray jarr = new JSONObject(response).getJSONArray(Svalues); // if there are updates, clear the cache int d2 = jarr.length(); if (d2 > 0) { for (int d = 0; d < d2; d++) { JSONObject o = jarr.getJSONObject(d); String sid = o.getString(SupdateKey); // if already notified, ignore if (!notificationSids.contains(sid)) { String updateType = o.getString(SupdateType); JSONObject updateContent = o .getJSONObject(SupdateContent); if (LinkedIn_UpdateTypes.contains(updateType) && updateContent.has(Sperson)) { JSONObject f = updateContent .getJSONObject(Sperson); if (f.has(SfirstName) && f.has(SlastName) && f.has(Sid) && o.has(SupdateComments)) { JSONObject updateComments = o .getJSONObject(SupdateComments); if (updateComments.has(Svalues)) { String notification = null; String esid = f.getString(Sid); JSONArray comments = updateComments .getJSONArray(Svalues); int commentCount = comments.length(); // notifications if (commentCount > 0) { // default hasCommented to whether or not these comments are for the own user's status boolean hasCommented = notification != null || esid.equals(accountEsid); for (int c2 = 0; c2 < commentCount; c2++) { JSONObject c3 = comments .getJSONObject(c2); if (c3.has(Sperson)) { JSONObject c4 = c3 .getJSONObject( Sperson); if (c4.getString(Sid) .equals(accountEsid)) { if (!hasCommented) { // the user has commented on this thread, notify any updates hasCommented = true; } // clear any notifications, as the user is already aware if (notification != null) { notification = null; } } else if (hasCommented) { // don't notify about user's own comments // send the parent comment sid notification = String .format(getString( R.string.friendcommented), c4.getString( SfirstName) + " " + c4.getString( SlastName)); } } } } if (notification != null) { String update = LinkedIn_UpdateTypes .getMessage(updateType); if (LinkedIn_UpdateTypes.APPS.name() .equals(updateType)) { if (f.has(SpersonActivities)) { JSONObject personActivities = f .getJSONObject( SpersonActivities); if (personActivities .has(Svalues)) { JSONArray updates = personActivities .getJSONArray( Svalues); for (int u = 0, u2 = updates .length(); u < u2; u++) { update += updates .getJSONObject( u) .getString( Sbody); if (u < (updates .length() - 1)) update += ", "; } } } } else if (LinkedIn_UpdateTypes.CONN .name() .equals(updateType)) { if (f.has(Sconnections)) { JSONObject connections = f .getJSONObject( Sconnections); if (connections .has(Svalues)) { JSONArray updates = connections .getJSONArray( Svalues); for (int u = 0, u2 = updates .length(); u < u2; u++) { update += updates .getJSONObject( u) .getString( SfirstName) + " " + updates .getJSONObject( u) .getString( SlastName); if (u < (updates .length() - 1)) update += ", "; } } } } else if (LinkedIn_UpdateTypes.JOBP .name() .equals(updateType)) { if (updateContent.has(Sjob) && updateContent .getJSONObject( Sjob) .has(Sposition) && updateContent .getJSONObject( Sjob) .getJSONObject( Sposition) .has(Stitle)) update += updateContent .getJSONObject(Sjob) .getJSONObject( Sposition) .getString(Stitle); } else if (LinkedIn_UpdateTypes.JGRP .name() .equals(updateType)) { if (f.has(SmemberGroups)) { JSONObject memberGroups = f .getJSONObject( SmemberGroups); if (memberGroups .has(Svalues)) { JSONArray updates = memberGroups .getJSONArray( Svalues); for (int u = 0, u2 = updates .length(); u < u2; u++) { update += updates .getJSONObject( u) .getString( Sname); if (u < (updates .length() - 1)) update += ", "; } } } } else if (LinkedIn_UpdateTypes.PREC .name() .equals(updateType)) { if (f.has( SrecommendationsGiven)) { JSONObject recommendationsGiven = f .getJSONObject( SrecommendationsGiven); if (recommendationsGiven .has(Svalues)) { JSONArray updates = recommendationsGiven .getJSONArray( Svalues); for (int u = 0, u2 = updates .length(); u < u2; u++) { JSONObject recommendation = updates .getJSONObject( u); JSONObject recommendee = recommendation .getJSONObject( Srecommendee); if (recommendee.has( SfirstName)) update += recommendee .getString( SfirstName); if (recommendee.has( SlastName)) update += recommendee .getString( SlastName); if (recommendation .has(SrecommendationSnippet)) update += ":" + recommendation .getString( SrecommendationSnippet); if (u < (updates .length() - 1)) update += ", "; } } } } else if (LinkedIn_UpdateTypes.SHAR .name().equals(updateType) && f.has(ScurrentShare)) { JSONObject currentShare = f .getJSONObject( ScurrentShare); if (currentShare.has(Scomment)) update = currentShare .getString( Scomment); } // new notification addNotification(sid, esid, f.getString(SfirstName) + " " + f.getString( SlastName), update, o.getLong(Stimestamp), accountId, notification); } } } } } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } break; case GOOGLEPLUS: // get new access token, need different request here HttpPost httpPost = new HttpPost(GOOGLE_ACCESS); List<NameValuePair> httpParams = new ArrayList<NameValuePair>(); httpParams.add(new BasicNameValuePair("client_id", GOOGLE_CLIENTID)); httpParams.add( new BasicNameValuePair("client_secret", GOOGLE_CLIENTSECRET)); httpParams.add(new BasicNameValuePair("refresh_token", token)); httpParams.add(new BasicNameValuePair("grant_type", "refresh_token")); try { httpPost.setEntity(new UrlEncodedFormEntity(httpParams)); if ((response = SonetHttpClient.httpResponse(httpClient, httpPost)) != null) { JSONObject j = new JSONObject(response); if (j.has(Saccess_token)) { String access_token = j.getString(Saccess_token); while (!currentNotifications.isAfterLast()) { long notificationId = currentNotifications.getLong(0); String sid = mSonetCrypto .Decrypt(currentNotifications.getString(1)); long updated = currentNotifications.getLong(2); boolean cleared = currentNotifications.getInt(3) == 1; // store sids, to avoid duplicates when requesting the latest feed if (!notificationSids.contains(sid)) { notificationSids.add(sid); } // get comments for current notifications if ((response = SonetHttpClient.httpResponse(httpClient, new HttpGet(String.format(GOOGLEPLUS_ACTIVITY, GOOGLEPLUS_BASE_URL, sid, access_token)))) != null) { // check for a newer post, if it's the user's own, then set CLEARED=0 try { JSONObject item = new JSONObject(response); if (item.has(Sobject)) { JSONObject object = item .getJSONObject(Sobject); if (object.has(Sreplies)) { int commentCount = 0; JSONObject replies = object .getJSONObject(Sreplies); if (replies.has(StotalItems)) { //TODO: notifications } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } currentNotifications.moveToNext(); } // get new feed if ((response = SonetHttpClient.httpResponse(httpClient, new HttpGet(String.format(GOOGLEPLUS_ACTIVITIES, GOOGLEPLUS_BASE_URL, "me", "public", 20, access_token)))) != null) { JSONObject r = new JSONObject(response); if (r.has(Sitems)) { JSONArray items = r.getJSONArray(Sitems); for (int i1 = 0, i2 = items .length(); i1 < i2; i1++) { JSONObject item = items.getJSONObject(i1); if (item.has(Sactor) && item.has(Sobject)) { JSONObject actor = item .getJSONObject(Sactor); JSONObject object = item .getJSONObject(Sobject); if (item.has(Sid) && actor.has(Sid) && actor.has(SdisplayName) && item.has(Spublished) && object.has(Sreplies) && object.has(SoriginalContent)) { String sid = item.getString(Sid); String esid = actor.getString(Sid); String friend = actor .getString(SdisplayName); String originalContent = object .getString(SoriginalContent); if ((originalContent == null) || (originalContent .length() == 0)) { originalContent = object .getString(Scontent); } String photo = null; if (actor.has(Simage)) { JSONObject image = actor .getJSONObject(Simage); if (image.has(Surl)) { photo = image.getString(Surl); } } long date = parseDate( item.getString(Spublished), GOOGLEPLUS_DATE_FORMAT); int commentCount = 0; JSONObject replies = object .getJSONObject(Sreplies); String notification = null; if (replies.has(StotalItems)) { Log.d(TAG, Sreplies + ":" + replies.toString()); commentCount = replies .getInt(StotalItems); } if (notification != null) { // new notification addNotification(sid, esid, friend, originalContent, date, accountId, notification); } } } } } } } } } catch (UnsupportedEncodingException e) { Log.e(TAG, e.toString()); } catch (JSONException e) { Log.e(TAG, e.toString()); } break; } } currentNotifications.close(); } // remove old notifications getContentResolver().delete(Notifications.getContentUri(SonetNotifications.this), Notifications.CLEARED + "=1 and " + Notifications.ACCOUNT + "=? and " + Notifications.CREATED + "<?", new String[] { Long.toString(accountId), Long.toString(System.currentTimeMillis() - 86400000) }); } account.close(); widgets.moveToNext(); } } else { publishProgress("No notifications have been set up on any accounts."); } widgets.close(); return false; } else if (arg0[0] == R.id.menu_notifications_clear_all) { // clear all notifications ContentValues values = new ContentValues(); values.put(Notifications.CLEARED, 1); SonetNotifications.this.getContentResolver() .update(Notifications.getContentUri(SonetNotifications.this), values, null, null); return true; } return false; } @Override protected void onProgressUpdate(String... messages) { (Toast.makeText(SonetNotifications.this, messages[0], Toast.LENGTH_LONG)).show(); } @Override protected void onPostExecute(Boolean finish) { if (loadingDialog.isShowing()) { loadingDialog.dismiss(); } if (finish) { SonetNotifications.this.finish(); } } private void addNotification(String sid, String esid, String friend, String message, long created, long accountId, String notification) { ContentValues values = new ContentValues(); values.put(Notifications.SID, sid); values.put(Notifications.ESID, esid); values.put(Notifications.FRIEND, friend); values.put(Notifications.MESSAGE, message); values.put(Notifications.CREATED, created); values.put(Notifications.ACCOUNT, accountId); values.put(Notifications.NOTIFICATION, notification); values.put(Notifications.CLEARED, 0); values.put(Notifications.UPDATED, created); getContentResolver().insert(Notifications.getContentUri(SonetNotifications.this), values); } private long parseDate(String date, String format) { if (date != null) { // hack for the literal 'Z' if (date.substring(date.length() - 1).equals("Z")) { date = date.substring(0, date.length() - 2) + "+0000"; } Date created = null; if (format != null) { if (mSimpleDateFormat == null) { mSimpleDateFormat = new SimpleDateFormat(format, Locale.ENGLISH); // all dates should be GMT/UTC mSimpleDateFormat.setTimeZone(sTimeZone); } try { created = mSimpleDateFormat.parse(date); return created.getTime(); } catch (ParseException e) { Log.e(TAG, e.toString()); } } else { // attempt to parse RSS date if (mSimpleDateFormat != null) { try { created = mSimpleDateFormat.parse(date); return created.getTime(); } catch (ParseException e) { Log.e(TAG, e.toString()); } } for (String rfc822 : sRFC822) { mSimpleDateFormat = new SimpleDateFormat(rfc822, Locale.ENGLISH); mSimpleDateFormat.setTimeZone(sTimeZone); try { if ((created = mSimpleDateFormat.parse(date)) != null) { return created.getTime(); } } catch (ParseException e) { Log.e(TAG, e.toString()); } } } } return System.currentTimeMillis(); } }; loadingDialog.setMessage(getString(R.string.loading)); loadingDialog.setCancelable(true); loadingDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { if (!asyncTask.isCancelled()) asyncTask.cancel(true); } }); loadingDialog.setButton(ProgressDialog.BUTTON_NEGATIVE, getString(android.R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); loadingDialog.show(); asyncTask.execute(item.getItemId()); return true; // return super.onOptionsItemSelected(item); }
From source file:com.piusvelte.sonet.SonetNotifications.java
@Override public boolean onOptionsItemSelected(MenuItem item) { final ProgressDialog loadingDialog = new ProgressDialog(this); final AsyncTask<Integer, String, Boolean> asyncTask = new AsyncTask<Integer, String, Boolean>() { @Override/*from www. j a v a 2 s . c o m*/ protected Boolean doInBackground(Integer... arg0) { if (arg0[0] == R.id.menu_notifications_refresh) { // select all accounts with notifications set Cursor widgets = getContentResolver().query( Widgets_settings.getDistinctContentUri(SonetNotifications.this), new String[] { Widgets.ACCOUNT }, Widgets.ACCOUNT + "!=-1 and (" + Widgets.LIGHTS + "=1 or " + Widgets.VIBRATE + "=1 or " + Widgets.SOUND + "=1)", null, null); if (widgets.moveToFirst()) { mSonetCrypto = SonetCrypto.getInstance(getApplicationContext()); HttpClient httpClient = SonetHttpClient.getThreadSafeClient(getApplicationContext()); while (!widgets.isAfterLast()) { long accountId = widgets.getLong(0); ArrayList<String> notificationSids = new ArrayList<String>(); Cursor account = getContentResolver().query( Accounts.getContentUri(SonetNotifications.this), new String[] { Accounts.TOKEN, Accounts.SECRET, Accounts.SERVICE, Accounts.SID }, Accounts._ID + "=?", new String[] { Long.toString(accountId) }, null); if (account.moveToFirst()) { // for each account, for each notification, check for updates // if there are no updates past 24hrs and cleared, delete String token = mSonetCrypto.Decrypt(account.getString(0)); String secret = mSonetCrypto.Decrypt(account.getString(1)); int service = account.getInt(2); String accountEsid = mSonetCrypto.Decrypt(account.getString(3)); mSimpleDateFormat = null; if (service == TWITTER) { Cursor currentNotifications = getContentResolver().query( Notifications.getContentUri(SonetNotifications.this), new String[] { Notifications.SID }, Notifications.ACCOUNT + "=?", new String[] { Long.toString(accountId) }, null); // loop over notifications if (currentNotifications.moveToFirst()) { // store sids, to avoid duplicates when requesting the latest feed String sid = mSonetCrypto.Decrypt(currentNotifications.getString(0)); if (!notificationSids.contains(sid)) { notificationSids.add(sid); } } currentNotifications.close(); // limit to newest status SonetOAuth sonetOAuth = new SonetOAuth(BuildConfig.TWITTER_KEY, BuildConfig.TWITTER_SECRET, token, secret); String last_sid = null; Cursor last_status = getContentResolver().query( Statuses.getContentUri(SonetNotifications.this), new String[] { Statuses.SID }, Statuses.ACCOUNT + "=?", new String[] { Long.toString(accountId) }, Statuses.CREATED + " ASC LIMIT 1"); if (last_status.moveToFirst()) { last_sid = mSonetCrypto.Decrypt(last_status.getString(0)); } last_status.close(); // get all mentions since the oldest status for this account String response = SonetHttpClient.httpResponse(httpClient, sonetOAuth.getSignedRequest( new HttpGet(String.format(TWITTER_MENTIONS, TWITTER_BASE_URL, last_sid != null ? String.format(TWITTER_SINCE_ID, last_sid) : "")))); if (response != null) { try { JSONArray comments = new JSONArray(response); for (int i = 0, i2 = comments.length(); i < i2; i++) { JSONObject comment = comments.getJSONObject(i); JSONObject user = comment.getJSONObject(Suser); if (!user.getString(Sid).equals(accountEsid) && !notificationSids.contains(comment.getString(Sid))) { String friend = user.getString(Sname); addNotification(comment.getString(Sid), user.getString(Sid), friend, comment.getString("text"), parseDate(comment.getString("created_at"), TWITTER_DATE_FORMAT), accountId, friend + " mentioned you on Twitter"); } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } } else if (service == IDENTICA) { Cursor currentNotifications = getContentResolver().query( Notifications.getContentUri(SonetNotifications.this), new String[] { Notifications.SID }, Notifications.ACCOUNT + "=?", new String[] { Long.toString(accountId) }, null); // loop over notifications if (currentNotifications.moveToFirst()) { // store sids, to avoid duplicates when requesting the latest feed String sid = mSonetCrypto.Decrypt(currentNotifications.getString(0)); if (!notificationSids.contains(sid)) { notificationSids.add(sid); } } currentNotifications.close(); // limit to newest status SonetOAuth sonetOAuth = new SonetOAuth(BuildConfig.IDENTICA_KEY, BuildConfig.IDENTICA_SECRET, token, secret); String last_sid = null; Cursor last_status = getContentResolver().query( Statuses.getContentUri(SonetNotifications.this), new String[] { Statuses.SID }, Statuses.ACCOUNT + "=?", new String[] { Long.toString(accountId) }, Statuses.CREATED + " ASC LIMIT 1"); if (last_status.moveToFirst()) { last_sid = mSonetCrypto.Decrypt(last_status.getString(0)); } last_status.close(); // get all mentions since the oldest status for this account String response = SonetHttpClient.httpResponse(httpClient, sonetOAuth.getSignedRequest( new HttpGet(String.format(IDENTICA_MENTIONS, IDENTICA_BASE_URL, last_sid != null ? String.format(IDENTICA_SINCE_ID, last_sid) : "")))); if (response != null) { try { JSONArray comments = new JSONArray(response); for (int i = 0, i2 = comments.length(); i < i2; i++) { JSONObject comment = comments.getJSONObject(i); JSONObject user = comment.getJSONObject(Suser); if (!user.getString(Sid).equals(accountEsid) && !notificationSids.contains(comment.getString(Sid))) { String friend = user.getString(Sname); addNotification(comment.getString(Sid), user.getString(Sid), friend, comment.getString("text"), parseDate(comment.getString("created_at"), TWITTER_DATE_FORMAT), accountId, friend + " mentioned you on Identi.ca"); } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } } else { Cursor currentNotifications = getContentResolver().query( Notifications.getContentUri(SonetNotifications.this), new String[] { Notifications._ID, Notifications.SID, Notifications.UPDATED, Notifications.CLEARED, Notifications.ESID }, Notifications.ACCOUNT + "=?", new String[] { Long.toString(accountId) }, null); if (currentNotifications.moveToFirst()) { String response; SonetOAuth sonetOAuth; switch (service) { case FACEBOOK: // loop over notifications while (!currentNotifications.isAfterLast()) { long notificationId = currentNotifications.getLong(0); String sid = mSonetCrypto .Decrypt(currentNotifications.getString(1)); long updated = currentNotifications.getLong(2); boolean cleared = currentNotifications.getInt(3) == 1; // store sids, to avoid duplicates when requesting the latest feed if (!notificationSids.contains(sid)) { notificationSids.add(sid); } // get comments for current notifications if ((response = SonetHttpClient.httpResponse(httpClient, new HttpGet( String.format(FACEBOOK_COMMENTS, FACEBOOK_BASE_URL, sid, Saccess_token, token)))) != null) { // check for a newer post, if it's the user's own, then set CLEARED=0 try { JSONArray comments = new JSONObject(response) .getJSONArray(Sdata); int i2 = comments.length(); if (i2 > 0) { for (int i = 0; i < i2; i++) { JSONObject comment = comments.getJSONObject(i); long created_time = comment.getLong(Screated_time) * 1000; if (created_time > updated) { // new comment ContentValues values = new ContentValues(); values.put(Notifications.UPDATED, created_time); JSONObject from = comment.getJSONObject(Sfrom); if (accountEsid.equals(from.getString(Sid))) { // user's own comment, clear the notification values.put(Notifications.CLEARED, 1); } else if (cleared) { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), from.getString(Sname))); values.put(Notifications.CLEARED, 0); } else { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), from.getString(Sname) + " and others")); } getContentResolver().update( Notifications.getContentUri( SonetNotifications.this), values, Notifications._ID + "=?", new String[] { Long .toString(notificationId) }); } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } currentNotifications.moveToNext(); } // check the latest feed if ((response = SonetHttpClient.httpResponse(httpClient, new HttpGet(String.format(FACEBOOK_HOME, FACEBOOK_BASE_URL, Saccess_token, token)))) != null) { try { JSONArray jarr = new JSONObject(response).getJSONArray(Sdata); // if there are updates, clear the cache int d2 = jarr.length(); if (d2 > 0) { for (int d = 0; d < d2; d++) { JSONObject o = jarr.getJSONObject(d); String sid = o.getString(Sid); // if already notified, ignore if (!notificationSids.contains(sid)) { // only parse status types, not photo, video or link if (o.has(Stype) && o.has(Sfrom)) { JSONObject f = o.getJSONObject(Sfrom); if (f.has(Sname) && f.has(Sid)) { String notification = null; String esid = f.getString(Sid); String friend = f.getString(Sname); if (o.has(Sto)) { // handle wall messages from one friend to another JSONObject t = o.getJSONObject(Sto); if (t.has(Sdata)) { JSONObject n = t.getJSONArray(Sdata) .getJSONObject(0); if (n.has(Sname)) { if (n.has(Sid) && (n .getString(Sid) .equals(accountEsid))) { notification = String .format(getString( R.string.friendcommented), friend); } } } } int commentCount = 0; if (o.has(Scomments)) { JSONObject jo = o .getJSONObject(Scomments); if (jo.has(Sdata)) { JSONArray comments = jo .getJSONArray(Sdata); commentCount = comments.length(); // notifications if ((sid != null) && (commentCount > 0)) { // default hasCommented to whether or not these comments are for the own user's status boolean hasCommented = notification != null || esid.equals( accountEsid); for (int c2 = 0; c2 < commentCount; c2++) { JSONObject c3 = comments .getJSONObject(c2); if (c3.has(Sfrom)) { JSONObject c4 = c3 .getJSONObject( Sfrom); if (c4.getString(Sid) .equals(accountEsid)) { if (!hasCommented) { // the user has commented on this thread, notify any updates hasCommented = true; } // clear any notifications, as the user is already aware if (notification != null) { notification = null; } } else if (hasCommented) { // don't notify about user's own comments // send the parent comment sid notification = String .format(getString( R.string.friendcommented), c4.getString( Sname)); } } } } } } if (notification != null) { String message = o.has(Smessage) ? o.getString(Smessage) : null; if (!o.getString(Stype).equals(Sstatus) && o.has(Slink)) { message = message == null ? "[" + o.getString(Stype) + "]" : "[" + o.getString(Stype) + "]"; } // new notification addNotification(sid, esid, friend, message, o.getLong(Screated_time) * 1000, accountId, notification); } } } } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } break; case MYSPACE: sonetOAuth = new SonetOAuth(BuildConfig.MYSPACE_KEY, BuildConfig.MYSPACE_SECRET, token, secret); // loop over notifications while (!currentNotifications.isAfterLast()) { long notificationId = currentNotifications.getLong(0); String sid = mSonetCrypto .Decrypt(currentNotifications.getString(1)); long updated = currentNotifications.getLong(2); boolean cleared = currentNotifications.getInt(3) == 1; String esid = mSonetCrypto .Decrypt(currentNotifications.getString(4)); // store sids, to avoid duplicates when requesting the latest feed if (!notificationSids.contains(sid)) { notificationSids.add(sid); } // get comments for current notifications if ((response = SonetHttpClient.httpResponse(httpClient, sonetOAuth.getSignedRequest(new HttpGet( String.format(MYSPACE_URL_STATUSMOODCOMMENTS, MYSPACE_BASE_URL, esid, sid))))) != null) { // check for a newer post, if it's the user's own, then set CLEARED=0 try { JSONArray comments = new JSONObject(response) .getJSONArray(Sentry); int i2 = comments.length(); if (i2 > 0) { for (int i = 0; i < i2; i++) { JSONObject comment = comments.getJSONObject(i); long created_time = parseDate( comment.getString(SpostedDate), MYSPACE_DATE_FORMAT); if (created_time > updated) { // new comment ContentValues values = new ContentValues(); values.put(Notifications.UPDATED, created_time); JSONObject author = comment .getJSONObject(Sauthor); if (accountEsid.equals(author.getString(Sid))) { // user's own comment, clear the notification values.put(Notifications.CLEARED, 1); } else if (cleared) { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), comment.getString( SdisplayName))); values.put(Notifications.CLEARED, 0); } else { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), comment.getString( SdisplayName) + " and others")); } getContentResolver().update( Notifications.getContentUri( SonetNotifications.this), values, Notifications._ID + "=?", new String[] { Long .toString(notificationId) }); } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } currentNotifications.moveToNext(); } // check the latest feed if ((response = SonetHttpClient .httpResponse(httpClient, sonetOAuth.getSignedRequest( new HttpGet(String.format(MYSPACE_HISTORY, MYSPACE_BASE_URL))))) != null) { try { JSONArray jarr = new JSONObject(response).getJSONArray(Sentry); // if there are updates, clear the cache int d2 = jarr.length(); if (d2 > 0) { for (int d = 0; d < d2; d++) { JSONObject o = jarr.getJSONObject(d); String sid = o.getString(SstatusId); // if already notified, ignore if (!notificationSids.contains(sid)) { if (o.has(Sauthor) && o.has(SrecentComments)) { JSONObject f = o.getJSONObject(Sauthor); if (f.has(SdisplayName) && f.has(Sid)) { String notification = null; String esid = f.getString(Sid); String friend = f.getString(SdisplayName); JSONArray comments = o .getJSONArray(SrecentComments); int commentCount = comments.length(); // notifications if ((sid != null) && (commentCount > 0)) { // default hasCommented to whether or not these comments are for the own user's status boolean hasCommented = notification != null || esid.equals(accountEsid); for (int c2 = 0; c2 < commentCount; c2++) { JSONObject c3 = comments .getJSONObject(c2); if (c3.has(Sauthor)) { JSONObject c4 = c3 .getJSONObject(Sauthor); if (c4.getString(Sid) .equals(accountEsid)) { if (!hasCommented) { // the user has commented on this thread, notify any updates hasCommented = true; } // clear any notifications, as the user is already aware if (notification != null) { notification = null; } } else if (hasCommented) { // don't notify about user's own comments // send the parent comment sid notification = String .format(getString( R.string.friendcommented), c4.getString( SdisplayName)); } } } } if (notification != null) { // new notification addNotification(sid, esid, friend, o.getString(Sstatus), parseDate(o.getString( "moodStatusLastUpdated"), MYSPACE_DATE_FORMAT), accountId, notification); } } } } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } break; case FOURSQUARE: // loop over notifications while (!currentNotifications.isAfterLast()) { long notificationId = currentNotifications.getLong(0); String sid = mSonetCrypto .Decrypt(currentNotifications.getString(1)); long updated = currentNotifications.getLong(2); boolean cleared = currentNotifications.getInt(3) == 1; // store sids, to avoid duplicates when requesting the latest feed if (!notificationSids.contains(sid)) { notificationSids.add(sid); } // get comments for current notifications if ((response = SonetHttpClient.httpResponse(httpClient, new HttpGet(String.format(FOURSQUARE_GET_CHECKIN, FOURSQUARE_BASE_URL, sid, token)))) != null) { // check for a newer post, if it's the user's own, then set CLEARED=0 try { JSONArray comments = new JSONObject(response) .getJSONObject(Sresponse).getJSONObject(Scheckin) .getJSONObject(Scomments).getJSONArray(Sitems); int i2 = comments.length(); if (i2 > 0) { for (int i = 0; i < i2; i++) { JSONObject comment = comments.getJSONObject(i); long created_time = comment.getLong(ScreatedAt) * 1000; if (created_time > updated) { // new comment ContentValues values = new ContentValues(); values.put(Notifications.UPDATED, created_time); JSONObject user = comment.getJSONObject(Suser); if (accountEsid.equals(user.getString(Sid))) { // user's own comment, clear the notification values.put(Notifications.CLEARED, 1); } else if (cleared) { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), user.getString(SfirstName) + " " + user.getString( SlastName))); values.put(Notifications.CLEARED, 0); } else { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), user.getString(SfirstName) + " " + user.getString( SlastName) + " and others")); } getContentResolver().update( Notifications.getContentUri( SonetNotifications.this), values, Notifications._ID + "=?", new String[] { Long .toString(notificationId) }); } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } currentNotifications.moveToNext(); } // check the latest feed if ((response = SonetHttpClient.httpResponse(httpClient, new HttpGet(String.format(FOURSQUARE_CHECKINS, FOURSQUARE_BASE_URL, token)))) != null) { try { JSONArray jarr = new JSONObject(response) .getJSONObject(Sresponse).getJSONArray(Srecent); // if there are updates, clear the cache int d2 = jarr.length(); if (d2 > 0) { for (int d = 0; d < d2; d++) { JSONObject o = jarr.getJSONObject(d); String sid = o.getString(Sid); // if already notified, ignore if (!notificationSids.contains(sid)) { if (o.has(Suser) && o.has(Scomments)) { JSONObject f = o.getJSONObject(Suser); if (f.has(SfirstName) && f.has(SlastName) && f.has(Sid)) { String notification = null; String esid = f.getString(Sid); String friend = f.getString(SfirstName) + " " + f.getString(SlastName); JSONArray comments = o .getJSONArray(Scomments); int commentCount = comments.length(); // notifications if (commentCount > 0) { // default hasCommented to whether or not these comments are for the own user's status boolean hasCommented = notification != null || esid.equals(accountEsid); for (int c2 = 0; c2 < commentCount; c2++) { JSONObject c3 = comments .getJSONObject(c2); if (c3.has(Suser)) { JSONObject c4 = c3 .getJSONObject(Suser); if (c4.getString(Sid) .equals(accountEsid)) { if (!hasCommented) { // the user has commented on this thread, notify any updates hasCommented = true; } // clear any notifications, as the user is already aware if (notification != null) { notification = null; } } else if (hasCommented) { // don't notify about user's own comments // send the parent comment sid notification = String .format(getString( R.string.friendcommented), c4.getString( SfirstName) + " " + c4.getString( SlastName)); } } } } if (notification != null) { String message = ""; if (o.has(Sshout)) { message = o.getString(Sshout) + "\n"; } if (o.has(Svenue)) { JSONObject venue = o .getJSONObject(Svenue); if (venue.has(Sname)) { message += "@" + venue .getString(Sname); } } // new notification addNotification(sid, esid, friend, message, o.getLong(ScreatedAt) * 1000, accountId, notification); } } } } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } break; case LINKEDIN: sonetOAuth = new SonetOAuth(BuildConfig.LINKEDIN_KEY, BuildConfig.LINKEDIN_SECRET, token, secret); // loop over notifications while (!currentNotifications.isAfterLast()) { long notificationId = currentNotifications.getLong(0); String sid = mSonetCrypto .Decrypt(currentNotifications.getString(1)); long updated = currentNotifications.getLong(2); boolean cleared = currentNotifications.getInt(3) == 1; // store sids, to avoid duplicates when requesting the latest feed if (!notificationSids.contains(sid)) { notificationSids.add(sid); } // get comments for current notifications HttpGet httpGet = new HttpGet(String .format(LINKEDIN_UPDATE_COMMENTS, LINKEDIN_BASE_URL, sid)); for (String[] header : LINKEDIN_HEADERS) httpGet.setHeader(header[0], header[1]); if ((response = SonetHttpClient.httpResponse(httpClient, sonetOAuth.getSignedRequest(httpGet))) != null) { // check for a newer post, if it's the user's own, then set CLEARED=0 try { JSONObject jsonResponse = new JSONObject(response); if (jsonResponse.has(S_total) && (jsonResponse.getInt(S_total) != 0)) { JSONArray comments = jsonResponse.getJSONArray(Svalues); int i2 = comments.length(); if (i2 > 0) { for (int i = 0; i < i2; i++) { JSONObject comment = comments.getJSONObject(i); long created_time = comment.getLong(Stimestamp); if (created_time > updated) { // new comment ContentValues values = new ContentValues(); values.put(Notifications.UPDATED, created_time); JSONObject person = comment .getJSONObject(Sperson); if (accountEsid .equals(person.getString(Sid))) { // user's own comment, clear the notification values.put(Notifications.CLEARED, 1); } else if (cleared) { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), person.getString( SfirstName) + " " + person.getString( SlastName))); values.put(Notifications.CLEARED, 0); } else { values.put(Notifications.NOTIFICATION, String.format(getString( R.string.friendcommented), person.getString( SfirstName) + " " + person.getString( SlastName) + " and others")); } getContentResolver().update( Notifications.getContentUri( SonetNotifications.this), values, Notifications._ID + "=?", new String[] { Long.toString( notificationId) }); } } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } currentNotifications.moveToNext(); } // check the latest feed HttpGet httpGet = new HttpGet( String.format(LINKEDIN_UPDATES, LINKEDIN_BASE_URL)); for (String[] header : LINKEDIN_HEADERS) { httpGet.setHeader(header[0], header[1]); } if ((response = SonetHttpClient.httpResponse(httpClient, sonetOAuth.getSignedRequest(httpGet))) != null) { try { JSONArray jarr = new JSONObject(response).getJSONArray(Svalues); // if there are updates, clear the cache int d2 = jarr.length(); if (d2 > 0) { for (int d = 0; d < d2; d++) { JSONObject o = jarr.getJSONObject(d); String sid = o.getString(SupdateKey); // if already notified, ignore if (!notificationSids.contains(sid)) { String updateType = o.getString(SupdateType); JSONObject updateContent = o .getJSONObject(SupdateContent); if (LinkedIn_UpdateTypes.contains(updateType) && updateContent.has(Sperson)) { JSONObject f = updateContent .getJSONObject(Sperson); if (f.has(SfirstName) && f.has(SlastName) && f.has(Sid) && o.has(SupdateComments)) { JSONObject updateComments = o .getJSONObject(SupdateComments); if (updateComments.has(Svalues)) { String notification = null; String esid = f.getString(Sid); JSONArray comments = updateComments .getJSONArray(Svalues); int commentCount = comments.length(); // notifications if (commentCount > 0) { // default hasCommented to whether or not these comments are for the own user's status boolean hasCommented = notification != null || esid.equals(accountEsid); for (int c2 = 0; c2 < commentCount; c2++) { JSONObject c3 = comments .getJSONObject(c2); if (c3.has(Sperson)) { JSONObject c4 = c3 .getJSONObject( Sperson); if (c4.getString(Sid) .equals(accountEsid)) { if (!hasCommented) { // the user has commented on this thread, notify any updates hasCommented = true; } // clear any notifications, as the user is already aware if (notification != null) { notification = null; } } else if (hasCommented) { // don't notify about user's own comments // send the parent comment sid notification = String .format(getString( R.string.friendcommented), c4.getString( SfirstName) + " " + c4.getString( SlastName)); } } } } if (notification != null) { String update = LinkedIn_UpdateTypes .getMessage(updateType); if (LinkedIn_UpdateTypes.APPS.name() .equals(updateType)) { if (f.has(SpersonActivities)) { JSONObject personActivities = f .getJSONObject( SpersonActivities); if (personActivities .has(Svalues)) { JSONArray updates = personActivities .getJSONArray( Svalues); for (int u = 0, u2 = updates .length(); u < u2; u++) { update += updates .getJSONObject( u) .getString( Sbody); if (u < (updates .length() - 1)) update += ", "; } } } } else if (LinkedIn_UpdateTypes.CONN .name() .equals(updateType)) { if (f.has(Sconnections)) { JSONObject connections = f .getJSONObject( Sconnections); if (connections .has(Svalues)) { JSONArray updates = connections .getJSONArray( Svalues); for (int u = 0, u2 = updates .length(); u < u2; u++) { update += updates .getJSONObject( u) .getString( SfirstName) + " " + updates .getJSONObject( u) .getString( SlastName); if (u < (updates .length() - 1)) update += ", "; } } } } else if (LinkedIn_UpdateTypes.JOBP .name() .equals(updateType)) { if (updateContent.has(Sjob) && updateContent .getJSONObject( Sjob) .has(Sposition) && updateContent .getJSONObject( Sjob) .getJSONObject( Sposition) .has(Stitle)) update += updateContent .getJSONObject(Sjob) .getJSONObject( Sposition) .getString(Stitle); } else if (LinkedIn_UpdateTypes.JGRP .name() .equals(updateType)) { if (f.has(SmemberGroups)) { JSONObject memberGroups = f .getJSONObject( SmemberGroups); if (memberGroups .has(Svalues)) { JSONArray updates = memberGroups .getJSONArray( Svalues); for (int u = 0, u2 = updates .length(); u < u2; u++) { update += updates .getJSONObject( u) .getString( Sname); if (u < (updates .length() - 1)) update += ", "; } } } } else if (LinkedIn_UpdateTypes.PREC .name() .equals(updateType)) { if (f.has( SrecommendationsGiven)) { JSONObject recommendationsGiven = f .getJSONObject( SrecommendationsGiven); if (recommendationsGiven .has(Svalues)) { JSONArray updates = recommendationsGiven .getJSONArray( Svalues); for (int u = 0, u2 = updates .length(); u < u2; u++) { JSONObject recommendation = updates .getJSONObject( u); JSONObject recommendee = recommendation .getJSONObject( Srecommendee); if (recommendee.has( SfirstName)) update += recommendee .getString( SfirstName); if (recommendee.has( SlastName)) update += recommendee .getString( SlastName); if (recommendation .has(SrecommendationSnippet)) update += ":" + recommendation .getString( SrecommendationSnippet); if (u < (updates .length() - 1)) update += ", "; } } } } else if (LinkedIn_UpdateTypes.SHAR .name().equals(updateType) && f.has(ScurrentShare)) { JSONObject currentShare = f .getJSONObject( ScurrentShare); if (currentShare.has(Scomment)) update = currentShare .getString( Scomment); } // new notification addNotification(sid, esid, f.getString(SfirstName) + " " + f.getString( SlastName), update, o.getLong(Stimestamp), accountId, notification); } } } } } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } break; case GOOGLEPLUS: // get new access token, need different request here HttpPost httpPost = new HttpPost(GOOGLE_ACCESS); List<NameValuePair> httpParams = new ArrayList<NameValuePair>(); httpParams.add(new BasicNameValuePair("client_id", BuildConfig.GOOGLECLIENT_ID)); httpParams.add(new BasicNameValuePair("client_secret", BuildConfig.GOOGLECLIENT_SECRET)); httpParams.add(new BasicNameValuePair("refresh_token", token)); httpParams.add(new BasicNameValuePair("grant_type", "refresh_token")); try { httpPost.setEntity(new UrlEncodedFormEntity(httpParams)); if ((response = SonetHttpClient.httpResponse(httpClient, httpPost)) != null) { JSONObject j = new JSONObject(response); if (j.has(Saccess_token)) { String access_token = j.getString(Saccess_token); while (!currentNotifications.isAfterLast()) { long notificationId = currentNotifications.getLong(0); String sid = mSonetCrypto .Decrypt(currentNotifications.getString(1)); long updated = currentNotifications.getLong(2); boolean cleared = currentNotifications.getInt(3) == 1; // store sids, to avoid duplicates when requesting the latest feed if (!notificationSids.contains(sid)) { notificationSids.add(sid); } // get comments for current notifications if ((response = SonetHttpClient.httpResponse(httpClient, new HttpGet(String.format(GOOGLEPLUS_ACTIVITY, GOOGLEPLUS_BASE_URL, sid, access_token)))) != null) { // check for a newer post, if it's the user's own, then set CLEARED=0 try { JSONObject item = new JSONObject(response); if (item.has(Sobject)) { JSONObject object = item .getJSONObject(Sobject); if (object.has(Sreplies)) { int commentCount = 0; JSONObject replies = object .getJSONObject(Sreplies); if (replies.has(StotalItems)) { //TODO: notifications } } } } catch (JSONException e) { Log.e(TAG, service + ":" + e.toString()); } } currentNotifications.moveToNext(); } // get new feed if ((response = SonetHttpClient.httpResponse(httpClient, new HttpGet(String.format(GOOGLEPLUS_ACTIVITIES, GOOGLEPLUS_BASE_URL, "me", "public", 20, access_token)))) != null) { JSONObject r = new JSONObject(response); if (r.has(Sitems)) { JSONArray items = r.getJSONArray(Sitems); for (int i1 = 0, i2 = items .length(); i1 < i2; i1++) { JSONObject item = items.getJSONObject(i1); if (item.has(Sactor) && item.has(Sobject)) { JSONObject actor = item .getJSONObject(Sactor); JSONObject object = item .getJSONObject(Sobject); if (item.has(Sid) && actor.has(Sid) && actor.has(SdisplayName) && item.has(Spublished) && object.has(Sreplies) && object.has(SoriginalContent)) { String sid = item.getString(Sid); String esid = actor.getString(Sid); String friend = actor .getString(SdisplayName); String originalContent = object .getString(SoriginalContent); if ((originalContent == null) || (originalContent .length() == 0)) { originalContent = object .getString(Scontent); } String photo = null; if (actor.has(Simage)) { JSONObject image = actor .getJSONObject(Simage); if (image.has(Surl)) { photo = image.getString(Surl); } } long date = parseDate( item.getString(Spublished), GOOGLEPLUS_DATE_FORMAT); int commentCount = 0; JSONObject replies = object .getJSONObject(Sreplies); String notification = null; if (replies.has(StotalItems)) { Log.d(TAG, Sreplies + ":" + replies.toString()); commentCount = replies .getInt(StotalItems); } if (notification != null) { // new notification addNotification(sid, esid, friend, originalContent, date, accountId, notification); } } } } } } } } } catch (UnsupportedEncodingException e) { Log.e(TAG, e.toString()); } catch (JSONException e) { Log.e(TAG, e.toString()); } break; } } currentNotifications.close(); } // remove old notifications getContentResolver().delete(Notifications.getContentUri(SonetNotifications.this), Notifications.CLEARED + "=1 and " + Notifications.ACCOUNT + "=? and " + Notifications.CREATED + "<?", new String[] { Long.toString(accountId), Long.toString(System.currentTimeMillis() - 86400000) }); } account.close(); widgets.moveToNext(); } } else { publishProgress("No notifications have been set up on any accounts."); } widgets.close(); return false; } else if (arg0[0] == R.id.menu_notifications_clear_all) { // clear all notifications ContentValues values = new ContentValues(); values.put(Notifications.CLEARED, 1); SonetNotifications.this.getContentResolver() .update(Notifications.getContentUri(SonetNotifications.this), values, null, null); return true; } return false; } @Override protected void onProgressUpdate(String... messages) { (Toast.makeText(SonetNotifications.this, messages[0], Toast.LENGTH_LONG)).show(); } @Override protected void onPostExecute(Boolean finish) { if (loadingDialog.isShowing()) { loadingDialog.dismiss(); } if (finish) { SonetNotifications.this.finish(); } } private void addNotification(String sid, String esid, String friend, String message, long created, long accountId, String notification) { ContentValues values = new ContentValues(); values.put(Notifications.SID, sid); values.put(Notifications.ESID, esid); values.put(Notifications.FRIEND, friend); values.put(Notifications.MESSAGE, message); values.put(Notifications.CREATED, created); values.put(Notifications.ACCOUNT, accountId); values.put(Notifications.NOTIFICATION, notification); values.put(Notifications.CLEARED, 0); values.put(Notifications.UPDATED, created); getContentResolver().insert(Notifications.getContentUri(SonetNotifications.this), values); } private long parseDate(String date, String format) { if (date != null) { // hack for the literal 'Z' if (date.substring(date.length() - 1).equals("Z")) { date = date.substring(0, date.length() - 2) + "+0000"; } Date created = null; if (format != null) { if (mSimpleDateFormat == null) { mSimpleDateFormat = new SimpleDateFormat(format, Locale.ENGLISH); // all dates should be GMT/UTC mSimpleDateFormat.setTimeZone(sTimeZone); } try { created = mSimpleDateFormat.parse(date); return created.getTime(); } catch (ParseException e) { Log.e(TAG, e.toString()); } } else { // attempt to parse RSS date if (mSimpleDateFormat != null) { try { created = mSimpleDateFormat.parse(date); return created.getTime(); } catch (ParseException e) { Log.e(TAG, e.toString()); } } for (String rfc822 : sRFC822) { mSimpleDateFormat = new SimpleDateFormat(rfc822, Locale.ENGLISH); mSimpleDateFormat.setTimeZone(sTimeZone); try { if ((created = mSimpleDateFormat.parse(date)) != null) { return created.getTime(); } } catch (ParseException e) { Log.e(TAG, e.toString()); } } } } return System.currentTimeMillis(); } }; loadingDialog.setMessage(getString(R.string.loading)); loadingDialog.setCancelable(true); loadingDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { if (!asyncTask.isCancelled()) asyncTask.cancel(true); } }); loadingDialog.setButton(ProgressDialog.BUTTON_NEGATIVE, getString(android.R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); loadingDialog.show(); asyncTask.execute(item.getItemId()); return true; // return super.onOptionsItemSelected(item); }