From 6565be3a83e15a7c74032b8c720b33f3fb73df9e Mon Sep 17 00:00:00 2001 From: Libin Lu Date: Fri, 15 Sep 2017 14:15:35 -0400 Subject: [PATCH] fix http request in android notif --- Examples/simple-fcm-client/app/App.js | 7 +- .../react/fcm/FIRLocalMessagingHelper.java | 218 +-------------- .../react/fcm/SendNotificationTask.java | 249 ++++++++++++++++++ 3 files changed, 261 insertions(+), 213 deletions(-) create mode 100644 android/src/main/java/com/evollu/react/fcm/SendNotificationTask.java diff --git a/Examples/simple-fcm-client/app/App.js b/Examples/simple-fcm-client/app/App.js index 6ea94f4..2ac0069 100644 --- a/Examples/simple-fcm-client/app/App.js +++ b/Examples/simple-fcm-client/app/App.js @@ -41,10 +41,11 @@ export default class App extends Component { vibrate: 500, title: 'Hello', body: 'Test Notification', + big_text: 'i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large, i am large', priority: "high", sound: "bell.mp3", - show_in_foreground: true, - picture: 'https://firebase.google.com/_static/af7ae4b3fc/images/firebase/lockup.png' + large_icon: "https://image.freepik.com/free-icon/small-boy-cartoon_318-38077.jpg", + show_in_foreground: true }); } @@ -55,7 +56,9 @@ export default class App extends Component { vibrate: 500, title: 'Hello', body: 'Test Scheduled Notification', + sub_text: 'sub text', priority: "high", + large_icon: "https://image.freepik.com/free-icon/small-boy-cartoon_318-38077.jpg", show_in_foreground: true, picture: 'https://firebase.google.com/_static/af7ae4b3fc/images/firebase/lockup.png' }); diff --git a/android/src/main/java/com/evollu/react/fcm/FIRLocalMessagingHelper.java b/android/src/main/java/com/evollu/react/fcm/FIRLocalMessagingHelper.java index acc38a2..eca4004 100644 --- a/android/src/main/java/com/evollu/react/fcm/FIRLocalMessagingHelper.java +++ b/android/src/main/java/com/evollu/react/fcm/FIRLocalMessagingHelper.java @@ -2,33 +2,23 @@ package com.evollu.react.fcm; -import android.app.*; +import android.app.AlarmManager; +import android.app.Application; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.graphics.Color; -import android.media.RingtoneManager; -import android.net.Uri; +import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; -import android.support.v4.app.NotificationCompat; import android.util.Log; -import android.util.Patterns; -import android.content.SharedPreferences; + import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.HttpURLConnection; public class FIRLocalMessagingHelper { - private static final long DEFAULT_VIBRATION = 300L; private static final String TAG = FIRLocalMessagingHelper.class.getSimpleName(); private final static String PREFERENCES_KEY = "ReactNativeSystemNotification"; private static boolean mIsForeground = false; //this is a hack @@ -53,187 +43,7 @@ public class FIRLocalMessagingHelper { } public void sendNotification(Bundle bundle) { - try { - String intentClassName = getMainActivityClassName(); - if (intentClassName == null) { - return; - } - - if (bundle.getString("body") == null) { - return; - } - - Resources res = mContext.getResources(); - String packageName = mContext.getPackageName(); - - String title = bundle.getString("title"); - if (title == null) { - ApplicationInfo appInfo = mContext.getApplicationInfo(); - title = mContext.getPackageManager().getApplicationLabel(appInfo).toString(); - } - - NotificationCompat.Builder notification = new NotificationCompat.Builder(mContext) - .setContentTitle(title) - .setContentText(bundle.getString("body")) - .setTicker(bundle.getString("ticker")) - .setVisibility(NotificationCompat.VISIBILITY_PRIVATE) - .setAutoCancel(bundle.getBoolean("auto_cancel", true)) - .setNumber(bundle.getInt("number")) - .setSubText(bundle.getString("sub_text")) - .setGroup(bundle.getString("group")) - .setVibrate(new long[]{0, DEFAULT_VIBRATION}) - .setExtras(bundle.getBundle("data")); - - if (bundle.containsKey("ongoing") && bundle.getBoolean("ongoing")) { - notification.setOngoing(bundle.getBoolean("ongoing")); - } - - //priority - String priority = bundle.getString("priority", ""); - switch(priority) { - case "min": - notification.setPriority(NotificationCompat.PRIORITY_MIN); - break; - case "high": - notification.setPriority(NotificationCompat.PRIORITY_HIGH); - break; - case "max": - notification.setPriority(NotificationCompat.PRIORITY_MAX); - break; - default: - notification.setPriority(NotificationCompat.PRIORITY_DEFAULT); - } - - //icon - String smallIcon = bundle.getString("icon", "ic_launcher"); - int smallIconResId = res.getIdentifier(smallIcon, "mipmap", packageName); - notification.setSmallIcon(smallIconResId); - - //large icon - String largeIcon = bundle.getString("large_icon"); - if(largeIcon != null && android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){ - if (largeIcon.startsWith("http://") || largeIcon.startsWith("https://")) { - Bitmap bitmap = getBitmapFromURL(largeIcon); - notification.setLargeIcon(bitmap); - } else { - int largeIconResId = res.getIdentifier(largeIcon, "mipmap", packageName); - Bitmap largeIconBitmap = BitmapFactory.decodeResource(res, largeIconResId); - - if (largeIconResId != 0) { - notification.setLargeIcon(largeIconBitmap); - } - } - } - - //big text - String bigText = bundle.getString("big_text"); - if(bigText != null){ - notification.setStyle(new NotificationCompat.BigTextStyle().bigText(bigText)); - } - - //picture - String picture = bundle.getString("picture"); - if(picture!=null){ - NotificationCompat.BigPictureStyle bigPicture = new NotificationCompat.BigPictureStyle(); - - if (picture.startsWith("http://") || picture.startsWith("https://")) { - Bitmap bitmap = getBitmapFromURL(picture); - bigPicture.bigPicture(bitmap); - } else { - int pictureResId = res.getIdentifier(picture, "mipmap", packageName); - Bitmap pictureResIdBitmap = BitmapFactory.decodeResource(res, pictureResId); - - if (pictureResId != 0) { - bigPicture.bigPicture(pictureResIdBitmap); - } - } - bigPicture.setBigContentTitle(title); - bigPicture.setSummaryText(bundle.getString("body")); - - notification.setStyle(bigPicture); - } - - //sound - String soundName = bundle.getString("sound"); - if (soundName != null) { - if (soundName.equalsIgnoreCase("default")) { - notification.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); - } else { - int soundResourceId = res.getIdentifier(soundName, "raw", packageName); - if (soundResourceId == 0) { - soundName = soundName.substring(0, soundName.lastIndexOf('.')); - soundResourceId = res.getIdentifier(soundName, "raw", packageName); - } - notification.setSound(Uri.parse("android.resource://" + packageName + "/" + soundResourceId)); - } - } - - //color - if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - notification.setCategory(NotificationCompat.CATEGORY_CALL); - - String color = bundle.getString("color"); - if (color != null) { - notification.setColor(Color.parseColor(color)); - } - } - - //vibrate - if(bundle.containsKey("vibrate")){ - long vibrate = Math.round(bundle.getDouble("vibrate", DEFAULT_VIBRATION)); - if(vibrate > 0){ - notification.setVibrate(new long[]{0, vibrate}); - }else{ - notification.setVibrate(null); - } - } - - //lights - if (bundle.getBoolean("lights")) { - notification.setDefaults(NotificationCompat.DEFAULT_LIGHTS); - } - - if(bundle.containsKey("fire_date")) { - Log.d(TAG, "broadcast intent if it is a scheduled notification"); - Intent i = new Intent("com.evollu.react.fcm.ReceiveLocalNotification"); - i.putExtras(bundle); - mContext.sendOrderedBroadcast(i, null); - } - - if(!mIsForeground || bundle.getBoolean("show_in_foreground")){ - Intent intent = new Intent(); - intent.setClassName(mContext, intentClassName); - intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); - intent.putExtras(bundle); - intent.setAction(bundle.getString("click_action")); - - int notificationID = bundle.containsKey("id") ? bundle.getString("id", "").hashCode() : (int) System.currentTimeMillis(); - PendingIntent pendingIntent = PendingIntent.getActivity(mContext, notificationID, intent, - PendingIntent.FLAG_UPDATE_CURRENT); - - NotificationManager notificationManager = - (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); - - notification.setContentIntent(pendingIntent); - - Notification info = notification.build(); - - if (bundle.containsKey("tag")) { - String tag = bundle.getString("tag"); - notificationManager.notify(tag, notificationID, info); - } else { - notificationManager.notify(notificationID, info); - } - } - //clear out one time scheduled notification once fired - if(!bundle.containsKey("repeat_interval") && bundle.containsKey("fire_date")) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.remove(bundle.getString("id")); - editor.apply(); - } - } catch (Exception e) { - Log.e(TAG, "failed to send local notification", e); - } + new SendNotificationTask(mContext, sharedPreferences, mIsForeground, bundle).execute(); } public void sendNotificationScheduled(Bundle bundle) { @@ -344,18 +154,4 @@ public class FIRLocalMessagingHelper { public void setApplicationForeground(boolean foreground){ mIsForeground = foreground; } - - public Bitmap getBitmapFromURL(String strURL) { - try { - URL url = new URL(strURL); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setDoInput(true); - connection.connect(); - InputStream input = connection.getInputStream(); - return BitmapFactory.decodeStream(input); - } catch (IOException e) { - e.printStackTrace(); - return null; - } - } } diff --git a/android/src/main/java/com/evollu/react/fcm/SendNotificationTask.java b/android/src/main/java/com/evollu/react/fcm/SendNotificationTask.java new file mode 100644 index 0000000..2c24bab --- /dev/null +++ b/android/src/main/java/com/evollu/react/fcm/SendNotificationTask.java @@ -0,0 +1,249 @@ +package com.evollu.react.fcm; + +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Bundle; +import android.support.v4.app.NotificationCompat; +import android.util.Log; + +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; + +import static com.facebook.react.common.ReactConstants.TAG; + +public class SendNotificationTask extends AsyncTask { + private static final long DEFAULT_VIBRATION = 300L; + + private Context mContext; + private Bundle bundle; + private SharedPreferences sharedPreferences; + private Boolean mIsForeground; + + public SendNotificationTask(Context context, SharedPreferences sharedPreferences, Boolean mIsForeground, Bundle bundle){ + this.mContext = context; + this.bundle = bundle; + this.sharedPreferences = sharedPreferences; + this.mIsForeground = mIsForeground; + } + + protected Void doInBackground(Void... params) { + try { + String intentClassName = getMainActivityClassName(); + if (intentClassName == null) { + return null; + } + + if (bundle.getString("body") == null) { + return null; + } + + Resources res = mContext.getResources(); + String packageName = mContext.getPackageName(); + + String title = bundle.getString("title"); + if (title == null) { + ApplicationInfo appInfo = mContext.getApplicationInfo(); + title = mContext.getPackageManager().getApplicationLabel(appInfo).toString(); + } + + NotificationCompat.Builder notification = new NotificationCompat.Builder(mContext) + .setContentTitle(title) + .setContentText(bundle.getString("body")) + .setTicker(bundle.getString("ticker")) + .setVisibility(NotificationCompat.VISIBILITY_PRIVATE) + .setAutoCancel(bundle.getBoolean("auto_cancel", true)) + .setNumber(bundle.getInt("number")) + .setSubText(bundle.getString("sub_text")) + .setGroup(bundle.getString("group")) + .setVibrate(new long[]{0, DEFAULT_VIBRATION}) + .setExtras(bundle.getBundle("data")); + + if (bundle.containsKey("ongoing") && bundle.getBoolean("ongoing")) { + notification.setOngoing(bundle.getBoolean("ongoing")); + } + + //priority + String priority = bundle.getString("priority", ""); + switch(priority) { + case "min": + notification.setPriority(NotificationCompat.PRIORITY_MIN); + break; + case "high": + notification.setPriority(NotificationCompat.PRIORITY_HIGH); + break; + case "max": + notification.setPriority(NotificationCompat.PRIORITY_MAX); + break; + default: + notification.setPriority(NotificationCompat.PRIORITY_DEFAULT); + } + + //icon + String smallIcon = bundle.getString("icon", "ic_launcher"); + int smallIconResId = res.getIdentifier(smallIcon, "mipmap", packageName); + notification.setSmallIcon(smallIconResId); + + //large icon + String largeIcon = bundle.getString("large_icon"); + if(largeIcon != null && android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){ + if (largeIcon.startsWith("http://") || largeIcon.startsWith("https://")) { + Bitmap bitmap = getBitmapFromURL(largeIcon); + notification.setLargeIcon(bitmap); + } else { + int largeIconResId = res.getIdentifier(largeIcon, "mipmap", packageName); + Bitmap largeIconBitmap = BitmapFactory.decodeResource(res, largeIconResId); + + if (largeIconResId != 0) { + notification.setLargeIcon(largeIconBitmap); + } + } + } + + //big text + String bigText = bundle.getString("big_text"); + if(bigText != null){ + notification.setStyle(new NotificationCompat.BigTextStyle().bigText(bigText)); + } + + //picture + String picture = bundle.getString("picture"); + if(picture!=null){ + NotificationCompat.BigPictureStyle bigPicture = new NotificationCompat.BigPictureStyle(); + + if (picture.startsWith("http://") || picture.startsWith("https://")) { + Bitmap bitmap = getBitmapFromURL(picture); + bigPicture.bigPicture(bitmap); + } else { + int pictureResId = res.getIdentifier(picture, "mipmap", packageName); + Bitmap pictureResIdBitmap = BitmapFactory.decodeResource(res, pictureResId); + + if (pictureResId != 0) { + bigPicture.bigPicture(pictureResIdBitmap); + } + } + bigPicture.setBigContentTitle(title); + bigPicture.setSummaryText(bundle.getString("body")); + + notification.setStyle(bigPicture); + } + + //sound + String soundName = bundle.getString("sound"); + if (soundName != null) { + if (soundName.equalsIgnoreCase("default")) { + notification.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); + } else { + int soundResourceId = res.getIdentifier(soundName, "raw", packageName); + if (soundResourceId == 0) { + soundName = soundName.substring(0, soundName.lastIndexOf('.')); + soundResourceId = res.getIdentifier(soundName, "raw", packageName); + } + notification.setSound(Uri.parse("android.resource://" + packageName + "/" + soundResourceId)); + } + } + + //color + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + notification.setCategory(NotificationCompat.CATEGORY_CALL); + + String color = bundle.getString("color"); + if (color != null) { + notification.setColor(Color.parseColor(color)); + } + } + + //vibrate + if(bundle.containsKey("vibrate")){ + long vibrate = Math.round(bundle.getDouble("vibrate", DEFAULT_VIBRATION)); + if(vibrate > 0){ + notification.setVibrate(new long[]{0, vibrate}); + }else{ + notification.setVibrate(null); + } + } + + //lights + if (bundle.getBoolean("lights")) { + notification.setDefaults(NotificationCompat.DEFAULT_LIGHTS); + } + + if(bundle.containsKey("fire_date")) { + Log.d(TAG, "broadcast intent if it is a scheduled notification"); + Intent i = new Intent("com.evollu.react.fcm.ReceiveLocalNotification"); + i.putExtras(bundle); + mContext.sendOrderedBroadcast(i, null); + } + + if(!mIsForeground || bundle.getBoolean("show_in_foreground")){ + Intent intent = new Intent(); + intent.setClassName(mContext, intentClassName); + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + intent.putExtras(bundle); + intent.setAction(bundle.getString("click_action")); + + int notificationID = bundle.containsKey("id") ? bundle.getString("id", "").hashCode() : (int) System.currentTimeMillis(); + PendingIntent pendingIntent = PendingIntent.getActivity(mContext, notificationID, intent, + PendingIntent.FLAG_UPDATE_CURRENT); + + NotificationManager notificationManager = + (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); + + notification.setContentIntent(pendingIntent); + + Notification info = notification.build(); + + if (bundle.containsKey("tag")) { + String tag = bundle.getString("tag"); + notificationManager.notify(tag, notificationID, info); + } else { + notificationManager.notify(notificationID, info); + } + } + //clear out one time scheduled notification once fired + if(!bundle.containsKey("repeat_interval") && bundle.containsKey("fire_date")) { + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.remove(bundle.getString("id")); + editor.apply(); + } + } catch (Exception e) { + Log.e(TAG, "failed to send local notification", e); + } + return null; + } + + public Bitmap getBitmapFromURL(String strURL) { + try { + URL url = new URL(strURL); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setDoInput(true); + connection.connect(); + InputStream input = connection.getInputStream(); + return BitmapFactory.decodeStream(input); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public String getMainActivityClassName() { + String packageName = mContext.getPackageName(); + Intent launchIntent = mContext.getPackageManager().getLaunchIntentForPackage(packageName); + String className = launchIntent.getComponent().getClassName(); + return className; + } +} -- 2.26.2