package ru.shutoff.cgstarter; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.AsyncTask; import android.os.Bundle; import android.provider.Settings; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.Vector; public class NotificationFragment extends PreferencesFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View v = inflater.inflate(R.layout.notification_setup, container, false); setCheckBox(v, R.id.show_sms, State.SHOW_SMS); if (isNotificationEnabled()) { v.findViewById(R.id.disable).setVisibility(View.GONE); String[] ignored = preferences.getString(State.NOTIFICATION_IGNORE, "").split(":"); String res = null; PackageManager pm = getActivity().getPackageManager(); for (String ignore : ignored) { try { ApplicationInfo appInfo = pm.getApplicationInfo(ignore, 0); String title = pm.getApplicationLabel(appInfo).toString(); if (res == null) { res = title; } else { res += "\n" + title; } } catch (Exception ex) { // ignore } } final TextView tv = (TextView) v.findViewById(R.id.ignored); if (res != null) tv.setText(res); v.findViewById(R.id.enable).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setIgnore(tv); } }); } else { v.findViewById(R.id.enable).setVisibility(View.GONE); } setSeekBar(v, R.id.time, R.id.time_msg, R.string.notification_time, State.NOTIFICATION, 10, 1); return v; } boolean isNotificationEnabled() { int accessibilityEnabled = 0; final String NOTIFICATION_SERVICE = "ru.shutoff.cgstarter/ru.shutoff.cgstarter.NotificationService"; boolean accessibilityFound = false; try { accessibilityEnabled = Settings.Secure.getInt(getActivity().getContentResolver(), android.provider.Settings.Secure.ACCESSIBILITY_ENABLED); } catch (Settings.SettingNotFoundException e) { // ignore } if (accessibilityEnabled == 1) { String settingValue = Settings.Secure.getString(getActivity().getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); if (settingValue != null) { TextUtils.SimpleStringSplitter splitter = new TextUtils.SimpleStringSplitter(':'); splitter.setString(settingValue); while (splitter.hasNext()) { String accessabilityService = splitter.next(); if (accessabilityService.equalsIgnoreCase(NOTIFICATION_SERVICE)) { return true; } } } } return accessibilityFound; } void setIgnore(final TextView tv) { final Set<String> selected_packages = new HashSet<String>(); String[] ignored = preferences.getString(State.NOTIFICATION_IGNORE, "").split(":"); for (String ignore : ignored) { selected_packages.add(ignore); } final LayoutInflater inflater = (LayoutInflater) getActivity().getSystemService(Activity.LAYOUT_INFLATER_SERVICE); final AlertDialog dialog = new AlertDialog.Builder(getActivity()) .setTitle(R.string.notification_ignore) .setView(inflater.inflate(R.layout.list, null)) .setNegativeButton(R.string.cancel, null) .setPositiveButton(R.string.ok, null) .create(); dialog.show(); final PackageManager pm = getActivity().getPackageManager(); AsyncTask<Void, Void, Vector<Package>> task = new AsyncTask<Void, Void, Vector<Package>>() { @Override protected Vector<Package> doInBackground(Void... params) { List<PackageInfo> pkg_info = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS); final Vector<Package> packages = new Vector<Package>(); for (PackageInfo info : pkg_info) { Package p = new Package(); p.name = info.packageName; p.title = info.packageName; try { ApplicationInfo appInfo = pm.getApplicationInfo(p.name, 0); p.title = pm.getApplicationLabel(appInfo).toString(); } catch (Exception ex) { // ignore } packages.add(p); } Collections.sort(packages, new Comparator<Package>() { @Override public int compare(Package lhs, Package rhs) { return lhs.title.compareTo(rhs.title); } }); return packages; } @Override protected void onPostExecute(final Vector<Package> packages) { ListView list = (ListView) dialog.findViewById(R.id.list); list.setVisibility(View.VISIBLE); dialog.findViewById(R.id.progress).setVisibility(View.GONE); list.setAdapter(new BaseAdapter() { @Override public int getCount() { return packages.size(); } @Override public Object getItem(int position) { return packages.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) v = inflater.inflate(R.layout.package_item, null); TextView tvName = (TextView) v.findViewById(R.id.name); Package p = packages.get(position); tvName.setText(p.title); ImageView ivIcon = (ImageView) v.findViewById(R.id.icon); try { ivIcon.setImageDrawable(pm.getApplicationIcon(packages.get(position).name)); ivIcon.setVisibility(View.VISIBLE); } catch (Exception ex) { ivIcon.setVisibility(View.GONE); } CheckBox check = (CheckBox) v.findViewById(R.id.checked); check.setTag(p.name); check.setChecked(selected_packages.contains(p.name)); check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { String name = (String) buttonView.getTag(); if (isChecked) { selected_packages.add(name); } else { selected_packages.remove(name); } } }); v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { CheckBox check = (CheckBox) v.findViewById(R.id.checked); check.setChecked(!check.isChecked()); } }); return v; } }); } }; task.execute(); dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String value = null; String res = null; for (String val : selected_packages) { if (value == null) { value = val; } else { value += ":" + val; } try { ApplicationInfo appInfo = pm.getApplicationInfo(val, 0); String title = pm.getApplicationLabel(appInfo).toString(); if (res == null) { res = title; } else { res += "\n" + title; } } catch (Exception ex) { // ignore } } if (value == null) value = ""; if (res == null) res = ""; tv.setText(res); SharedPreferences.Editor ed = preferences.edit(); ed.putString(State.NOTIFICATION_IGNORE, value); ed.commit(); dialog.dismiss(); } }); } static class Package { String name; String title; } }