Android Open Source - dissertation-project Gcm Helper






From Project

Back to project page dissertation-project.

License

The source code is released under:

MIT License

If you think the Android project dissertation-project listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.fyp.widerst.util;
/*  w ww.j  av  a2  s.  c  o  m*/
import static com.fyp.widerst.WiderstObjectifyService.ofy;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.fyp.widerst.Constants;
import com.fyp.widerst.endpoint.DeviceInfoEndpoint;
import com.fyp.widerst.entity.DataPiece;
import com.fyp.widerst.entity.DataWhole;
import com.fyp.widerst.entity.DeviceInfo;
import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.MulticastResult;
import com.google.android.gcm.server.Result;
import com.google.android.gcm.server.Sender;

public final class GcmHelper {

    /* May as well used code already used within the Endpoint */
    private static final DeviceInfoEndpoint deviceEndpoint = new DeviceInfoEndpoint();
    
    private static final Logger logger = Logger.getLogger(GcmHelper.class.getSimpleName());
    
    private static final String WHOLE_COMPLETION_KEY = "whole_completed";
    private static final String PIECE_REQUEST_KEY = "piece_request";
    private static final String WHOLE_REQUEST_KEY = "whole_request";

    /**
     * An entirely "fire and forget" function used to inform clients of a
     * DataWholes completion. It will attempt a retry of 5 times but will not
     * attempt any further validation apart from any Canonical IDs sent back
     * from GCM. These IDs must be updated to reflect GCM's DB.
     * 
     * @param {@link DataWhole} to inform clients about
     * @param {@link List} of {@link DeviceInfo} objects that contain device
     *        registration IDs
     */
    public static void sendWholeCompletionNotification(final DataWhole dataWhole) {

       if (null != dataWhole) {
            
            logger.log(Level.INFO, "Sending GCM completion message for DataWhole " + dataWhole.getKey());
            
            Sender sender = new Sender(Constants.GCM_API_KEY);
            Message message = buildCompletionMessage(dataWhole);

            final Collection<DeviceInfo> devices = ofy().load().keys(dataWhole.getDeviceInfoKeyList()).values();
 
            final List<String> deviceRegistrations = new ArrayList<String>(devices.size());
            for (DeviceInfo device : devices) {
                deviceRegistrations.add(device.toString());
            }

            try {
                MulticastResult multicastResult = sender.send(message, deviceRegistrations, 5);

                /* An error has occurred */
                if (deviceRegistrations.size() != multicastResult.getSuccess()) {

                    Iterator<DeviceInfo> deviceIter = devices.iterator();
                    
                    for (Result result : multicastResult.getResults()) {

                        DeviceInfo deviceInfo = deviceIter.next();
                        
                        if (null != result.getMessageId()) {

                            if (null != result.getCanonicalRegistrationId()) {

                                /*
                                 * Update the DeviceInfo with the new ID and
                                 * post to DB
                                 */
                                deviceInfo.setDeviceRegistrationId(result.getCanonicalRegistrationId());
                                deviceEndpoint.updateDeviceInfo(deviceInfo);
                                logger.log(Level.INFO, "Updated device with new GCM ID: " + deviceInfo);
                            }

                        } else {
                            logger.log(Level.WARNING, "GCM returned result " + result.getErrorCodeName());
                        }
                    }
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void sendPieceRequest(final DataPiece dataPiece, final DataWhole dataWhole) {
        
       if (null != dataPiece && null != dataWhole) {
            
            logger.log(Level.INFO, "Sending GCM completion message for DataWhole " + dataPiece.getKey());
            
            Sender sender = new Sender(Constants.GCM_API_KEY);
            Message message = buildRequestMessage(dataWhole, dataPiece);

            final Collection<DeviceInfo> devices = ofy().load().keys(dataWhole.getDeviceInfoKeyList()).values();
 
            final List<String> deviceRegistrations = new ArrayList<String>(devices.size());
            for (DeviceInfo device : devices) {
                deviceRegistrations.add(device.toString());
                logger.log(Level.INFO, "Sending request to Device " + device.getServerRegistrationId());
            }

            try {
                MulticastResult multicastResult = sender.send(message, deviceRegistrations, 5);

                /* An error has occurred */
                if (deviceRegistrations.size() != multicastResult.getSuccess()) {

                    Iterator<DeviceInfo> deviceIter = devices.iterator();
                    
                    for (Result result : multicastResult.getResults()) {

                        DeviceInfo deviceInfo = deviceIter.next();
                        
                        if (null != result.getMessageId()) {

                            if (null != result.getCanonicalRegistrationId()) {

                                /*
                                 * Update the DeviceInfo with the new ID and
                                 * post to DB
                                 */
                                deviceInfo.setDeviceRegistrationId(result.getCanonicalRegistrationId());
                                deviceEndpoint.updateDeviceInfo(deviceInfo);
                                logger.log(Level.INFO, "Updated device with new GCM ID: " + deviceInfo);
                            }

                        } else {
                            logger.log(Level.WARNING, "GCM returned result " + result.getErrorCodeName());
                        }
                    }
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static Message buildCompletionMessage(final DataWhole dataWhole) {
        return new Message.Builder()
                .addData(WHOLE_COMPLETION_KEY, dataWhole.getKey())
                .collapseKey(dataWhole.getKey())
                .build();
    }

    private static Message buildRequestMessage(final DataWhole dataWhole, final DataPiece dataPiece) {
        return new Message.Builder()
        .addData(PIECE_REQUEST_KEY, dataPiece.getKey())
        .addData(WHOLE_REQUEST_KEY, dataWhole.getKey())
        .collapseKey(dataPiece.getKey())
        .build();
    }

}




Java Source Code List

com.fyp.resilience.Constants.java
com.fyp.resilience.Flags.java
com.fyp.resilience.GCMIntentService.java
com.fyp.resilience.PreferenceConstants.java
com.fyp.resilience.ResilienceApplication.java
com.fyp.resilience.ResilienceController.java
com.fyp.resilience.activity.LicenceActivity.java
com.fyp.resilience.activity.ResilienceActivity.java
com.fyp.resilience.activity.SettingsActivity.java
com.fyp.resilience.adapter.ClientListAdapter.java
com.fyp.resilience.adapter.ConnectionListAdapter.java
com.fyp.resilience.adapter.FileListAdapter.java
com.fyp.resilience.connection.Connectable.java
com.fyp.resilience.connection.ServerDownloadConnectable.java
com.fyp.resilience.connection.ServerUploadConnectable.java
com.fyp.resilience.connection.UploadConnectable.java
com.fyp.resilience.connection.WifiDownloadConnectable.java
com.fyp.resilience.connection.WifiUploadConnectable.java
com.fyp.resilience.database.ResilienceDbHelper.java
com.fyp.resilience.database.ResilienceDbManager.java
com.fyp.resilience.database.model.DataPiece.java
com.fyp.resilience.database.model.DataWhole.java
com.fyp.resilience.event.ClientListChanged.java
com.fyp.resilience.event.ClientModified.java
com.fyp.resilience.event.ConnectionProgressChange.java
com.fyp.resilience.event.ConnectionStateChange.java
com.fyp.resilience.event.ConnectionsModified.java
com.fyp.resilience.event.PieceStateChange.java
com.fyp.resilience.event.ServerRegistrationChanged.java
com.fyp.resilience.event.ServerUploadFinished.java
com.fyp.resilience.event.WholeModified.java
com.fyp.resilience.event.WifiDownloadFinished.java
com.fyp.resilience.event.WifiUploadFinished.java
com.fyp.resilience.fragment.ClientsFragment.java
com.fyp.resilience.fragment.ConnectionsFragment.java
com.fyp.resilience.fragment.FilesFragment.java
com.fyp.resilience.interfaces.Messagable.java
com.fyp.resilience.interfaces.Partialable.java
com.fyp.resilience.proto.ProtoBuffSpecification.java
com.fyp.resilience.receiver.AbstractConnectivityBroadcastReceiver.java
com.fyp.resilience.receiver.BootReceiver.java
com.fyp.resilience.receiver.ConnectivityBroadcastReceiver.java
com.fyp.resilience.receiver.WiFiDirectBroadcastReceiver.java
com.fyp.resilience.register.RegisterRequestInitializer.java
com.fyp.resilience.register.RegisterRequest.java
com.fyp.resilience.register.RegisterScopes.java
com.fyp.resilience.register.Register.java
com.fyp.resilience.register.model.DeviceInfo.java
com.fyp.resilience.service.PieceUploadService.java
com.fyp.resilience.stream.PiecedRandomAccessFile.java
com.fyp.resilience.swarm.helper.NsdHelper.java
com.fyp.resilience.swarm.helper.SwarmHelperInterface.java
com.fyp.resilience.swarm.helper.WifiDirectSdHelper.java
com.fyp.resilience.swarm.model.SwarmClient.java
com.fyp.resilience.thread.ResilienceRunnable.java
com.fyp.resilience.thread.ResilienceThreadFactory.java
com.fyp.resilience.util.ConnectionUtils.java
com.fyp.resilience.util.Utils.java
com.fyp.resilience.view.ClientView.java
com.fyp.resilience.view.ConnectionView.java
com.fyp.resilience.view.FileView.java
com.fyp.resilience.view.PieceProgressIndicator.java
com.fyp.resilience.widerst.WiderstRequestInitializer.java
com.fyp.resilience.widerst.WiderstRequest.java
com.fyp.resilience.widerst.WiderstScopes.java
com.fyp.resilience.widerst.Widerst.java
com.fyp.resilience.widerst.model.DataPiecePartial.java
com.fyp.resilience.widerst.model.DataWholePartial.java
com.fyp.resilience.widerst.model.PostResponse.java
com.fyp.widerst.Constants.java
com.fyp.widerst.WiderstObjectifyService.java
com.fyp.widerst.backend.FileJoinerBackend.java
com.fyp.widerst.cron.CronJobServlet.java
com.fyp.widerst.endpoint.DataPieceEndpoint.java
com.fyp.widerst.endpoint.DeviceInfoEndpoint.java
com.fyp.widerst.entity.DataPiece.java
com.fyp.widerst.entity.DataWhole.java
com.fyp.widerst.entity.DeviceInfo.java
com.fyp.widerst.handler.BlobstoreUploadHandler.java
com.fyp.widerst.partial.DataPiecePartial.java
com.fyp.widerst.partial.DataWholePartial.java
com.fyp.widerst.response.PostResponse.java
com.fyp.widerst.servlet.WholeFileServer.java
com.fyp.widerst.util.DbHelper.java
com.fyp.widerst.util.GcmHelper.java