@Override
  public void endElement(String localName) {
    super.endElement(localName);
    try {
      if (mPreferences != null) {
        // we are inside <global_preferences>
        if (localName.equalsIgnoreCase("global_preferences")) {
          // Closing tag of <global_preferences> - nothing to do at the moment
        } else if (localName.equalsIgnoreCase("day_prefs")) {
          // closing <day_prefs>
          if (mDayOfWeek >= 0 && mDayOfWeek <= 6) {
            mPreferences.cpu_times.week_prefs[mDayOfWeek] = mTempCpuTimeSpan;
            mPreferences.net_times.week_prefs[mDayOfWeek] = mTempNetTimeSpan;
          }

          mTempCpuTimeSpan = null;
          mTempNetTimeSpan = null;
          mInsideDayPrefs = false;
        } else if (mInsideDayPrefs) {
          if (localName.equalsIgnoreCase("day_of_week")) {
            mDayOfWeek = Integer.parseInt(getCurrentElement());
          } else if (localName.equalsIgnoreCase("start_hour")) {
            if (mTempCpuTimeSpan == null) mTempCpuTimeSpan = new TimePreferences.TimeSpan();
            mTempCpuTimeSpan.start_hour = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("end_hour")) {
            if (mTempCpuTimeSpan == null) mTempCpuTimeSpan = new TimePreferences.TimeSpan();
            mTempCpuTimeSpan.end_hour = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("net_start_hour")) {
            if (mTempNetTimeSpan == null) mTempNetTimeSpan = new TimePreferences.TimeSpan();
            mTempNetTimeSpan.start_hour = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("net_end_hour")) {
            if (mTempNetTimeSpan == null) mTempNetTimeSpan = new TimePreferences.TimeSpan();
            mTempNetTimeSpan.end_hour = Double.parseDouble(getCurrentElement());
          }
        } else {
          // Not the closing tag - we decode possible inner tags
          if (localName.equalsIgnoreCase("run_on_batteries")) {
            mPreferences.run_on_batteries = Integer.parseInt(getCurrentElement()) != 0;
          } else if (localName.equalsIgnoreCase("run_gpu_if_user_active")) {
            mPreferences.run_gpu_if_user_active = Integer.parseInt(getCurrentElement()) != 0;
          } else if (localName.equalsIgnoreCase("run_if_user_active")) {
            mPreferences.run_if_user_active = Integer.parseInt(getCurrentElement()) != 0;
          } else if (localName.equalsIgnoreCase("idle_time_to_run")) {
            mPreferences.idle_time_to_run = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("suspend_cpu_usage")) {
            mPreferences.suspend_cpu_usage = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("leave_apps_in_memory")) {
            mPreferences.leave_apps_in_memory = Integer.parseInt(getCurrentElement()) != 0;
          } else if (localName.equalsIgnoreCase("dont_verify_images")) {
            mPreferences.dont_verify_images = Integer.parseInt(getCurrentElement()) != 0;
          } else if (localName.equalsIgnoreCase("work_buf_min_days")) {
            mPreferences.work_buf_min_days = Double.parseDouble(getCurrentElement());
            if (mPreferences.work_buf_min_days < 0.00001) mPreferences.work_buf_min_days = 0.00001;
          } else if (localName.equalsIgnoreCase("work_buf_additional_days")) {
            mPreferences.work_buf_additional_days = Double.parseDouble(getCurrentElement());
            if (mPreferences.work_buf_additional_days < 0.0)
              mPreferences.work_buf_additional_days = 0.0;
          } else if (localName.equalsIgnoreCase("max_ncpus_pct")) {
            mPreferences.max_ncpus_pct = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("cpu_scheduling_period_minutes")) {
            mPreferences.cpu_scheduling_period_minutes = Double.parseDouble(getCurrentElement());
            if (mPreferences.cpu_scheduling_period_minutes < 0.00001)
              mPreferences.cpu_scheduling_period_minutes = 60;
          } else if (localName.equalsIgnoreCase("disk_interval")) {
            mPreferences.disk_interval = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("disk_max_used_gb")) {
            mPreferences.disk_max_used_gb = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("disk_max_used_pct")) {
            mPreferences.disk_max_used_pct = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("disk_min_free_gb")) {
            mPreferences.disk_min_free_gb = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("ram_max_used_busy_pct")) {
            mPreferences.ram_max_used_busy_frac = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("ram_max_used_idle_pct")) {
            mPreferences.ram_max_used_idle_frac = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("max_bytes_sec_up")) {
            mPreferences.max_bytes_sec_up = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("max_bytes_sec_down")) {
            mPreferences.max_bytes_sec_down = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("cpu_usage_limit")) {
            mPreferences.cpu_usage_limit = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("daily_xfer_limit_mb")) {
            mPreferences.daily_xfer_limit_mb = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("daily_xfer_period_days")) {
            mPreferences.daily_xfer_period_days = Integer.parseInt(getCurrentElement());
          } else if (localName.equalsIgnoreCase("run_if_battery_nl_than")) {
            mPreferences.run_if_battery_nl_than = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("run_if_temp_lt_than")) {
            mPreferences.run_if_temp_lt_than = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("start_hour")) {
            mPreferences.cpu_times.start_hour = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("end_hour")) {
            mPreferences.cpu_times.end_hour = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("net_start_hour")) {
            mPreferences.net_times.start_hour = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("net_end_hour")) {
            mPreferences.net_times.end_hour = Double.parseDouble(getCurrentElement());
          } else if (localName.equalsIgnoreCase("run_always_when_plugged")) {
            mPreferences.run_always_when_plugged = Integer.parseInt(getCurrentElement()) != 0;
          } else if (localName.equalsIgnoreCase("xfer_only_when_wifi")) {
            mPreferences.xfer_only_when_wifi = Integer.parseInt(getCurrentElement()) != 0;
          }
        }
      }
    } catch (NumberFormatException e) {
      if (Logging.INFO) Log.i(TAG, "Exception when decoding " + localName);
    }
  }