content: /*
   * CDDL HEADER START
   *
   * The contents of this file are subject to the terms of the Common Development
   * and Distribution License (the "License").
   * You may not use this file except in compliance with the License.
   *
   * You can obtain a copy of the license at
   * src/com/vodafone360/people/VODAFONE.LICENSE.txt or
   * http://github.com/360/360-Engine-for-Android
   * See the License for the specific language governing permissions and
   * limitations under the License.
   *
   * When distributing Covered Code, include this CDDL HEADER in each file and
   * include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt.
   * If applicable, add the following below this CDDL HEADER, with the fields
   * enclosed by brackets "[]" replaced with your own identifying information:
   * Portions Copyright [yyyy] [name of copyright owner]
   *
   * CDDL HEADER END
   *
   * Copyright 2010 Vodafone Sales & Services Ltd.  All rights reserved.
   * Use is subject to license terms.
   */
  
  package com.vodafone360.people.utils;
  
  import java.io.File;
  import java.util.Calendar;
  import java.util.GregorianCalendar;
  
  import android.content.Context;
  import android.content.SharedPreferences;
  
  import com.vodafone360.people.ApplicationCache;
  import com.vodafone360.people.datatypes.LoginDetails;
  import com.vodafone360.people.utils.LogUtils;
  
  /***
   * Store various preferences used during login in a preferences file. TODO:
   * Requires some refactoring to clear up underutilised variables.
   */
  public class LoginPreferences {
  
      public final static String STORE_PROGRESS = "progress";
  
      private final static String PREFS_PATH = "/data/data/com.vodafone360.people/shared_prefs/";
  
      private final static String SIGNUP_EMAIL_ADDRESS = "SIGNUP_EMAIL_ADDRESS";
  
      private final static String SIGNUP_FIRSTNAME = "SIGNUP_FIRSTNAME";
  
      private final static String SIGNUP_LASTNAME = "SIGNUP_LASTNAME";
  
      private final static String SIGNUP_DOB_DAY = "SIGNUP_DOB_DAY";
  
      private final static String SIGNUP_DOB_MONTH = "SIGNUP_DOB_MONTH";
  
      private final static String SIGNUP_DOB_YEAR = "SIGNUP_DOB_YEAR";
  
      private final static String MOBILE_NUMBER = "MOBILE";
  
      private final static String USERNAME = "USERNAME";
  
      private final static String PASSWORD = "PASSWORD";
  
      private final static String LAST_LOGIN_SCREEN = "NOWPLUS_SCREEN";
  
      private final static String XML_FILE_EXTENSION = ".xml";
  
      /*
       * Account creation
       */
      // Signup
      private static String sSignupFirstName = "";
  
      private static String sSignupLastName = "";
  
      private static String sSignupEmailAddress = "";
  
      private static volatile GregorianCalendar sDateOfBirth = null;
  
      // Login
      private static String sMobileNumber = "";
  
      private static String sPassword = "";
  
      private static String sUsername = "";
  
      // TODO: Why are we storing this information twice?
      private static LoginDetails sLoginDetails = new LoginDetails();
  
      /**
       * Retrieves the name of the current login activity. Also retrieves login
       * details from the preferences so that the same screen is displayed when
       * the user re-enters the wizard.
       * 
       * @param context - Android context.
       * @return The name of the current login wizard activity
       */
      public static String getCurrentLoginActivity(Context context) {
          LogUtils.logV("ApplicationCache.getCurrentLoginActivity()");
          SharedPreferences preferences = context
                  .getSharedPreferences(ApplicationCache.PREFS_FILE, 0);
  
          // Load sign up settings
          sSignupEmailAddress = preferences.getString(SIGNUP_EMAIL_ADDRESS, "");
          sSignupFirstName = preferences.getString(SIGNUP_FIRSTNAME, "");
          sSignupLastName = preferences.getString(SIGNUP_LASTNAME, "");
          if (preferences.contains(SIGNUP_DOB_DAY)) {
              setSignupDateOfBirth(
                      preferences.getInt(SIGNUP_DOB_DAY, -1),
                      preferences.getInt(SIGNUP_DOB_MONTH, -1),
                      preferences.getInt(SIGNUP_DOB_YEAR, -1));            
          }
  
          // Load login Settings
          sMobileNumber = preferences.getString(MOBILE_NUMBER, "");
          sUsername = preferences.getString(USERNAME, "");
          sPassword = preferences.getString(PASSWORD, "");
  
          // Return current screen
          return preferences.getString(LAST_LOGIN_SCREEN, "");
      }
  
      /**
       * Stores the name of the current login activity. Also stores the login
       * details in the preferences so that they can be retrieved when the user
       * has been diverted away from the login wizard.
       * 
       * @param loginScreenName The name of the current login wizard activity.
       */
      public static void setCurrentLoginActivity(String loginScreenName, Context context) {
          LogUtils.logV("MainApplication.setCurrentLoginActivity() loginScreenName["
                  + loginScreenName + "]");
          SharedPreferences.Editor editor = context.getSharedPreferences(ApplicationCache.PREFS_FILE,
                  0).edit();
  
          // Save log in screen name.
          editor.putString(LAST_LOGIN_SCREEN, loginScreenName);
  
          // Save sign up settings.
          editor.putString(SIGNUP_EMAIL_ADDRESS, sSignupEmailAddress);
          editor.putString(SIGNUP_FIRSTNAME, sSignupFirstName);
          editor.putString(SIGNUP_LASTNAME, sSignupLastName);
          editor.putInt(SIGNUP_DOB_DAY, sDateOfBirth != null ? sDateOfBirth
                  .get(Calendar.DAY_OF_MONTH) : -1);
          editor.putInt(SIGNUP_DOB_MONTH, sDateOfBirth != null ? sDateOfBirth.get(Calendar.MONTH)
                  : -1);
          editor.putInt(SIGNUP_DOB_YEAR, sDateOfBirth != null ? sDateOfBirth.get(Calendar.YEAR) : -1);
  
          // Save login settings.
          editor.putString(MOBILE_NUMBER, sMobileNumber);
          editor.putString(USERNAME, sUsername);
          editor.putString(PASSWORD, sPassword);
  
          if (!editor.commit()) {
              throw new NullPointerException("MainApplication.setCurrentLoginActivity() Failed to"
                      + " set current login activity");
          }
      }
  
      /**
       * Clear cached login details.
       */
      public static void clearCachedLoginDetails() {
          // Clear sign up settings.
          sSignupEmailAddress = "";
          sSignupFirstName = "";
          sSignupLastName = "";
          sDateOfBirth = null;
  
          // Clear login settings.
          sMobileNumber = "";
          sUsername = "";
          sPassword = "";
  
          sLoginDetails = new LoginDetails();
      }
  
      /**
       * Store current login details.
       * 
       * @param loginDetails Current login details.
       */
      public static void setLoginDetails(LoginDetails loginDetails) {
          sLoginDetails = loginDetails;
      }
  
      /**
       * Re-initialise login details currently held in application cache.
       */
      public static void initLoginDetails() {
          sLoginDetails = new LoginDetails();
      }
  
      /**
       * Gets the current set of login parameters.
       * 
       * @return current login details.
       */
      public static LoginDetails getLoginDetails() {
          return sLoginDetails;
      }
  
      /**
       * Gets the current login password.
       * 
       * @return The current user entered login password.
       */
      public static String getPassword() {
          return sPassword;
      }
  
      /**
       * Sets the current login password.
       * 
       * @param aPassword login password
       */
      public static void setPassword(String aPassword) {
          sPassword = aPassword;
      }
  
      /**
       * Gets the current login user name.
       * 
       * @return The current user entered login user name.
       */
      public static String getUsername() {
          return sUsername;
      }
  
      /**
       * Sets the current login user name.
       * 
       * @param username login user name
       */
      public static void setUsername(String username) {
          sUsername = username;
      }
  
      /**
       * Gets the current login mobile number.
       * 
       * @return The current user entered login password
       */
      public static String getMobileNumber() {
          return sMobileNumber;
      }
  
      /**
       * Sets the current login mobile number.
       * 
       * @param mobileNumber login mobile number
       */
      public static void setMobileNumber(String mobileNumber) {
          sMobileNumber = mobileNumber;
      }
  
      /**
       * Sets the current account creation email address.
       * 
       * @param aEmailAddress account signup email address
       */
      public static void setSignupEmailAddress(String aEmailAddress) {
          sSignupEmailAddress = aEmailAddress;
      }
  
      /**
       * Retrieves the current account creation email address.
       * 
       * @return Currently stored account creation email address
       */
      public static String getSignupEmailAddress() {
          return sSignupEmailAddress;
      }
  
      /**
       * Sets the current account creation first name.
       * 
       * @param aFirstName account creation first name
       */
      public static void setSignupFirstName(String aFirstName) {
          sSignupFirstName = aFirstName;
      }
  
      /**
       * Sets the current account creation last name.
       * 
       * @param aLastName account creation last name
       */
      public static void setSignupLastName(String aLastName) {
          sSignupLastName = aLastName;
      }
  
      /**
       * Retrieves the current account creation first name.
       * 
       * @return Current account creation first name
       */
      public static String getSignupFirstName() {
          return sSignupFirstName;
      }
  
      /**
       * Retrieves the current account creation last name.
       * 
       * @return Current account creation last name
       */
      public static String getSignupLastName() {
          return sSignupLastName;
      }
  
      /**
       * Return the date of birth from current account details.
       * 
       * @return Date containing date of birth
       */
      public static GregorianCalendar getSignupDateOfBirth() {
          if (sDateOfBirth != null) {
              LogUtils.logV("MainApplication.getSignupDateOfBirth() mDateOfBirth["
                      + sDateOfBirth.toString() + "]");
          } else {
              LogUtils.logV("MainApplication.getSignupDateOfBirth() mDateOfBirth is NULL");
          }
          return sDateOfBirth;
      }
  
      /**
       * Set date of birth for current account.
       * 
       * @param day Date of birth within month.
       * @param month Month of birth
       * @param year Year of birth
       */
      public static void setSignupDateOfBirth(int day, int month, int year) {
          LogUtils.logV("MainApplication.setSignupDateOfBirth() DOB: " + day + " " + month + " "
                  + year);
          if (day < 0 || month < 0 || year < 0) {
              return;
          }
          
          if (sDateOfBirth == null) {
              sDateOfBirth = new GregorianCalendar(year, month, day);
          }
        
          sDateOfBirth.set(year, month, day);
      }
  
      /**
       * reset object of GregorianCalendar to be null when user input invalid
       * birthday date in signup screen.
       */
      public static void resetSignupDateOfBirth() {
          sDateOfBirth = null;
      }
  
      /**
       * Clears all details stored in the preferences.
       */
      public static void clearPreferencesFile(Context context) {
          LogUtils.logV("MainApplication.clearPreferencesFile()");
          SharedPreferences.Editor editor = context.getSharedPreferences(ApplicationCache.PREFS_FILE,
                  0).edit();
          editor.clear();
          if (editor.commit()) {
              LogUtils.logV("MainApplication.clearPreferencesFile() All preferences cleared");
          } else {
              LogUtils.logE("MainApplication.clearPreferencesFile() Failed to clear preferences");
          }
  
          // TODO: Is is necessary to delete the original file?
          // Login details are stored in the preferences file below so that
          // they can be used to pre-populate the edit fields if the
          // user is interrupted in the middle of login/signup
          // Delete this file as this function is called by remove user data
          // functionality
          if (!new File(PREFS_PATH + ApplicationCache.PREFS_FILE + XML_FILE_EXTENSION).delete()) {
              LogUtils.logE("LoginPreferences.clearPreferencesFile(context) failed");
          }
      }
  }
  