package ru.shutoff.cgstarter; import android.accessibilityservice.AccessibilityService; import android.accessibilityservice.AccessibilityServiceInfo; import android.app.Notification; import android.content.Intent; import android.content.SharedPreferences; import android.os.Parcelable; import android.preference.PreferenceManager; import android.view.accessibility.AccessibilityEvent; import android.widget.RemoteViews; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class NotificationService extends AccessibilityService { private boolean init; @Override public void onAccessibilityEvent(AccessibilityEvent event) { final int eventType = event.getEventType(); if (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) { Parcelable parcelable = event.getParcelableData(); if (parcelable instanceof Notification) { try { Notification notification = (Notification) parcelable; RemoteViews views = notification.contentView; Class secretClass = views.getClass(); String msg_title = null; String msg_info = null; String msg_text = null; String msg_app = event.getPackageName().toString(); Field outerFields[] = secretClass.getDeclaredFields(); for (Field outerField : outerFields) { if (!outerField.getName().equals("mActions")) continue; outerField.setAccessible(true); ArrayList<Object> actions = (ArrayList<Object>) outerField.get(views); for (Object action : actions) { Field innerFields[] = action.getClass().getDeclaredFields(); Object value = null; Integer type = null; Integer viewId = null; for (Field field : innerFields) { field.setAccessible(true); if (field.getName().equals("value")) { value = field.get(action); } else if (field.getName().equals("type")) { type = field.getInt(action); } else if (field.getName().equals("viewId")) { viewId = field.getInt(action); } } if ((value != null) && ((type == 9) || (type == 10))) { if ((msg_title == null) && (viewId == 16908310)) msg_title = value.toString(); if ((msg_info == null) && (viewId == 16909082)) msg_info = value.toString(); if ((msg_text == null) && (viewId == 16908358)) msg_text = value.toString(); } } } if (msg_text == null) { List<CharSequence> messages = event.getText(); if (messages.size() > 0) msg_text = messages.get(0).toString(); } if (msg_text != null) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); String[] ignored = preferences.getString(State.NOTIFICATION_IGNORE, "").split(":"); for (String app : ignored) { if (app.equals(msg_app)) return; } Intent intent = new Intent(OnExitService.NOTIFICATION); intent.putExtra(State.TITLE, msg_title); intent.putExtra(State.INFO, msg_info); intent.putExtra(State.TEXT, msg_text); intent.putExtra(State.APP, msg_app); intent.putExtra(State.ICON, notification.icon); sendBroadcast(intent); } } catch (Exception e) { e.printStackTrace(); } } } } @Override protected void onServiceConnected() { super.onServiceConnected(); if (!init) { AccessibilityServiceInfo info = new AccessibilityServiceInfo(); info.eventTypes = AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED; info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN; setServiceInfo(info); init = true; } } @Override public void onInterrupt() { init = false; } }