/**
* Broadcast receiver responsible for removing rules that affect uninstalled apps.
*
* Copyright (C) 2009-2011 Rodrigo Zechin Rosauro
* Copyright (C) 2011-2012 Umakanthan Chandran
*
* 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/>.
*
* @author Rodrigo Zechin Rosauro, Umakanthan Chandran
* @version 1.1
*/
package dev.ukanth.ufirewall.broadcast;
import android.Manifest;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.support.v4.app.NotificationCompat;
import dev.ukanth.ufirewall.Api;
import dev.ukanth.ufirewall.MainActivity;
import dev.ukanth.ufirewall.R;
import dev.ukanth.ufirewall.log.Log;
/**
* Broadcast receiver responsible for removing rules that affect uninstalled
* apps.
*/
public class PackageBroadcast extends BroadcastReceiver {
enum NotificationType {
newinstall, update
};
@Override
public void onReceive(Context context, Intent intent) {
Uri inputUri = Uri.parse(intent.getDataString());
if (!inputUri.getScheme().equals("package")) {
Log.d("AFWall+", "Intent scheme was not 'package'");
return;
}
if (Intent.ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
// Ignore application updates
final boolean replacing = intent.getBooleanExtra(
Intent.EXTRA_REPLACING, false);
if (!replacing) {
// Update the Firewall if necessary
final int uid = intent.getIntExtra(Intent.EXTRA_UID, -123);
Api.applicationRemoved(context, uid);
Api.removeCacheLabel(intent.getData().getSchemeSpecificPart(),context);
// Force app list reload next time
Api.applications = null;
}
} else if (Intent.ACTION_PACKAGE_ADDED.equals(intent.getAction())) {
final boolean updateApp = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
if (updateApp) {
// dont do anything
//1 check the package already added in firewall
} else {
// Force app list reload next time
Api.applications = null;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean isNotify = prefs.getBoolean("notifyAppInstall", false);
if (isNotify && Api.isEnabled(context)) {
String added_package = intent.getData().getSchemeSpecificPart();
final PackageManager pkgmanager = context.getPackageManager();
String label = null;
try {
label = pkgmanager.getApplicationLabel(pkgmanager.getApplicationInfo(added_package, 0)).toString();
} catch (NameNotFoundException e) {
}
if (PackageManager.PERMISSION_GRANTED == pkgmanager.checkPermission(Manifest.permission.INTERNET,added_package)) {
notifyApp(context, intent, label);
}
}
}
}
}
//@SuppressWarnings("deprecation")
public void notifyApp(Context context, Intent intent2, String label) {
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) context
.getSystemService(ns);
int icon = R.drawable.question;
final int HELLO_ID = 24556;
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
Intent appIntent = new Intent(context, MainActivity.class);
PendingIntent in = PendingIntent.getActivity(context, 0, appIntent, 0);
String notificationText = context.getString(R.string.notification_new);
if(label != null) {
notificationText = label + "-" +context.getString(R.string.notification_new_package);
}
builder.setSmallIcon(icon)
.setAutoCancel(true)
.setContentTitle(context.getString(R.string.notification_title))
.setTicker(context.getString(R.string.notification_title))
.setContentText(notificationText);
builder.setContentIntent(in);
mNotificationManager.notify(HELLO_ID, builder.build());
}
}