package com.buzzbuddy.android;
import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.app.Notification;
import android.content.Context;
import android.database.Cursor;
import android.media.AudioManager;
import android.os.Vibrator;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
public class NotificationDetectorService extends AccessibilityService {
private static final String GOOGLE_TALK_PACKAGE = "com.google.android.talk";
private static final String GOOGLE_SERVICES_FRAMEWORK_PACKAGE = "com.google.android.gsf";
private static final String TAG = NotificationDetectorService.class.getSimpleName();
private Vibrator vibrator;
private AudioManager audioManager;
private BuzzDB base;
@SuppressWarnings("deprecation")
@Override
public void onAccessibilityEvent(final AccessibilityEvent event) {
Log.i(TAG, "onAccessibilityEvent");
if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT) {
return;
}
final int vibrateSetting = audioManager.getVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION);
audioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION, AudioManager.VIBRATE_SETTING_OFF);
String packageName = String.valueOf(event.getPackageName());
if (BuildConfig.DEBUG) {
Log.i(TAG, packageName);
}
if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
Log.d(TAG, "Notification Event");
final Notification notification = (Notification) event.getParcelableData();
if (notification == null) {
Log.e(TAG, "notification is null");
return;
}
if ((notification.flags & Notification.FLAG_ONGOING_EVENT) != 0) {
Log.i(TAG, "ongoing event, do not play vibration pattern");
return;
}
if (packageName.equals(GOOGLE_SERVICES_FRAMEWORK_PACKAGE)) {
packageName = GOOGLE_TALK_PACKAGE;
}
final Cursor resultSet = base.queryByPackageName(packageName);
resultSet.moveToFirst();
if (resultSet.getCount() > 0) {
final String patternString = resultSet.getString(BuzzDB.APP_INDEX_VIBRATION);
final long[] vibrationPattern = VibrationPatternUtils.deserializePattern(patternString);
Log.i(TAG, "playing vibration pattern!");
vibrator.vibrate(vibrationPattern, -1);
}
resultSet.close();
audioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION, vibrateSetting);
}
}
@Override
protected void onServiceConnected() {
if (BuildConfig.DEBUG) {
Log.d(TAG, "onServiceConnected");
}
vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
base = ((BuzzBuddyApp) getApplication()).getDatabase();
final AccessibilityServiceInfo info = new AccessibilityServiceInfo();
info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED;
info.notificationTimeout = 0;
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_HAPTIC;
setServiceInfo(info);
}
@Override
public void onInterrupt() {
Log.e(TAG, "onInterrupt");
}
}