- Create a new Android Studio Project with an empty Activity
- Once your project is loaded click on firebase from toolsmenu
- After clicking on Firebase an assistant will open showing all the available firebase features.
- Click on Cloud Messaging
- You will see a link “Set Up Firebase Cloud Messaging”
- Now you will see all option required “Set up Firebase Cloud Messaging”
- Click on “Connect to Firebase” button. It will start a dialog. Insert project name and country select.
- Now click on Connect to Firebase. And wait for a few seconds.
- Again click on the button Add FCM to your app and you will see a dialog
- Click on Accept Changes. And firebase is setup in your project now.
Generating Device Token
MyFirebaseInstanceIDService.java
package com.pushnotification;
/**
* Created by JAINISH on 2/12/2017.
*/
import android.util.Log;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;
//Class extending FirebaseInstanceIdService
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
@Override
public void onTokenRefresh() {
//Getting registration token
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
//Displaying token on logcat
Log.d(TAG, "Refreshed token: " + refreshedToken);
//calling the method store token and passing token
storeToken(refreshedToken);
}
private void storeToken(String token) {
//we will save the token in sharedpreferences later
SharedPrefManager.getInstance(getApplicationContext()).saveDeviceToken(token);
}
}
/**
* Created by JAINISH on 2/12/2017.
*/
import android.util.Log;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;
//Class extending FirebaseInstanceIdService
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
@Override
public void onTokenRefresh() {
//Getting registration token
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
//Displaying token on logcat
Log.d(TAG, "Refreshed token: " + refreshedToken);
//calling the method store token and passing token
storeToken(refreshedToken);
}
private void storeToken(String token) {
//we will save the token in sharedpreferences later
SharedPrefManager.getInstance(getApplicationContext()).saveDeviceToken(token);
}
}
AndroidManifest.xml
Service we need to define this class in side
AndroidManifest.xml. inside AndroidManifest.xml and write code inside
application tag.
<service
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
SharedPrefManager.java
package com.pushnotification; /** * Created by JAINISH on 2/12/2017. */ import android.content.Context; import android.content.SharedPreferences; public class SharedPrefManager { private static final String SHARED_PREF_NAME = "FCMSharedPref"; private static final String TAG_TOKEN = "tagtoken"; private static SharedPrefManager mInstance; private static Context mCtx; private SharedPrefManager(Context context) { mCtx = context; } public static synchronized SharedPrefManager getInstance(Context context) { if (mInstance == null) { mInstance = new SharedPrefManager(context); } return mInstance; } //this method will save the device token to shared preferences public boolean saveDeviceToken(String token){ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(TAG_TOKEN, token); editor.apply(); return true; } //this method will fetch the device token from shared preferences public String getDeviceToken(){ SharedPreferences sharedPreferences = mCtx.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE); return sharedPreferences.getString(TAG_TOKEN, null); } }
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Button android:layout_centerVertical="true" android:text="Display Token" android:id="@+id/buttonDisplayToken" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/textViewToken" android:layout_alignParentBottom="true" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>
·
MainActivity.java
package com.pushnotification; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements View.OnClickListener { //defining views private Button buttonDisplayToken; private TextView textViewToken; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //getting views from xml textViewToken = (TextView) findViewById(R.id.textViewToken); buttonDisplayToken = (Button) findViewById(R.id.buttonDisplayToken); //adding listener to view buttonDisplayToken.setOnClickListener(this); } @Override public void onClick(View view) { if (view == buttonDisplayToken) { //getting token from shared preferences String token = SharedPrefManager.getInstance(this).getDeviceToken(); //if token is not null if (token != null) { //displaying the token textViewToken.setText(token); } else { //if token is null that means something wrong textViewToken.setText("Token not generated"); } } } }
Creating Push Notification
· MyFirebaseMessagingService.java
package com.pushnotification;
/**
* Created by JAINISH on 2/12/2017.
*/
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
}
}
/**
* Created by JAINISH on 2/12/2017.
*/
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
}
}
·
AndroidManifest.xml
Service we need to define this class
in side AndroidManifest.xml. inside AndroidManifest.xml and write code inside
application tag.
<service android:name=".MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service>
·
MyNotificationManager.java
package com.pushnotification; /** * Created by JAINISH on 2/12/2017. */ import android.content.Intent; import android.util.Log; import com.google.firebase.messaging.FirebaseMessagingService; import com.google.firebase.messaging.RemoteMessage; import org.json.JSONException; import org.json.JSONObject; public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final String TAG = "MyFirebaseMsgService"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { if (remoteMessage.getData().size() > 0) { Log.e(TAG, "Data Payload: " + remoteMessage.getData().toString()); try { JSONObject json = new JSONObject(remoteMessage.getData().toString()); sendPushNotification(json); } catch (Exception e) { Log.e(TAG, "Exception: " + e.getMessage()); } } } //this method will display the notification //We are passing the JSONObject that is received from //firebase cloud messaging private void sendPushNotification(JSONObject json) { //optionally we can display the json into log Log.e(TAG, "Notification JSON " + json.toString()); try { //getting the json data JSONObject data = json.getJSONObject("data"); //parsing json data String title = data.getString("title"); String message = data.getString("message"); String imageUrl = data.getString("image"); //creating MyNotificationManager object MyNotificationManager mNotificationManager = new MyNotificationManager(getApplicationContext()); //creating an intent for the notification Intent intent = new Intent(getApplicationContext(), MainActivity.class); //if there is no image if(imageUrl.equals("null")){ //displaying small notification mNotificationManager.showSmallNotification(title, message, intent); }else{ //if there is an image //displaying a big notification mNotificationManager.showBigNotification(title, message, imageUrl, intent); } } catch (JSONException e) { Log.e(TAG, "Json Exception: " + e.getMessage()); } catch (Exception e) { Log.e(TAG, "Exception: " + e.getMessage()); } } }
·
add library build.gradle
compile 'com.android.volley:volley:1.0.0'
·
activity_main.xml
we will modify the activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <EditText android:layout_above="@+id/buttonRegister" android:hint="Enter email" android:id="@+id/editTextEmail" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:layout_centerVertical="true" android:text="Register Device" android:id="@+id/buttonRegister" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>
·
MainActivity.java
package com.pushnotification; import android.app.ProgressDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; import java.util.Map; public class MainActivity extends AppCompatActivity implements View.OnClickListener { //defining views private Button buttonRegister; private EditText editTextEmail; private ProgressDialog progressDialog; //URL to RegisterDevice.php private static final String URL_REGISTER_DEVICE = "http://jrinfoway.com/Android_Eaxmple/push_notification/RegisterDevice.php"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //getting views from xml editTextEmail = (EditText) findViewById(R.id.editTextEmail); buttonRegister = (Button) findViewById(R.id.buttonRegister); //adding listener to view buttonRegister.setOnClickListener(this); } //storing token to mysql server private void sendTokenToServer() { progressDialog = new ProgressDialog(this); progressDialog.setMessage("Registering Device..."); progressDialog.show(); final String token = SharedPrefManager.getInstance(this).getDeviceToken(); final String email = editTextEmail.getText().toString(); if (token == null) { progressDialog.dismiss(); Toast.makeText(this, "Token not generated", Toast.LENGTH_LONG).show(); return; } StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_REGISTER_DEVICE, new Response.Listener<String>() { @Override public void onResponse(String response) { progressDialog.dismiss(); try { JSONObject obj = new JSONObject(response); Toast.makeText(MainActivity.this, obj.getString("message"), Toast.LENGTH_LONG).show(); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { progressDialog.dismiss(); Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_LONG).show(); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<>(); params.put("email", email); params.put("token", token); return params; } }; RequestQueue requestQueue = Volley.newRequestQueue(this); requestQueue.add(stringRequest); } @Override public void onClick(View view) { if (view == buttonRegister) { sendTokenToServer(); } } }
·
Getting Firebase Server Key
Find the Cloud Messaging
Server Key here, Copy it.
Now go inside Config.php file and put your Server Key.
·
EndPoints.java
package com.pushnotification;
/**
* Created by JAINISH on 2/14/2017.
*/
public class EndPoints {
public static final String URL_REGISTER_DEVICE = "http://jrinfoway.com/Android_Eaxmple/push_notification/RegisterDevice.php";
public static final String URL_SEND_SINGLE_PUSH = "http://jrinfoway.com/Android_Eaxmple/push_notification/sendSinglePush.php";
public static final String URL_SEND_MULTIPLE_PUSH = "http://jrinfoway.com/Android_Eaxmple/push_notification/sendMultiplePush.php";
public static final String URL_FETCH_DEVICES = "http://jrinfoway.com/Android_Eaxmple/push_notification/GetRegisteredDevices.php";
}
/**
* Created by JAINISH on 2/14/2017.
*/
public class EndPoints {
public static final String URL_REGISTER_DEVICE = "http://jrinfoway.com/Android_Eaxmple/push_notification/RegisterDevice.php";
public static final String URL_SEND_SINGLE_PUSH = "http://jrinfoway.com/Android_Eaxmple/push_notification/sendSinglePush.php";
public static final String URL_SEND_MULTIPLE_PUSH = "http://jrinfoway.com/Android_Eaxmple/push_notification/sendMultiplePush.php";
public static final String URL_FETCH_DEVICES = "http://jrinfoway.com/Android_Eaxmple/push_notification/GetRegisteredDevices.php";
}
·
activity_main.xml
we will modify the activity_main.xml
<?xml version="1.0"
encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<EditText
android:layout_above="@+id/buttonRegister"
android:hint="Enter email"
android:id="@+id/editTextEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:layout_centerVertical="true"
android:text="Register Device"
android:id="@+id/buttonRegister"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<!-- this button is added -->
<Button
android:text="Send Notification"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/buttonRegister"
android:layout_centerHorizontal="true"
android:id="@+id/buttonSendNotification" />
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<EditText
android:layout_above="@+id/buttonRegister"
android:hint="Enter email"
android:id="@+id/editTextEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:layout_centerVertical="true"
android:text="Register Device"
android:id="@+id/buttonRegister"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<!-- this button is added -->
<Button
android:text="Send Notification"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/buttonRegister"
android:layout_centerHorizontal="true"
android:id="@+id/buttonSendNotification" />
</RelativeLayout>
·
MainActivity.java
package com.pushnotification;
import android.app.ProgressDialog;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//defining views
private Button buttonSendPush;
private Button buttonRegister;
private EditText editTextEmail;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//getting views from xml
editTextEmail = (EditText) findViewById(R.id.editTextEmail);
buttonRegister = (Button) findViewById(R.id.buttonRegister);
buttonSendPush = (Button) findViewById(R.id.buttonSendNotification);
//adding listener to view
buttonRegister.setOnClickListener(this);
buttonSendPush.setOnClickListener(this);
}
//storing token to mysql server
private void sendTokenToServer() {
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Registering Device...");
progressDialog.show();
final String token = SharedPrefManager.getInstance(this).getDeviceToken();
final String email = editTextEmail.getText().toString();
if (token == null) {
progressDialog.dismiss();
Toast.makeText(this, "Token not generated", Toast.LENGTH_LONG).show();
return;
}
StringRequest stringRequest = new StringRequest(Request.Method.POST, EndPoints.URL_REGISTER_DEVICE,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
progressDialog.dismiss();
try {
JSONObject obj = new JSONObject(response);
Toast.makeText(MainActivity.this, obj.getString("message"), Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressDialog.dismiss();
Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("email", email);
params.put("token", token);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
@Override
public void onClick(View view) {
if (view == buttonRegister) {
sendTokenToServer();
}
//starting send notification activity
if(view == buttonSendPush){
startActivity(new Intent(this, ActivitySendPushNotification.class));
}
}
}
import android.app.ProgressDialog;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//defining views
private Button buttonSendPush;
private Button buttonRegister;
private EditText editTextEmail;
private ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//getting views from xml
editTextEmail = (EditText) findViewById(R.id.editTextEmail);
buttonRegister = (Button) findViewById(R.id.buttonRegister);
buttonSendPush = (Button) findViewById(R.id.buttonSendNotification);
//adding listener to view
buttonRegister.setOnClickListener(this);
buttonSendPush.setOnClickListener(this);
}
//storing token to mysql server
private void sendTokenToServer() {
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Registering Device...");
progressDialog.show();
final String token = SharedPrefManager.getInstance(this).getDeviceToken();
final String email = editTextEmail.getText().toString();
if (token == null) {
progressDialog.dismiss();
Toast.makeText(this, "Token not generated", Toast.LENGTH_LONG).show();
return;
}
StringRequest stringRequest = new StringRequest(Request.Method.POST, EndPoints.URL_REGISTER_DEVICE,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
progressDialog.dismiss();
try {
JSONObject obj = new JSONObject(response);
Toast.makeText(MainActivity.this, obj.getString("message"), Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressDialog.dismiss();
Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_LONG).show();
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("email", email);
params.put("token", token);
return params;
}
};
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
@Override
public void onClick(View view) {
if (view == buttonRegister) {
sendTokenToServer();
}
//starting send notification activity
if(view == buttonSendPush){
startActivity(new Intent(this, ActivitySendPushNotification.class));
}
}
}
·
activity_send_push_notification.xml
<?xml version="1.0"
encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_send_push_notification"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ActivitySendPushNotification">
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/radioButtonSendAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send to All" />
<RadioButton
android:id="@+id/radioButtonSendOne"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send to One" />
</RadioGroup>
<Spinner
android:id="@+id/spinnerDevices"
android:layout_width="match_parent"
android:layout_height="wrap_content"></Spinner>
<EditText
android:id="@+id/editTextTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter Message Title" />
<EditText
android:id="@+id/editTextMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter Message" />
<EditText
android:id="@+id/editTextImageUrl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter Image URL (Optional) " />
<Button
android:id="@+id/buttonSendPush"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Push" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_send_push_notification"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".ActivitySendPushNotification">
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/radioButtonSendAll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send to All" />
<RadioButton
android:id="@+id/radioButtonSendOne"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send to One" />
</RadioGroup>
<Spinner
android:id="@+id/spinnerDevices"
android:layout_width="match_parent"
android:layout_height="wrap_content"></Spinner>
<EditText
android:id="@+id/editTextTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter Message Title" />
<EditText
android:id="@+id/editTextMessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter Message" />
<EditText
android:id="@+id/editTextImageUrl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Enter Image URL (Optional) " />
<Button
android:id="@+id/buttonSendPush"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Push" />
</LinearLayout>
·
MyVolley.java
package com.pushnotification;
/**
* Created by JAINISH on 2/15/2017.
*/
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
public class MyVolley {
private static MyVolley mInstance;
private RequestQueue mRequestQueue;
private static Context mCtx;
private MyVolley(Context context) {
mCtx = context;
mRequestQueue = getRequestQueue();
}
public static synchronized MyVolley getInstance(Context context) {
if (mInstance == null) {
mInstance = new MyVolley(context);
}
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
// getApplicationContext() is key, it keeps you from leaking the
// Activity or BroadcastReceiver if someone passes one in.
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
}
/**
* Created by JAINISH on 2/15/2017.
*/
import android.content.Context;
import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.Volley;
public class MyVolley {
private static MyVolley mInstance;
private RequestQueue mRequestQueue;
private static Context mCtx;
private MyVolley(Context context) {
mCtx = context;
mRequestQueue = getRequestQueue();
}
public static synchronized MyVolley getInstance(Context context) {
if (mInstance == null) {
mInstance = new MyVolley(context);
}
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
// getApplicationContext() is key, it keeps you from leaking the
// Activity or BroadcastReceiver if someone passes one in.
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
}
return mRequestQueue;
}
public <T> void addToRequestQueue(Request<T> req) {
getRequestQueue().add(req);
}
}
·
ActivitySendPushNotification.java
package com.pushnotification; import android.app.ProgressDialog; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.RadioGroup; import android.widget.Spinner; import android.widget.Toast; import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ActivitySendPushNotification extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener, View.OnClickListener { private Button buttonSendPush; private RadioGroup radioGroup; private Spinner spinner; private ProgressDialog progressDialog; private EditText editTextTitle, editTextMessage, editTextImage; private boolean isSendAllChecked; private List<String> devices; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_send_push_notification); radioGroup = (RadioGroup) findViewById(R.id.radioGroup); spinner = (Spinner) findViewById(R.id.spinnerDevices); buttonSendPush = (Button) findViewById(R.id.buttonSendPush); editTextTitle = (EditText) findViewById(R.id.editTextTitle); editTextMessage = (EditText) findViewById(R.id.editTextMessage); editTextImage = (EditText) findViewById(R.id.editTextImageUrl); devices = new ArrayList<>(); radioGroup.setOnCheckedChangeListener(this); buttonSendPush.setOnClickListener(this); loadRegisteredDevices(); } //method to load all the devices from database private void loadRegisteredDevices() { progressDialog = new ProgressDialog(this); progressDialog.setMessage("Fetching Devices..."); progressDialog.show(); StringRequest stringRequest = new StringRequest(Request.Method.GET, EndPoints.URL_FETCH_DEVICES, new Response.Listener<String>() { @Override public void onResponse(String response) { progressDialog.dismiss(); JSONObject obj = null; try { obj = new JSONObject(response); if (!obj.getBoolean("error")) { JSONArray jsonDevices = obj.getJSONArray("devices"); for (int i = 0; i < jsonDevices.length(); i++) { JSONObject d = jsonDevices.getJSONObject(i); devices.add(d.getString("email")); } ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>( ActivitySendPushNotification.this, android.R.layout.simple_spinner_dropdown_item, devices); spinner.setAdapter(arrayAdapter); } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }) { }; MyVolley.getInstance(this).addToRequestQueue(stringRequest); } //this method will send the push //from here we will call sendMultiple() or sendSingle() push method //depending on the selection private void sendPush() { if(isSendAllChecked){ sendMultiplePush(); }else{ sendSinglePush(); } } private void sendMultiplePush(){ final String title = editTextTitle.getText().toString(); final String message = editTextMessage.getText().toString(); final String image = editTextImage.getText().toString(); final String email = spinner.getSelectedItem().toString(); progressDialog.setMessage("Sending Push"); progressDialog.show(); StringRequest stringRequest = new StringRequest(Request.Method.POST, EndPoints.URL_SEND_SINGLE_PUSH, new Response.Listener<String>() { @Override public void onResponse(String response) { progressDialog.dismiss(); Toast.makeText(ActivitySendPushNotification.this, response, Toast.LENGTH_LONG).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<>(); params.put("title", title); params.put("message", message); if (!TextUtils.isEmpty(image)) params.put("image", image); params.put("email", email); return params; } }; MyVolley.getInstance(this).addToRequestQueue(stringRequest); } private void sendSinglePush(){ final String title = editTextTitle.getText().toString(); final String message = editTextMessage.getText().toString(); final String image = editTextImage.getText().toString(); progressDialog.setMessage("Sending Push"); progressDialog.show(); StringRequest stringRequest = new StringRequest(Request.Method.POST, EndPoints.URL_SEND_MULTIPLE_PUSH, new Response.Listener<String>() { @Override public void onResponse(String response) { progressDialog.dismiss(); Toast.makeText(ActivitySendPushNotification.this, response, Toast.LENGTH_LONG).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<>(); params.put("title", title); params.put("message", message); if (!TextUtils.isEmpty(image)) params.put("image", image); return params; } }; MyVolley.getInstance(this).addToRequestQueue(stringRequest); } @Override public void onCheckedChanged(RadioGroup radioGroup, int i) { switch (radioGroup.getCheckedRadioButtonId()) { case R.id.radioButtonSendAll: isSendAllChecked = true; spinner.setEnabled(false); break; case R.id.radioButtonSendOne: isSendAllChecked = false; spinner.setEnabled(true); break; } } @Override public void onClick(View view) { //calling the method send push on button click sendPush(); } }
PHP Files
·
Config.php
<?php
define('DB_USERNAME','your user name');
define('DB_PASSWORD','your password');
define('DB_NAME','your database name');
define('DB_HOST','localhost');
//defined a new constant for firebase api key
define('FIREBASE_API_KEY', ‘YOUR_SERVER_KEY');
·
DbConnect.php
<?php
//Class DbConnect
class DbConnect
{
//Variable to store
database link
private $con;
//Class constructor
function
__construct()
{
}
//This method will
connect to the database
function connect()
{
//Including the
config.php file to get the database constants
include_once
dirname(__FILE__) . '/Config.php';
//connecting to
mysql database
$this->con =
new mysqli(DB_HOST, DB_USERNAME, DB_PASSWORD, DB_NAME);
//Checking if
any error occured while connecting
if (mysqli_connect_errno())
{
echo
"Failed to connect to MySQL: " . mysqli_connect_error();
}
//finally
returning the connection link
return
$this->con;
}
}
·
DbOperation.php
<?php
class
DbOperation
{
//Database connection link
private $con;
//Class constructor
function __construct()
{
//Getting the DbConnect.php file
require_once dirname(__FILE__) .
'/DbConnect.php';
//Creating a DbConnect object to
connect to the database
$db = new DbConnect();
//Initializing our connection link of
this class
//by calling the method connect of
DbConnect class
$this->con = $db->connect();
}
//storing token in database
public function
registerDevice($email,$token){
if(!$this->isEmailExist($email)){
$stmt =
$this->con->prepare("INSERT INTO devices (email, token) VALUES (?,?)
");
$stmt->bind_param("ss",$email,$token);
if($stmt->execute())
return 0; //return 0 means success
return 1; //return 1 means failure
}else{
return 2; //returning 2 means email
already exist
}
}
//the method will check if email already
exist
private function isEmailexist($email){
$stmt =
$this->con->prepare("SELECT id FROM devices WHERE email = ?");
$stmt->bind_param("s",$email);
$stmt->execute();
$stmt->store_result();
$num_rows = $stmt->num_rows;
$stmt->close();
return $num_rows > 0;
}
//getting all tokens to send push to all
devices
public function getAllTokens(){
$stmt =
$this->con->prepare("SELECT token FROM devices");
$stmt->execute();
$result = $stmt->get_result();
$tokens = array();
while($token =
$result->fetch_assoc()){
array_push($tokens,
$token['token']);
}
return $tokens;
}
//getting a specified token to send push to
selected device
public function getTokenByEmail($email){
$stmt =
$this->con->prepare("SELECT token FROM devices WHERE email =
?");
$stmt->bind_param("s",$email);
$stmt->execute();
$result =
$stmt->get_result()->fetch_assoc();
return array($result['token']);
}
//getting all the registered devices from
database
public function getAllDevices(){
$stmt =
$this->con->prepare("SELECT * FROM devices");
$stmt->execute();
$result = $stmt->get_result();
return $result;
}
}
?>
·
Firebase.php
<?php
class
Firebase {
public function send($registration_ids,
$message) {
$fields = array(
'registration_ids' =>
$registration_ids,
'data' => $message,
);
return
$this->sendPushNotification($fields);
}
/*
* This function will make the actuall curl
request to firebase server
* and then the message is sent
*/
private function sendPushNotification($fields)
{
//importing the constant files
require_once 'Config.php';
//firebase server url to send the curl
request
$url = 'https://fcm.googleapis.com/fcm/send';
//building headers for the request
$headers = array(
'Authorization: key=' .
FIREBASE_API_KEY,
'Content-Type: application/json'
);
//Initializing curl to open a
connection
$ch = curl_init();
//Setting the curl url
curl_setopt($ch, CURLOPT_URL, $url);
//setting the method as post
curl_setopt($ch, CURLOPT_POST, true);
//adding headers
curl_setopt($ch, CURLOPT_HTTPHEADER,
$headers);
curl_setopt($ch,
CURLOPT_RETURNTRANSFER, true);
//disabling ssl support
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,
false);
//adding the fields in json format
curl_setopt($ch, CURLOPT_POSTFIELDS,
json_encode($fields));
//finally executing the curl request
$result = curl_exec($ch);
if ($result === FALSE) {
die('Curl failed: ' .
curl_error($ch));
}
//Now close the connection
curl_close($ch);
//and return the result
return $result;
}
}
?>
·
GetRegisteredDevices.php
<?php
require_once 'DbOperation.php';
$db = new DbOperation();
$devices = $db->getAllDevices();
$response = array();
$response['error'] = false;
$response['devices'] = array();
while($device = $devices->fetch_assoc()){
$temp = array();
$temp['id']=$device['id'];
$temp['email']=$device['email'];
$temp['token']=$device['token'];
array_push($response['devices'],$temp);
}
echo json_encode($response);
?>
·
Push.php
<?php
class Push {
//notification title
private $title;
//notification message
private $message;
//notification image url
private $image;
//initializing values in this constructor
function __construct($title, $message,
$image) {
$this->title = $title;
$this->message = $message;
$this->image = $image;
}
//getting the push notification
public function getPush() {
$res = array();
$res['data']['title'] =
$this->title;
$res['data']['message'] = $this->message;
$res['data']['image'] =
$this->image;
return $res;
}
}
?>
·
RegisterDevice.php
<?php
require_once 'DbOperation.php';
$response = array();
if($_SERVER['REQUEST_METHOD']=='POST'){
$token = $_POST['token'];
$email = $_POST['email'];
$db = new DbOperation();
$result = $db->registerDevice($email,$token);
if($result == 0){
$response['error'] = false;
$response['message'] = 'Device registered
successfully';
}elseif($result == 2){
$response['error'] = true;
$response['message'] = 'Device already
registered';
}else{
$response['error'] = true;
$response['message']='Device not registered';
}
}else{
$response['error']=true;
$response['message']='Invalid Request...';
}
echo json_encode($response);
?>
·
SendMultiplePush.php
<?php
//importing
required files
require_once
'DbOperation.php';
require_once
'Firebase.php';
require_once
'Push.php';
$db = new
DbOperation();
$response =
array();
if($_SERVER['REQUEST_METHOD']=='POST'){
//hecking the required params
if(isset($_POST['title']) and
isset($_POST['message'])) {
//creating a new push
$push = null;
//first check if the
push has an image with it
if(isset($_POST['image'])){
$push = new
Push(
$_POST['title'],
$_POST['message'],
$_POST['image']
);
}else{
//if the
push don't have an image give null in place of image
$push = new
Push(
$_POST['title'],
$_POST['message'],
null
);
}
//getting the push from
push object
$mPushNotification =
$push->getPush();
//getting the token from
database object
$devicetoken =
$db->getAllTokens();
//creating firebase
class object
$firebase = new
Firebase();
//sending push
notification and displaying result
echo $firebase->send($devicetoken,
$mPushNotification);
}else{
$response['error']=true;
$response['message']='Parameters
missing';
}
}else{
$response['error']=true;
$response['message']='Invalid
request';
}
echo
json_encode($response);
·
SendSinglePush.php
<?php
//importing
required files
require_once
'DbOperation.php';
require_once
'Firebase.php';
require_once
'Push.php';
$db = new
DbOperation();
$response =
array();
if($_SERVER['REQUEST_METHOD']=='POST'){
//hecking the required params
if(isset($_POST['title']) and
isset($_POST['message']) and isset($_POST['email'])){
//creating a new push
$push = null;
//first check if the push has an image with it
if(isset($_POST['image'])){
$push = new Push(
$_POST['title'],
$_POST['message'],
$_POST['image']
);
}else{
//if the push don't have an image give null in
place of image
$push = new Push(
$_POST['title'],
$_POST['message'],
null
);
}
//getting the push from push object
$mPushNotification = $push->getPush();
//getting the token from database object
$devicetoken =
$db->getTokenByEmail($_POST['email']);
//creating firebase class object
$firebase = new Firebase();
//sending push notification and displaying
result
echo $firebase->send($devicetoken,
$mPushNotification);
}else{
$response['error']=true;
$response['message']='Parameters missing';
}
}else{
$response['error']=true;
$response['message']='Invalid request';
}
echo
json_encode($response);