/* (C) 2012 Pragmatic Software This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/ */ package com.googlecode.networklog; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.CheckedTextView; import android.widget.ImageView; import android.widget.ListView; import android.util.Log; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.FileReader; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; public abstract class AppsSelector { Context context; ArrayList<AppItem> appData; CustomAdapter adapter; HashMap<String, String> apps; AlertDialog dialog; String name; class AppItem { Drawable icon; String name; String packageName; boolean enabled; } protected abstract File getSaveFile(Context context); protected abstract void negativeButton(); protected abstract void positiveButton(); public HashMap<String, String> loadBlockedApps(Context context) { File file = getSaveFile(context); HashMap<String, String> map = new HashMap<String, String>(); if(!file.exists()) { return map; } try { BufferedReader br = new BufferedReader(new FileReader(file)); String line; while ((line = br.readLine()) != null) { map.put(line, line); } br.close(); } catch(Exception e) { Log.w("NetworkLog", "Exception loading " + name + ": " + e); SysUtils.showError(context, "Error loading " + name, e.getMessage()); return map; } return map; } public void saveBlockedApps(Context context, HashMap<String, String> map) { File file = getSaveFile(context); try { PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(file))); for(String key : map.keySet()) { writer.println(key); } writer.close(); } catch(Exception e) { Log.w("NetworkLog", "Exception saving " + name + ": " + e); SysUtils.showError(context, "Error saving " + name, e.getMessage()); } } protected static class SortAppsByName implements Comparator<AppItem> { public int compare(AppItem o1, AppItem o2) { return o1.name.compareToIgnoreCase(o2.name); } } public void showDialog(final Context context) { showDialog(context, null); } public void showDialog(final Context context, ArrayList<AppItem> data) { this.context = context; LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.select_apps, null); if(data == null) { appData = new ArrayList<AppItem>(); for(ApplicationsTracker.AppEntry app : ApplicationsTracker.installedApps) { AppItem item = new AppItem(); item.name = app.name; item.packageName = app.packageName; appData.add(item); } Collections.sort(appData, new SortAppsByName()); apps = loadBlockedApps(context); if(apps != null) { for(AppItem item : appData) { if(apps.get(item.packageName) != null) { item.enabled = true; } } } } else { appData = data; } ListView listView = (ListView) view.findViewById(R.id.select_apps); adapter = new CustomAdapter(context, R.layout.select_apps_item, appData); listView.setAdapter(adapter); listView.setOnItemClickListener(new CustomOnItemClickListener()); listView.setFastScrollEnabled(true); ((Button) view.findViewById(R.id.select_all)).setOnClickListener(new View.OnClickListener() { public void onClick(View v) { for(AppItem item : appData) { item.enabled = true; } adapter.notifyDataSetChanged(); } }); ((Button) view.findViewById(R.id.select_none)).setOnClickListener(new View.OnClickListener() { public void onClick(View v) { for(AppItem item : appData) { item.enabled = false; } adapter.notifyDataSetChanged(); } }); Resources res = context.getResources(); AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle(res.getString(R.string.pref_toast_block_apps)) .setView(view) .setCancelable(true) .setNegativeButton(res.getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.dismiss(); negativeButton(); } }) .setPositiveButton(res.getString(R.string.done), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { apps = new HashMap<String, String>(); for(AppItem item : appData) { if(item.enabled == true) { apps.put(item.packageName, item.packageName); } } saveBlockedApps(context, apps); dialog.dismiss(); positiveButton(); } }); dialog = builder.create(); dialog.show(); } private class CustomOnItemClickListener implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { AppItem item = appData.get(position); item.enabled = !item.enabled; CheckedTextView ctv = (CheckedTextView) view.findViewById(R.id.select_apps_name); ctv.setChecked(item.enabled); } } private class CustomAdapter extends ArrayAdapter<AppItem> { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); public CustomAdapter(Context context, int resource, List<AppItem> objects) { super(context, resource, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; ImageView icon; CheckedTextView name; AppItem item = getItem(position); if(convertView == null) { convertView = inflater.inflate(R.layout.select_apps_item, null); holder = new ViewHolder(convertView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } icon = holder.getIcon(); icon.setTag(item.packageName); icon.setImageDrawable(ApplicationsTracker.loadIcon(context, icon, item.packageName)); name = holder.getName(); name.setText(item.name); name.setChecked(item.enabled); return convertView; } } private class ViewHolder { private View view; private ImageView icon; private CheckedTextView name; public ViewHolder(View view) { this.view = view; } public ImageView getIcon() { if(icon == null) { icon = (ImageView) view.findViewById(R.id.select_apps_icon); } return icon; } public CheckedTextView getName() { if(name == null) { name = (CheckedTextView) view.findViewById(R.id.select_apps_name); } return name; } } }