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 dalvik.system.PathClassLoader;
  import android.content.Context;
  import android.content.pm.PackageManager.NameNotFoundException;
  import android.os.Build;
  
  public class VersionUtils {
  
      /**
       * Static Platform Version Code field.
       * Build.VERSION.SDK has existed since the first version of Android.
       * Even though its deprecated it should still be good to use
       */
      private static final int PLATFORM_VERSION_CODE = Integer.parseInt(Build.VERSION.SDK);
      
      /**
       * Mapping version value directly from Android Documentation. 
       * This is done because platforms with versions below wont have the constant defined. 
       */
      private static final int ANDROID16_VERSION = 4; 
      
      /**
       * Path to the HTC Contacts Application Apk on Sense enabled HTC devices.
       */
      private static final String HTC_CONTACTS_APK_PATH = "/system/app/HtcContacts.apk";
      
      /**
       * Known HTC Class in the HTC Contacts Application.
       */
      private static final String KNOWN_HTC_CONTACTS_CLASS = 
          "com.android.htccontacts.HtcContactInfoBase";
      
      /**
       * True, if we already tested for HTC Sense.
       */
      private static boolean sWasHtcSenseTested = false;
  
      /**
       * True, if device is HTC Sense.
       */
      private static boolean sIsHtcSenseDevice = false;
  
      /**
       * Returns the Platform Version Code.
       * @return Platform Version Code
       */
      public static int getPlatformVersionCode() {
          return PLATFORM_VERSION_CODE;
      }
      
      /**
       * Checks if the device platform Version is in the 2.X version range.
       * @return true if running on a 2.X Platform, false if not    
       */
      public static boolean is2XPlatform() {
          // If a 3X Platform comes along we need to update this code
          return PLATFORM_VERSION_CODE > ANDROID16_VERSION;
      }
      
      /**
       * Checks if we are currently on a HTC device with HTC Sense enabled.
       * This method simply looks for a class that we know of. 
       * However, this flawed as it uses hard-coded Strings.
       * 
       * TODO: Use a non hard-coded way to detect these devices
       * TODO: This function leaks memory. 
       *       The created class and loader instances are not removed by GC. 
       *       After ~200 calls we get an OutOfMemoryException. 
       *       Workaround: Test just once and remember outcome.
       * 
       * @param context Context needed for fetching Class Loader
       */
      public static boolean isHtcSenseDevice(Context context) {
         	// We already know?
      	if (!sWasHtcSenseTested) {
      		sWasHtcSenseTested = true;
  
      		try {
  	            // No we don't. Search for HTC Contacts Application class (HTC Sense)
  	            PathClassLoader classLoader =  new PathClassLoader(HTC_CONTACTS_APK_PATH,
  	            		context.getClassLoader());
  	            Class.forName(KNOWN_HTC_CONTACTS_CLASS, true, classLoader);
  	            
  	            sIsHtcSenseDevice = true;
              } 
              catch(Exception ex) {
              	sIsHtcSenseDevice = false;
              }
         	}
      	return sIsHtcSenseDevice;
      }
      
      /**
       * Returns the version name from the AndroidManifest.xml file.
       * 
       * @param context Android context.
       * @return Version name as an integer, or "" if name not found.
       */
      public static String getPackageVersionName(Context context) {
          try {
              return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
          } catch (NameNotFoundException e) {
              LogUtils.logE("VersionUtils.getPackageVersionName() "
                      + "NameNotFoundException returning empty String", e);
              return "";
          }
      }
  
      /**
       * Returns the version code from the AndroidManifest.xml file
       * 
       * @param context Android context.
       * @return Version code as an integer, or "" if name not found.
       */
      public static int getPackageVersionCode(Context context) {
          try {
              return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;
          } catch (NameNotFoundException e) {
              LogUtils.logE("VersionUtils.getPackageVersionCode() NameNotFoundException return -1", e);
              return -1;
          }
      }
  }
  