/* This file is part of ZAX. ZAX 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. ZAX 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 ZAX. If not, see <http://www.gnu.org/licenses/>. */ package com.inovex.zabbixmobile.activities; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.net.Uri; import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.PreferenceManager; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; import com.google.android.gms.common.GooglePlayServicesUtil; import com.inovex.zabbixmobile.R; import com.inovex.zabbixmobile.model.ZaxPreferences; import com.inovex.zabbixmobile.push.gcm.RegistrationIntentService; import com.inovex.zabbixmobile.push.pubnub.PubnubPushService; import com.inovex.zabbixmobile.widget.WidgetUpdateBroadcastReceiver; /** * The preference activity. * */ public class ZaxPreferenceActivity extends PreferenceActivity implements OnSharedPreferenceChangeListener { private static final int REQUEST_CODE_PREFERENCES_THEMED = 958723; private static final String ARG_ACTIVITY_RESULT = "ACTIVITY_RESULT"; public static final int PREFERENCES_CHANGED_SERVER = 1; public static final int PREFERENCES_CHANGED_PUSH = 2; public static final int PREFERENCES_CHANGED_WIDGET = 4; public static final int PREFERENCES_CHANGED_THEME = 8; private ZaxPreferences mPrefs; private int activityResult = 0; private Toolbar mToolbar; private String TAG = "ZaxPreferenceActivity"; // We use the deprecated method because it is compatible to old Android // versions. @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { mPrefs = ZaxPreferences.getInstance(getApplicationContext()); if (mPrefs.isDarkTheme()) setTheme(R.style.AppThemeDark); else setTheme(R.style.AppTheme); super.onCreate(savedInstanceState); // the activity might have been started with a result code which we need // to adopt activityResult = getIntent().getIntExtra(ARG_ACTIVITY_RESULT, activityResult); addPreferencesFromResource(R.xml.preferences); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); LinearLayout root = (LinearLayout)findViewById(android.R.id.list).getParent().getParent().getParent(); Toolbar bar = (Toolbar) LayoutInflater.from(this).inflate(R.layout.toolbar_main, root, false); bar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha); bar.setTitle(getString(R.string.preferences)); root.addView(bar, 0); // insert at top bar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); } @Override protected void onStop() { super.onStop(); } @Override public void onBackPressed() { setResult(activityResult, new Intent()); finish(); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: setResult(activityResult, new Intent()); finish(); return true; } return super.onOptionsItemSelected(item); } @Override protected void onResume() { super.onResume(); mPrefs.registerOnSharedPreferenceChangeListener(this); setPreferenceSummaries(); } private void setPreferenceSummaries() { PreferenceManager preferenceManager = getPreferenceManager(); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); preferenceManager.findPreference("gcm_sender_id").setSummary(sharedPreferences.getString("gcm_sender_id", "")); preferenceManager.findPreference("gcm_server_url").setSummary(sharedPreferences.getString("gcm_server_url", "")); preferenceManager.findPreference("pubnub_push_subscribe_key").setSummary(sharedPreferences.getString("pubnub_push_subscribe_key", "")); } @Override protected void onPause() { super.onPause(); mPrefs.unregisterOnSharedPreferenceChangeListener(this); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { Intent intent; String gcm_sender_id = sharedPreferences.getString("gcm_sender_id", ""); String gcm_server_url = sharedPreferences.getString("gcm_server_url", ""); switch (key){ case "pubnub_push_enabled": // show hint for pubsub configuration if (mPrefs.isPushEnabled() && sharedPreferences.getBoolean("show_push_info",true)) { showConfigInfo(); sharedPreferences.edit().putBoolean("show_push_info",false).apply(); } case "pubnub_push_subscribe_key": // if(sharedPreferences.getString("pubnub_push_subscribe_key","").length() == 0){ // showSettingsIncompleteInfo(); // } case "zabbix_push_ringtone": case "zabbix_push_old_icons": activityResult |= PREFERENCES_CHANGED_PUSH; getPreferenceManager().findPreference("pubnub_push_subscribe_key").setSummary(sharedPreferences.getString("pubnub_push_subscribe_key","")); if (!mPrefs.isPushEnabled() || mPrefs.getPushSubscribeKey().length() > 0) { PubnubPushService.startOrStopPushService(getApplicationContext()); } break; case "widget_refresh_interval_mins": activityResult |= PREFERENCES_CHANGED_WIDGET; intent = new Intent(getApplicationContext(), WidgetUpdateBroadcastReceiver.class); intent.putExtra(WidgetUpdateBroadcastReceiver.REFRESH_RATE_CHANGED, true); this.sendBroadcast(intent); break; case "dark_theme": activityResult |= PREFERENCES_CHANGED_THEME; // we start a new preference activity with changed theme intent = getIntent(); // we have to pass through the result code intent.putExtra(ARG_ACTIVITY_RESULT, activityResult); // finish(); startActivityForResult(intent, REQUEST_CODE_PREFERENCES_THEMED); overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); break; case "gcm_push_enabled": activityResult |= PREFERENCES_CHANGED_PUSH; if(sharedPreferences.getBoolean("gcm_push_enabled",false)){ sharedPreferences.edit().putBoolean("show_push_info",false).apply(); Dialog dialog = GooglePlayServicesUtil.getErrorDialog( GooglePlayServicesUtil.isGooglePlayServicesAvailable(this) , this, 0); boolean sentTokenToServer = sharedPreferences.getBoolean("sent_token_to_server", false); if(dialog == null){ // play services are available if(gcm_sender_id.length() > 0 && gcm_server_url.length() > 0){ if(!sentTokenToServer){ // if not already registered intent = new Intent(this,RegistrationIntentService.class); intent.setAction("register"); startService(intent); } else { Log.d(TAG, "already sent Token to server"); } } else { // at least on of sender_id and server_url are not configured // handled in preference onchangelistener } } else { // show PlayServices unavailable dialog dialog.show(); } if(sharedPreferences.getBoolean("show_push_info",true)){ showConfigInfo(); } } else { intent = new Intent(this,RegistrationIntentService.class); intent.setAction("unregister"); startService(intent); } break; case "gcm_sender_id": getPreferenceManager().findPreference("gcm_sender_id").setSummary(gcm_sender_id); getPreferenceManager().findPreference("gcm_server_url").setSummary(gcm_server_url); activityResult |= PREFERENCES_CHANGED_PUSH; intent = new Intent(this,RegistrationIntentService.class); intent.setAction("unregister"); startService(intent); if(gcm_sender_id.length() > 0 && gcm_server_url.length() > 0){ intent = new Intent(this,RegistrationIntentService.class); intent.setAction("register"); startService(intent); } else { // configuration incomplete // showSettingsIncompleteInfo(); } break; } } private void showSettingsIncompleteInfo() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage( R.string.settings_incomplete) .setCancelable(false) .setNegativeButton("Ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { setPreferenceScreen(null); addPreferencesFromResource(R.xml.preferences); setPreferenceSummaries(); dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); } private void showConfigInfo() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage( R.string.push_dialog_info) .setCancelable(false) .setPositiveButton("View Howto in Browser", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { Intent viewIntent = new Intent( "android.intent.action.VIEW", Uri.parse("http://inovex.github.io/zax/#howto_push")); startActivity(viewIntent); } }) .setNegativeButton("Ok", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); AlertDialog alert = builder.create(); alert.show(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // BaseActivity expects a result code, so we pass it through from the // started themed preference activity if (requestCode == REQUEST_CODE_PREFERENCES_THEMED) { setResult(resultCode, new Intent()); finish(); } } }