content: /*----------------------------------------------------------------------------+
   *|                                                                           |
   *|                          Android's Hooker                                 |
   *|                                                                           |
   *+---------------------------------------------------------------------------+
   *| Copyright (C) 2011 Georges Bossert and Dimitri Kirchner                   |
   *| This program 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.                                       |
   *|                                                                           |
   *| This program 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 this program. If not, see <http://www.gnu.org/licenses/>.      |
   *+---------------------------------------------------------------------------+
   *| @url      : http://www.amossys.fr                                         |
   *| @contact  : android-hooker@amossys.fr                                     |
   *| @sponsors : Amossys, http://www.amossys.fr                                |
   *+---------------------------------------------------------------------------+
   */
   
  package com.amossys.hooker.hookers;
  
  import java.util.HashMap;
  import java.util.Map;
  
  import com.amossys.hooker.SubstrateMain;
  import com.amossys.hooker.exceptions.HookerInitializationException;
  
  /**
   * @author Georges Bossert
   * 
   */
  public class GeolocationDataHooker extends Hooker {
  
    /**
     * Name of the hooker
     */
    private static final String NAME_HOOKER = "Geolocation";
  
    /**
     * @param name
     */
    public GeolocationDataHooker() {
      super(NAME_HOOKER);
    }
  
    /*
     * (non-Javadoc)
     * 
     * @see com.amossys.hooker.hookers.Hooker#attach()
     */
    @Override
    public void attach() {
  
      this.attachOnLocationClass();
      
      this.attachOnGpsSatelliteClass();
  
      this.attachOnLocationManagerClass();    
      
    }
  
    /**
     * Hook calls to specific methods of the LocationManager class
     */
    private void attachOnLocationManagerClass() {
      Map<String, Integer> methodsFromLocationToHook = new HashMap<String, Integer>();
      methodsFromLocationToHook.put("getLastKnownLocation", 1);    
      
      try {
        hookMethods(null, "android.location.LocationManager",
            methodsFromLocationToHook);
        SubstrateMain.log("hooking android.location.LocationManager methods sucessful");
  
      } catch (HookerInitializationException e) {
        SubstrateMain.log("hooking android.location.LocationManager methods has failed", e);
      }
      
    }
  
    /**
     * Hook calls to specific methods of the GpsSatellite class
     */
    private void attachOnGpsSatelliteClass() {
      Map<String, Integer> methodsFromLocationToHook = new HashMap<String, Integer>();
      methodsFromLocationToHook.put("getAzimuth", 1);    
      methodsFromLocationToHook.put("getElevation", 1);    
      methodsFromLocationToHook.put("getPrn", 0);    
      methodsFromLocationToHook.put("getSnr()", 0);    
      methodsFromLocationToHook.put("hasAlmanac", 0);    
      methodsFromLocationToHook.put("hasEphemeris", 0);
      
      try {
        hookMethods(null, "android.location.GpsSatellite",
            methodsFromLocationToHook);
        SubstrateMain.log("hooking android.location.GpsSatellite methods sucessful");
  
      } catch (HookerInitializationException e) {
        SubstrateMain.log("hooking android.location.GpsSatellite methods has failed", e);
      }
      
    }
  
    /**
     * Hook calls to specific methods of the location class
     */
    private void attachOnLocationClass() {
      Map<String, Integer> methodsFromLocationToHook = new HashMap<String, Integer>();
      methodsFromLocationToHook.put("getBearing", 1);
      
      methodsFromLocationToHook.put("getLatitude", 1);
      methodsFromLocationToHook.put("setLatitude", 2);
      
      methodsFromLocationToHook.put("getLongitude", 1);
      methodsFromLocationToHook.put("setLongitude", 2);
      
      methodsFromLocationToHook.put("getAltitude", 1);
      methodsFromLocationToHook.put("setAltitude", 2);
      
      methodsFromLocationToHook.put("getSpeed", 1);
      methodsFromLocationToHook.put("SetSpeed", 2);
      
      methodsFromLocationToHook.put("getTime", 1);
      methodsFromLocationToHook.put("setTime", 2);
      
      methodsFromLocationToHook.put("hasBearing", 0);
      methodsFromLocationToHook.put("hasAccuracy", 0);
      methodsFromLocationToHook.put("hasAltitude", 0);
      methodsFromLocationToHook.put("hasSpeed", 0);
  
      try {
        hookMethods(null, "android.location.Location",
            methodsFromLocationToHook);
        SubstrateMain.log("hooking android.location.Location methods sucessful");
  
      } catch (HookerInitializationException e) {
        SubstrateMain.log("hooking android.location.Location methods has failed", e);
      }
    }
  
  }
  