fi.iki.murgo.irssinotifier.SettingsActivity.java Source code

Java tutorial

Introduction

Here is the source code for fi.iki.murgo.irssinotifier.SettingsActivity.java

Source

package fi.iki.murgo.irssinotifier;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceCategory;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import org.apache.http.auth.AuthenticationException;
import yuku.ambilwarna.AmbilWarnaDialog;

import java.io.IOException;

@SuppressWarnings("deprecation")
public class SettingsActivity extends PreferenceActivity {
    private static final String TAG = SettingsActivity.class.getName();
    protected static final int ICB_HOST_REQUEST_CODE = 666;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "Opened settings");
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.preference_screen);

        final Context ctx = this;

        final CheckBoxPreference enabled = (CheckBoxPreference) findPreference("NotificationsEnabled");
        enabled.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                final boolean checked = (Boolean) newValue;
                String s = "Disabling notifications...";
                if (checked) {
                    s = "Enabling notifications...";
                }

                SettingsSendingTask task = new SettingsSendingTask(SettingsActivity.this, "Sending settings", s);
                task.setCallback(new Callback<ServerResponse>() {
                    @Override
                    public void doStuff(ServerResponse result) {
                        if (result.getException() != null) {
                            if (result.getException() instanceof IOException) {
                                MessageBox.Show(ctx, "Network error",
                                        "Ensure your internet connection works and try again.", null);
                            } else if (result.getException() instanceof AuthenticationException) {
                                MessageBox.Show(ctx, "Authentication error", "Unable to authenticate to server.",
                                        null);
                            } else if (result.getException() instanceof ServerException) {
                                MessageBox.Show(ctx, "Server error",
                                        "Mystical server error, check if updates are available", null);
                            } else {
                                MessageBox.Show(ctx, null,
                                        "Unable to send settings to the server! Please try again later!", null);
                            }
                            enabled.setChecked(!checked);
                        }
                    }
                });

                task.execute();

                return true;
            }
        });

        Preference aboutPref = findPreference("about");
        aboutPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
            public boolean onPreferenceClick(Preference preference) {
                Intent i = new Intent(ctx, AboutActivity.class);
                startActivity(i);

                finish();
                return true;
            }
        });

        Preference channelsPref = findPreference("channels");
        channelsPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
            public boolean onPreferenceClick(Preference preference) {
                Intent i = new Intent(ctx, ChannelSettingsActivity.class);
                startActivity(i);
                return true;
            }
        });

        ListPreference mode = (ListPreference) findPreference("notificationModeString");
        mode.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                NotificationMode m = NotificationMode.PerChannel;
                String v = (String) newValue;
                if (v.equals(ctx.getResources().getStringArray(R.array.notification_modes)[0]))
                    m = NotificationMode.Single;
                if (v.equals(ctx.getResources().getStringArray(R.array.notification_modes)[1]))
                    m = NotificationMode.PerChannel;
                if (v.equals(ctx.getResources().getStringArray(R.array.notification_modes)[2]))
                    m = NotificationMode.PerMessage;

                Preferences p = new Preferences(ctx);
                p.setNotificationMode(m);
                return true;
            }
        });

        Preference initialSettingsPref = findPreference("redoInitialSettings");
        initialSettingsPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
            public boolean onPreferenceClick(Preference preference) {
                Preferences prefs = new Preferences(ctx);
                prefs.setAuthToken(null);
                prefs.setAccountName(null);
                prefs.setGcmRegistrationId(null);
                prefs.setLicenseCount(0);

                IrssiNotifierActivity.refreshIsNeeded();
                finish();
                return true;
            }
        });

        Preference disableThemePref = findPreference("ThemeDisabled");
        disableThemePref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
            public boolean onPreferenceClick(Preference preference) {
                IrssiNotifierActivity.refreshIsNeeded();
                return true;
            }
        });

        handleColorPicker();

        handleIcb();

        if (!LicenseHelper.isPlusVersion(this)) {
            CheckBoxPreference usePullMechanismPref = (CheckBoxPreference) findPreference("UsePullMechanism");
            usePullMechanismPref.setSummary(usePullMechanismPref.getSummary() + ". Only in Plus version.");
            usePullMechanismPref.setEnabled(false);
            usePullMechanismPref.setChecked(false);
        }
    }

    private void handleColorPicker() {
        Preference colorPickerPref = findPreference("PickCustomLightColor");
        colorPickerPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(final Preference preference) {
                final Context ctx = SettingsActivity.this;

                final Preferences preferences = new Preferences(ctx);
                final int color = preferences.getCustomLightColor();

                NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx);
                builder.setSmallIcon(R.drawable.notification_icon);
                builder.setTicker("Preview selected color");
                builder.setAutoCancel(false);
                builder.setOngoing(false);
                builder.setContentText("Wait for the screen to turn off to see selected light color in action");
                builder.setContentTitle("Preview light color");
                builder.setContentIntent(PendingIntent.getActivity(getApplicationContext(), 0, new Intent(), 0));
                builder.setLights(color, 300, 5000);

                final Notification notification = builder.build();
                final NotificationManager notificationManager = (NotificationManager) ctx
                        .getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.notify(666, notification);

                final AmbilWarnaDialog dialog = new AmbilWarnaDialog(ctx, color,
                        new AmbilWarnaDialog.OnAmbilWarnaListener() {
                            @Override
                            public void onCancel(AmbilWarnaDialog dialog) {
                                notificationManager.cancel(666);
                            }

                            @Override
                            public void onOk(AmbilWarnaDialog dialog, int color) {
                                notificationManager.cancel(666);
                                preferences.setCustomLightColor(color);
                            }

                            @Override
                            public void onColorChanged(AmbilWarnaDialog dialog, int color) {
                                notification.ledARGB = color;
                                notificationManager.notify(666, notification);
                            }
                        });

                dialog.show();

                return true;
            }
        });
    }

    private void handleIcb() {
        CheckBoxPreference showIcbIconPreference = (CheckBoxPreference) findPreference("IcbEnabled");
        if (!IntentSniffer.isPackageAvailable(this, IrssiConnectbotLauncher.PACKAGE_IRSSICONNECTBOT)) {
            PreferenceCategory icbCategory = (PreferenceCategory) findPreference("IcbCategory");
            icbCategory.setEnabled(false);

            showIcbIconPreference.setChecked(false);
            showIcbIconPreference.setSummary("Install Irssi ConnectBot to show it in the action bar");
        } else {
            showIcbIconPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    IrssiNotifierActivity.refreshIsNeeded();

                    return true;
                }
            });

            Preference icbHostPref = findPreference("IcbHost");

            Preferences prefs = new Preferences(this);
            String hostName = prefs.getIcbHostName();

            String summary = "Select which Irssi ConnectBot host to open when pressing the ICB icon";
            if (hostName != null)
                summary += ". Currently selected host: " + hostName;
            icbHostPref.setSummary(summary);

            icbHostPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                public boolean onPreferenceClick(Preference preference) {
                    Intent i = new Intent("android.intent.action.PICK");
                    i.setClassName(IrssiConnectbotLauncher.PACKAGE_IRSSICONNECTBOT,
                            IrssiConnectbotLauncher.PACKAGE_IRSSICONNECTBOT + ".HostListActivity");
                    startActivityForResult(i, ICB_HOST_REQUEST_CODE);
                    return true;
                }
            });
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode != ICB_HOST_REQUEST_CODE) {
            return;
        }

        Preferences prefs = new Preferences(this);

        if (data == null || resultCode != Activity.RESULT_OK) {
            prefs.setIcbHost(null, null);
        } else {
            String hostName = data.getStringExtra(Intent.EXTRA_SHORTCUT_NAME);
            Intent intent = (Intent) data.getExtras().get(Intent.EXTRA_SHORTCUT_INTENT);
            if (intent != null) {
                String intentUri = intent.toUri(0);
                prefs.setIcbHost(hostName, intentUri);
            } else {
                prefs.setIcbHost(null, null);
            }
        }

        handleIcb();
    }
}