package treehou.se.habit.gcm; /** * Copyright (c) 2010-2014, openHAB.org and others. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * @author Victor Belov * @since 1.4.0 * */ import android.app.IntentService; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; import android.speech.tts.TextToSpeech; import android.support.v4.app.NotificationCompat; import android.support.v4.app.RemoteInput; import android.util.Log; import com.google.android.gms.gcm.GoogleCloudMessaging; import java.util.Locale; import io.realm.Realm; import treehou.se.habit.service.wear.VoiceActionService; import treehou.se.habit.util.Constants; import treehou.se.habit.MainActivity; import treehou.se.habit.R; import treehou.se.habit.core.db.settings.NotificationSettingsDB; public class GcmIntentService extends IntentService { private NotificationManager mNotificationManager; static final int NOTIFICATION_ID = 1337; private static final String GCM_FROM = "from"; private static final String TAG = "GcmIntentService"; // NotificationDB delete receiver private TextToSpeech textToSpeech; public GcmIntentService() { super("GcmIntentService"); } @Override protected void onHandleIntent(Intent intent) { Bundle extras = intent.getExtras(); if (extras == null) { return; } int notificationId; if (mNotificationManager == null) { mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); } GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); String gcmType = gcm.getMessageType(intent); Log.d(TAG, "Message type = " + gcmType); if (!extras.isEmpty()) { if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(gcmType)) { // If this is notification, create new one if (!intent.hasExtra("notificationId")) { notificationId = 1; } else { notificationId = Integer.parseInt(intent.getExtras().getString("notificationId")); } String messageType = intent.getExtras().getString("type"); if (messageType != null && messageType.equals("notification")) { sendNotification(intent.getExtras().getString("message"), notificationId); // If this is hideNotification, cancel existing notification with it's id } else if (messageType != null && messageType.equals("hideNotification")) { mNotificationManager.cancel(Integer.parseInt(intent.getExtras().getString("notificationId"))); } } } // Release the wake lock provided by the WakefulBroadcastReceiver. GcmBroadcastReceiver.completeWakefulIntent(intent); } private void sendNotification(final String msg, int notificationId) { if (mNotificationManager == null) { mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); } Intent notificationIntent = new Intent(this, MainActivity.class); notificationIntent.setAction("org.openhab.notification.selected"); notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); notificationIntent.putExtra("notificationId", notificationId); PendingIntent pendingNotificationIntent = PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); // Check if notification should be spoken Log.d(TAG, "Message " + Constants.PREF_REGISTRATION_SERVER + notificationId); /*getSharedPreferences(Constants.PREF_REGISTRATION_SERVER + notificationId, MODE_PRIVATE); SharedPreferences preferences = getSharedPreferences(Constants.PREFERENCE_SERVER, Context.MODE_PRIVATE); long serverId = preferences.getLong(Constants.PREF_REGISTRATION_SERVER+notificationId,-1); if(serverId < 0){ return; } Server server = Server.load(Server.class, serverId);*/ Realm realm = Realm.getDefaultInstance(); NotificationSettingsDB notificationSettings = NotificationSettingsDB.loadGlobal(realm); if(notificationSettings.notificationToSpeech()) { textToSpeech = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { if (status != TextToSpeech.ERROR) { textToSpeech.setLanguage(Locale.getDefault()); textToSpeech.speak(msg, TextToSpeech.QUEUE_FLUSH, null); } } }); } realm.close(); /*NotificationDB notification = new NotificationDB(msg); notification.save(); List<NotificationDB> notifications = new Select().all().from(NotificationDB.class).execute();*/ //TODO create inbox style String replyLabel = getString(R.string.notification_title); RemoteInput remoteInput = new RemoteInput.Builder(VoiceActionService.EXTRA_VOICE_REPLY) .setLabel(replyLabel) .build(); Intent replyIntent = new Intent(this, VoiceActionService.class); PendingIntent replyPendingIntent = PendingIntent.getService(this, 0, replyIntent, 0); // Create the reply action and add the remote input NotificationCompat.Action action = new NotificationCompat.Action.Builder( R.drawable.action_voice_light, getString(R.string.voice_command), replyPendingIntent) .addRemoteInput(remoteInput) .build(); Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_notification) .setContentTitle(getString(R.string.notification_title)) .setAutoCancel(true) .setSound(alarmSound) .extend(new NotificationCompat.WearableExtender().addAction(action)) .setContentText(msg); mBuilder.setContentIntent(pendingNotificationIntent); mNotificationManager.notify(notificationId, mBuilder.build()); } }