Index: src/org/adblockplus/android/ProxyService.java |
=================================================================== |
--- a/src/org/adblockplus/android/ProxyService.java |
+++ b/src/org/adblockplus/android/ProxyService.java |
@@ -29,6 +29,7 @@ |
import sunlabs.brazil.server.Server; |
import sunlabs.brazil.util.Base64; |
+import android.annotation.SuppressLint; |
import android.app.Notification; |
import android.app.NotificationManager; |
import android.app.PendingIntent; |
@@ -49,6 +50,7 @@ |
import android.os.Handler; |
import android.os.IBinder; |
import android.preference.PreferenceManager; |
+import android.support.v4.app.NotificationCompat; |
import android.util.Log; |
import android.widget.Toast; |
@@ -75,6 +77,7 @@ |
private final static int NO_TRAFFIC_TIMEOUT = 5 * 60 * 1000; // 5 minutes |
final static int ONGOING_NOTIFICATION_ID = R.string.app_name; |
+ private static final long POSITION_RIGHT = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD ? Long.MIN_VALUE : Long.MAX_VALUE; |
private final static int NOTRAFFIC_NOTIFICATION_ID = R.string.app_name + 3; |
/** |
@@ -89,9 +92,7 @@ |
private final static String IPTABLES_RETURN = " -t nat -m owner --uid-owner {{UID}} -A OUTPUT -p tcp -j RETURN\n"; |
private final static String IPTABLES_ADD_HTTP = " -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to {{PORT}}\n"; |
- private Notification ongoingNotification; |
- private PendingIntent contentIntent; |
- |
+ boolean hideIcon; |
private Handler notrafficHandler; |
protected ProxyServer proxy = null; |
@@ -263,14 +264,8 @@ |
prefs.registerOnSharedPreferenceChangeListener(this); |
// Lock service |
- boolean hideIcon = prefs.getBoolean(getString(R.string.pref_hideicon), resources.getBoolean(R.bool.def_hideicon)); |
- String msg = getString(transparent ? R.string.notif_all : nativeProxy ? R.string.notif_wifi : R.string.notif_waiting); |
- ongoingNotification = new Notification(); |
- ongoingNotification.when = 0; |
- contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, Preferences.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK), 0); |
- ongoingNotification.icon = hideIcon ? R.drawable.transparent : R.drawable.ic_stat_blocking; |
- ongoingNotification.setLatestEventInfo(getApplicationContext(), getText(R.string.app_name), msg, contentIntent); |
- startForeground(ONGOING_NOTIFICATION_ID, ongoingNotification); |
+ hideIcon = prefs.getBoolean(getString(R.string.pref_hideicon), resources.getBoolean(R.bool.def_hideicon)); |
+ startForeground(ONGOING_NOTIFICATION_ID, getNotification()); |
// If automatic setting of proxy was blocked, check if user has set it manually |
boolean manual = isManual(); |
@@ -295,7 +290,7 @@ |
{ |
super.onDestroy(); |
- stopNoTrafficCheck(false, false); |
+ stopNoTrafficCheck(); |
unregisterReceiver(matchesReceiver); |
unregisterReceiver(proxyReceiver); |
@@ -618,57 +613,76 @@ |
private void updateNoTrafficCheck(String[] userProxy) |
{ |
boolean ourProxy = userProxy != null && isLocalHost(userProxy[0]) && Integer.valueOf(userProxy[1]) == port; |
+ if (ourProxy != proxyManualyConfigured) |
Thomas Greiner
2013/02/27 16:34:29
rename to proxyManuallyConfigured
|
+ { |
+ proxyManualyConfigured = ourProxy; |
+ sendStateChangedBroadcast(); |
+ } |
if (ourProxy) |
{ |
- stopNoTrafficCheck(true, true); |
+ stopNoTrafficCheck(); |
} |
else |
{ |
// Initiate no traffic check |
notrafficHandler = new Handler(); |
Thomas Greiner
2013/02/27 16:34:29
variable name should be camel-cased (otherwise it
|
notrafficHandler.postDelayed(noTraffic, NO_TRAFFIC_TIMEOUT); |
- NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); |
- ongoingNotification.setLatestEventInfo(ProxyService.this, getText(R.string.app_name), getText(R.string.notif_waiting), contentIntent); |
- notificationManager.notify(ONGOING_NOTIFICATION_ID, ongoingNotification); |
} |
- if (ourProxy != proxyManualyConfigured) |
- { |
- proxyManualyConfigured = ourProxy; |
- sendStateChangedBroadcast(); |
- } |
+ NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); |
+ notificationManager.notify(ONGOING_NOTIFICATION_ID, getNotification()); |
} |
/** |
- * Stops no traffic check, optionally resetting notification message. |
- * |
- * @param changeStatus |
- * true if notification message should be set to normal operating |
- * mode |
- * @param forceMessageReset |
- * if true unconditionally reset main notification message |
+ * Stops no traffic check and resets notification message. |
*/ |
- private void stopNoTrafficCheck(boolean changeStatus, boolean forceMessageReset) |
+ private void stopNoTrafficCheck() |
{ |
if (notrafficHandler != null) |
{ |
notrafficHandler.removeCallbacks(noTraffic); |
- proxyManualyConfigured = true; |
sendStateChangedBroadcast(); |
- } |
- if (changeStatus && (notrafficHandler != null || forceMessageReset)) |
- { |
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); |
- ongoingNotification.setLatestEventInfo(ProxyService.this, getText(R.string.app_name), getText(R.string.notif_wifi), contentIntent); |
- notificationManager.notify(ONGOING_NOTIFICATION_ID, ongoingNotification); |
+ notificationManager.notify(ONGOING_NOTIFICATION_ID, getNotification()); |
} |
notrafficHandler = null; |
} |
- public void setEmptyIcon(boolean empty) |
+ @SuppressLint("NewApi") |
+ private Notification getNotification() |
{ |
- ongoingNotification.icon = empty ? R.drawable.transparent : R.drawable.ic_stat_blocking; |
+ int msgId = R.string.notif_waiting; |
+ if (nativeProxy || proxyManualyConfigured) |
+ msgId = R.string.notif_wifi; |
+ if (transparent) |
+ msgId = R.string.notif_all; |
+ |
+ Log.e(TAG, "V: " + nativeProxy + " " + proxyManualyConfigured + " " + transparent); |
Thomas Greiner
2013/02/27 16:34:29
Why is this being logged with priority ERROR?
|
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(this); |
+ if (hideIcon && msgId != R.string.notif_waiting) |
+ { |
+ builder.setWhen(POSITION_RIGHT); |
+ builder.setSmallIcon(R.drawable.transparent); |
+ //builder.setContent(new RemoteViews(getPackageName(), R.layout.notif_hidden)); |
Thomas Greiner
2013/02/27 16:34:29
you can add a TODO here but keep unused code in lo
|
+ } |
+ else |
+ { |
+ builder.setWhen(0); |
+ builder.setSmallIcon(R.drawable.ic_stat_blocking); |
+ } |
+ PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, Preferences.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK), 0); |
+ builder.setContentIntent(contentIntent); |
+ builder.setContentTitle(getText(R.string.app_name)); |
+ builder.setContentText(getText(msgId)); |
+ |
+ Notification notification = builder.getNotification(); |
+ return notification; |
+ } |
+ |
+ public void setEmptyIcon(boolean hide) |
+ { |
+ hideIcon = hide; |
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); |
- notificationManager.notify(ONGOING_NOTIFICATION_ID, ongoingNotification); |
+ notificationManager.notify(ONGOING_NOTIFICATION_ID, getNotification()); |
} |
public void sendStateChangedBroadcast() |
@@ -706,17 +720,19 @@ |
public void run() |
{ |
// Show warning notification |
- Notification notification = new Notification(); |
- notification.icon = R.drawable.ic_stat_warning; |
- notification.when = System.currentTimeMillis(); |
- notification.flags |= Notification.FLAG_AUTO_CANCEL; |
- notification.defaults |= Notification.DEFAULT_SOUND; |
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(ProxyService.this); |
+ builder.setSmallIcon(R.drawable.ic_stat_warning); |
+ builder.setWhen(System.currentTimeMillis()); |
+ builder.setAutoCancel(true); |
+ builder.setDefaults(Notification.DEFAULT_SOUND); |
Intent intent = new Intent(ProxyService.this, ConfigurationActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
intent.putExtra("port", port); |
PendingIntent contentIntent = PendingIntent.getActivity(ProxyService.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); |
- notification.setLatestEventInfo(ProxyService.this, getText(R.string.app_name), getString(R.string.notif_notraffic), contentIntent); |
+ builder.setContentIntent(contentIntent); |
+ builder.setContentTitle(getText(R.string.app_name)); |
+ builder.setContentText(getText(R.string.notif_notraffic)); |
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); |
- notificationManager.notify(NOTRAFFIC_NOTIFICATION_ID, notification); |
+ notificationManager.notify(NOTRAFFIC_NOTIFICATION_ID, builder.getNotification()); |
} |
}; |
@@ -729,7 +745,10 @@ |
public void onReceive(final Context context, Intent intent) |
{ |
if (intent.getAction().equals(AdblockPlus.BROADCAST_FILTER_MATCHES)) |
- stopNoTrafficCheck(true, false); |
+ { |
+ proxyManualyConfigured = true; |
+ stopNoTrafficCheck(); |
+ } |
} |
}; |