Android Open Source - GeoDeals-android Demo Service






From Project

Back to project page GeoDeals-android.

License

The source code is released under:

GNU General Public License

If you think the Android project GeoDeals-android 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

/**
 * GeoMoby Pty Ltd//from   w  w w. j  a v  a 2s  .c om
 * http://www.geomoby.com
 * Copyright GeoMoby Pty Ltd 2013
 * 
 * @author Chris Baudia
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.geomoby.geodeals;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Properties;

import android.app.Activity;
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.res.AssetManager;
import android.content.res.Resources;
import android.graphics.Typeface;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.Toast;

import com.geomoby.async.GeoMessage;
import com.geomoby.geodeals.notification.CustomNotification;

import com.geomoby.logic.GeomobyStartService;
import com.geomoby.logic.GeomobyStopService;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;

import com.geomoby.logic.GeomobyNotificationsReceiver;
import com.geomoby.logic.GeomobyNotificationsReceiver.GMNotificationsListener;

public class DemoService extends Activity implements GMNotificationsListener {

  private static final String TAG = "** Demo Service **";
  private static final String PREF = "GeoMobyPrefs";
  private static final String SETTING_TAGS = "tags";
  private static final String PREF_NAME="checked";
  private static SharedPreferences spref;
  private static int notifyID = 1;   // Sets an ID for the notification, so it can be updated
  
  boolean isCheckedStatus;
  CompoundButton mToggle;
  public Context mContext;


  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.geomoby_main);
    mContext = this;

    mToggle = (CompoundButton) findViewById(R.id.togglebutton); 
    
    spref = getSharedPreferences(PREF_NAME, MODE_PRIVATE);
    isCheckedStatus = spref.getBoolean("check", false);  //default is false

    /*
     * Set up toggle status
     */
    if (!isCheckedStatus) 
      mToggle.setChecked(false);
    else
      mToggle.setChecked(true);

    /*
     *  Save the tags in the GeoMoby shared preferences in private mode for the user. These tags will be used
     *  to segment your audience when creating your proximity alerts. Please make sure that they match with
     *  the ones configured in your dashboard when you create an alert.
     *  Ex: 'test' is the default tag so make sure that it is set up in your Account page
     */
    SharedPreferences mySharedPreferences = getSharedPreferences(PREF, MODE_PRIVATE);

    // Build the string of tags - empty for testing. Make sure that you create your first geofences with no tags in your dashboard.
    // Add your own logic here: "male,vip,monday"...
    String tags = "";

    // Commit the string
    SharedPreferences.Editor prefEditor = mySharedPreferences.edit();
    prefEditor.putString(SETTING_TAGS, tags);
    prefEditor.commit();

    /*
     *  Monitor the toggle - Our SDK will ensure that all services are running/stopping properly
     */
    mToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

        if (isChecked == false) {

          mToggle.setPressed(false);

          // Stop the GeoMoby tracking service
          startService(new Intent(DemoService.this, GeomobyStopService.class));

          SharedPreferences.Editor editor = spref.edit();
          editor.putBoolean("check", false);
          editor.commit();

        }else{

          mToggle.setPressed(true);

          // Start the GeoMoby tracking service
          startService(new Intent(DemoService.this, GeomobyStartService.class));

          SharedPreferences.Editor editor = spref.edit();
          editor.putBoolean("check", true);
          editor.commit();

          LayoutInflater inflater = getLayoutInflater();
          // Inflate the Layout
          View layout = inflater.inflate(R.layout.geomoby_toast, (ViewGroup) findViewById(R.id.custom_toast_layout));

          // Set the Text to show in TextView
          TextView text = (TextView) layout.findViewById(R.id.textToShow);
          text.setText("GREAT! YOU ARE READY TO RECEIVE REAL-TIME NOTIFICATIONS!");
          Typeface face;
          face = Typeface.createFromAsset(getAssets(), "Bitter-Bold.otf");
          text.setTypeface(face);

          Toast toast = new Toast(getApplicationContext());
          toast.setGravity(Gravity.BOTTOM, 0, 50);
          toast.setDuration(Toast.LENGTH_LONG);
          toast.setView(layout);
          toast.show();
        }
      }
    });
    
    // Initialise GeoMoby Notification Listener
    GeomobyNotificationsReceiver receiver = new GeomobyNotificationsReceiver();
    receiver.setNotificationListener(this);
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    finish();
  }

  @Override
  protected void onPause() {
    super.onPause();
    onDestroy();
  }

  @Override
  public void onBackPressed() {
    onDestroy();
  }
  
    @Override
    public void onNotificationReceived(String message) {
      Log.d(TAG,"Notification Received!");
      generateNotification(mContext, message);
    }
  
  /**
   * Issues a notification to inform the user that server has sent a message.
   */
  private static void generateNotification(Context context, String message) {
    if(message.length() > 0) {
      
      // Parse the GeoMoby message using the GeoMessage class
      try{
        Gson gson = new Gson();
        JsonParser parser = new JsonParser();
        JsonArray Jarray = parser.parse(message).getAsJsonArray();
        ArrayList<GeoMessage> alerts = new ArrayList<GeoMessage>();
        for(JsonElement obj : Jarray ){
          GeoMessage gName = gson.fromJson(obj,GeoMessage.class);
          alerts.add(gName);
        }

        // Prepare Notification and pass the GeoMessage to an Extra
        NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        Intent i = new Intent(context, CustomNotification.class);
        i.putParcelableArrayListExtra("GeoMessage", (ArrayList<GeoMessage>) alerts);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
  
        // Read from the /assets directory
        Resources resources = context.getResources();
        AssetManager assetManager = resources.getAssets();
        try {
          InputStream inputStream = assetManager.open("geomoby.properties");
          Properties properties = new Properties();
          properties.load(inputStream);
          String push_icon = properties.getProperty("push_icon");
          int icon = resources.getIdentifier(push_icon , "drawable", context.getPackageName());
          int not_title = resources.getIdentifier("notification_title" , "string", context.getPackageName());
          int not_text = resources.getIdentifier("notification_text" , "string", context.getPackageName());
          int not_ticker = resources.getIdentifier("notification_ticker" , "string", context.getPackageName());
  
          // Manage notifications differently according to Android version
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
  
            builder
            .setSmallIcon(icon)
            .setContentTitle(context.getResources().getText(not_title))
            .setContentText(context.getResources().getText(not_text))
            .setTicker(context.getResources().getText(not_ticker))
            .setContentIntent(pendingIntent)
            .setAutoCancel(true);
  
            builder
            .setDefaults(Notification.DEFAULT_ALL); //Vibrate, Sound and Led
  
            // Because the ID remains unchanged, the existing notification is updated.
            notificationManager.notify(notifyID,builder.build());
  
          }else{
            Notification notification = new Notification(icon,context.getResources().getText(not_text),System.currentTimeMillis());
  
            //Setting Notification Flags
            notification.defaults |= Notification.DEFAULT_ALL;
            notification.flags |= Notification.FLAG_AUTO_CANCEL;
  
            //Set the Notification Info
            notification.setLatestEventInfo(context, context.getResources().getText(not_text), context.getResources().getText(not_ticker), pendingIntent);
  
            //Send the notification
            // Because the ID remains unchanged, the existing notification is updated.
            notificationManager.notify(notifyID, notification);
          }
        } catch (IOException e) {
          System.err.println("Failed to open geomoby property file");
          e.printStackTrace();
        }
      }catch ( JsonParseException e) {
        Log.i(TAG,"This is not a GeoMoby notification");
        throw new RuntimeException(e);
      }
    }
  }
}




Java Source Code List

com.geomoby.geodeals.DemoService.java
com.geomoby.geodeals.MainActivity.java
com.geomoby.geodeals.notification.CustomNotification.java
com.geomoby.geodeals.receiver.ServiceStarter.java
com.geomoby.geodeals.splash.SplashActivity.java