no.ntnu.wifimanager.GCMIntentService.java Source code

Java tutorial

Introduction

Here is the source code for no.ntnu.wifimanager.GCMIntentService.java

Source

/*
 * Copyright 2012 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package no.ntnu.wifimanager;

import static no.ntnu.wifimanager.CommonUtilities.LOG_TAG;
import static no.ntnu.wifimanager.CommonUtilities.SENDER_ID;
import static no.ntnu.wifimanager.CommonUtilities.displayMessage;
import no.ntnu.wifimanager.activity.ClientListActivity;
import no.ntnu.wifimanager.activity.NewClientActivity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.TaskStackBuilder;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import com.google.android.gcm.GCMBaseIntentService;
import com.google.android.gcm.GCMRegistrar;

/**
 * IntentService responsible for handling GCM messages.
 */
public class GCMIntentService extends GCMBaseIntentService {

    public static final String EXTRA_CLIENT_NAME = "no.ntnu.wifimanager.CLIENT_NAME";
    public static final String EXTRA_CLIENT_MAC = "no.ntnu.wifimanager.CLIENT_MAC";

    private static final String TAG = "GCMIntentService";

    public GCMIntentService() {
        super(SENDER_ID);
    }

    @Override
    protected void onRegistered(Context context, String registrationId) {
        Log.i(TAG, "Device registered: regId = " + registrationId);
        displayMessage(context, getString(R.string.gcm_registered));
        ServerUtilities.register(context, registrationId);
    }

    @Override
    protected void onUnregistered(Context context, String registrationId) {
        Log.i(TAG, "Device unregistered");
        displayMessage(context, getString(R.string.gcm_unregistered));
        if (GCMRegistrar.isRegisteredOnServer(context)) {
            ServerUtilities.unregister(context, registrationId);
        } else {
            // This callback results from the call to unregister made on
            // ServerUtilities when the registration to the server failed.
            Log.i(TAG, "Ignoring unregister callback");
        }
    }

    @Override
    protected void onMessage(Context context, Intent intent) {
        Log.i(TAG, "Received message");

        // notifies user
        String client_name = intent.getStringExtra("client_name");
        String client_mac = intent.getStringExtra("client_mac");
        String message = client_name + " " + getString(R.string.dialog_client_wants_access);

        Log.i(LOG_TAG, "Push notification recieved, mac and name: " + client_mac + client_name);
        generateAccessRequestNotification(context, message, client_name, client_mac);
    }

    @Override
    protected void onDeletedMessages(Context context, int total) {
        Log.i(TAG, "Received deleted messages notification");
        String message = getString(R.string.gcm_deleted, total);
        displayMessage(context, message);
        // notifies user
        generateNotification(context, message);
    }

    @Override
    public void onError(Context context, String errorId) {
        Log.i(TAG, "Received error: " + errorId);
        displayMessage(context, getString(R.string.gcm_error, errorId));
    }

    @Override
    protected boolean onRecoverableError(Context context, String errorId) {
        // log message
        Log.i(TAG, "Received recoverable error: " + errorId);
        displayMessage(context, getString(R.string.gcm_recoverable_error, errorId));
        return super.onRecoverableError(context, errorId);
    }

    /**
     * Issues a notification to inform the user that server has sent a message.
     */
    private static void generateNotification(Context context, String message) {
        int icon = R.drawable.ic_stat_gcm;
        long when = System.currentTimeMillis();
        NotificationManager notificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = new Notification(icon, message, when);
        String title = context.getString(R.string.app_name);
        Intent notificationIntent = new Intent(context, ClientListActivity.class);
        // set intent so it does not start a new activity
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
        notification.setLatestEventInfo(context, title, message, intent);
        notification.flags |= Notification.FLAG_AUTO_CANCEL;
        notificationManager.notify(0, notification);
    }

    private static void generateAccessRequestNotification(Context context, String message, String client_name,
            String client_mac) {

        //      int notifyID = 1;
        //      String title = context.getString(R.string.dialog_access_request);
        //      String content = client_name +" "+ context.getString(R.string.dialog_requests_access);
        //      
        //      NotificationManager mNotificationManager = (NotificationManager)
        //            context.getSystemService(Context.NOTIFICATION_SERVICE);
        //      
        //      NotificationCompat.Builder mBuilder =
        //              new NotificationCompat.Builder(context)
        //              .setSmallIcon(R.drawable.ic_stat_gcm)
        //              .setContentTitle(title)
        //              .setContentText(content);
        //      mBuilder.setAutoCancel(true);
        //      // Creates an explicit intent for an Activity in your app
        //      Intent resultIntent = new Intent(context, ClientListActivity.class);
        //      PendingIntent intent =
        //            PendingIntent.getActivity(context, 0, resultIntent, 0);
        //      //resultIntent.putExtra(EXTRA_CLIENT_NAME, client_name);
        //      //resultIntent.putExtra(EXTRA_CLIENT_MAC, client_mac);
        //      // The stack builder object will contain an artificial back stack for the
        //      // started Activity.
        //      // This ensures that navigating backward from the Activity leads out of
        //      // your application to the Home screen.
        //      TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
        //      // Adds the back stack for the Intent (but not the Intent itself)
        //      stackBuilder.addParentStack(NewClientActivity.class);
        //      // Adds the Intent that starts the Activity to the top of the stack
        //      stackBuilder.addNextIntent(resultIntent);
        //      PendingIntent resultPendingIntent =
        //              stackBuilder.getPendingIntent(
        //                  0,
        //                  PendingIntent.FLAG_UPDATE_CURRENT
        //              );
        //      mBuilder.setContentIntent(resultPendingIntent);
        //      // mId allows you to update the notification later on.
        //      mNotificationManager.notify(notifyID, mBuilder.build());
        //      
    }

}