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.service.utils;
  
  import android.content.Context;
  import android.content.IntentFilter;
  import android.telephony.TelephonyManager;
  import android.text.TextUtils;
  
  import com.vodafone360.people.database.DatabaseHelper;
  import com.vodafone360.people.datatypes.LoginDetails;
  import com.vodafone360.people.engine.EngineManager;
  import com.vodafone360.people.engine.login.LoginEngine;
  import com.vodafone360.people.service.ServiceStatus;
  import com.vodafone360.people.service.receivers.SimStateReceiver;
  import com.vodafone360.people.utils.LogUtils;
  import com.vodafone360.people.utils.LoginPreferences;
  import com.vodafone360.people.utils.SimCard;
  
  /**
   * The UserDataProtection is responsible of putting in place mechanisms that will guarantee
   * the User data safety.
   * 
   * The case to watch are the following:
   * -User uses SIM card A to log in 360 then restarting the device with SIM card B or without a SIM
   *  card will automatically log out from the 360 client.
   * -User uses no SIM card to log in 360 then restarting the device with a SIM card will automatically
   *  log out from the 360 client.
   */
  public class UserDataProtection implements SimStateReceiver.Listener {
      
      /**
       * The Service context.
       */
      private Context mContext;
      
      /**
       * The DatabaseHelper used for our database access.
       */
      private DatabaseHelper mDatabaseHelper;
      
      /**
       * The BroadcastReceiver listening for SIM states changes.
       */
      private SimStateReceiver mSimStateReceiver;
      
      /**
       * The UserDataProtection constructor.
       * 
       * @param context the Service context
       * @param databaseHelper the DatabaseHelper
       */
      public UserDataProtection(Context context, DatabaseHelper databaseHelper) {
          
          mContext = context;
          mDatabaseHelper = databaseHelper;
      }
      
      /**
       * Performs the checks needed when the 360 Service is started.
       * 
       * This method checks if the user has changed and if the SIM card id cannot be read, sets a
       * SIM state changes listener.
       */
      public void performStartupChecks() {
          
          LogUtils.logD("UserDataProtection.performStartupChecks()");
              
          final int simState = SimCard.getState(mContext);
              
          if (simState == TelephonyManager.SIM_STATE_ABSENT || simState == TelephonyManager.SIM_STATE_READY) {
                  
              processUserChanges();
          } else {
                  
              LogUtils.logD("UserDataProtection.performStartupChecks() - SIM_STATE_UNKNOWN, register a SimStateReceiver.");
              // SIM is not ready, register a listener for Sim state changes to check
              // the subscriber id when possible
              mSimStateReceiver = new SimStateReceiver(this);
              mContext.registerReceiver(mSimStateReceiver, new IntentFilter(SimStateReceiver.INTENT_SIM_STATE_CHANGED));
          }
      }
      
      /**
       * Requests to log out from 360 if the user has changed.
       */
      public void processUserChanges() {
  
          LogUtils.logD("UserDataProtection.checkUserChanges()");
          
          final LoginEngine loginEngine = EngineManager.getInstance().getLoginEngine();
          
          if (hasUserChanged()) {
  
               if (loginEngine.isLoggedIn()) {
                   // User has changed, log out
                  LogUtils.logD("UserDataProtection.checkUserChanges() - User has changed! Request logout.");
                  loginEngine.addUiRemoveUserDataRequest();
              } else {
                  LoginPreferences.clearPreferencesFile(mContext);
              }
              
          }
      }
      
      /**
       * Unregister the SIM state changes receiver.
       */
      public void unregisterSimStateReceiver() {
          
          if (mSimStateReceiver != null) {
              
              LogUtils.logD("UserDataProtection.checkUserChanges() - unregister the SimStateReceiver");
              mContext.unregisterReceiver(mSimStateReceiver);
              mSimStateReceiver = null;
          }
      }
      
      /**
       * Check wether or not the User has changed.
       * 
       * @return true if the current User is different, false otherwise
       */
      public boolean hasUserChanged() {
          
          final String loginSubscriberId = getSubscriberIdForLogin();
          final String currentSuscriberId = SimCard.getSubscriberId(mContext);
          return !TextUtils.equals(loginSubscriberId, currentSuscriberId);
      }
      
      /**
       * Gets the Subscriber Id used to log in 360.
       * 
       * @param databaseHelper the DatabaseHelper
       * @return the Subscriber Id used to log in 360, null if there was a problem while retrieving it
       */
      public String getSubscriberIdForLogin() {
          
          final LoginDetails mLoginDetails = new LoginDetails();
          final ServiceStatus mServiceStatus = mDatabaseHelper.fetchLogonCredentials(mLoginDetails);
  
          if (mServiceStatus == ServiceStatus.SUCCESS) {
              return mLoginDetails.mSubscriberId;
          }
          
          return null;
      }
  
      /**
       * @see SimStateReceiver.Listener#onSimReadyState()
       */
      @Override
      public void onSimReadyState() {
          
          processUserChanges();
          unregisterSimStateReceiver();
      }
  }
  