diff options
author | Jon Boekenoogen <jboekeno@google.com> | 2013-06-25 15:41:03 -0700 |
---|---|---|
committer | Jon Boekenoogen <jboekeno@google.com> | 2013-06-26 13:19:42 -0700 |
commit | 03e9d1058a5f759d0e356563d7e8499ff71b5165 (patch) | |
tree | 411b3a854468ce4ccc29844dec37ae6861647889 | |
parent | 6c4c3319fa919150b321c8b89987c86fbeeea2c0 (diff) | |
download | robolectric-03e9d1058a5f759d0e356563d7e8499ff71b5165.tar.gz |
Fix resource loading in robolectric for API 18+.
Look at resource folders in the SDK starting at 18 and continue
backwards for 5 sdk versions.
Bug: 9573511
Change-Id: Ib1f92a247e572be41c4a74ba0556988ae306a0ea
-rw-r--r-- | src/main/java/com/xtremelabs/robolectric/res/ResourceLoader.java | 87 |
1 files changed, 47 insertions, 40 deletions
diff --git a/src/main/java/com/xtremelabs/robolectric/res/ResourceLoader.java b/src/main/java/com/xtremelabs/robolectric/res/ResourceLoader.java index 90b788882..aa067f0ca 100644 --- a/src/main/java/com/xtremelabs/robolectric/res/ResourceLoader.java +++ b/src/main/java/com/xtremelabs/robolectric/res/ResourceLoader.java @@ -1,5 +1,12 @@ package com.xtremelabs.robolectric.res; +import static com.xtremelabs.robolectric.Robolectric.shadowOf; + +import com.xtremelabs.robolectric.Robolectric; +import com.xtremelabs.robolectric.shadows.ShadowContextWrapper; +import com.xtremelabs.robolectric.util.I18nException; +import com.xtremelabs.robolectric.util.PropertiesHelper; + import android.R; import android.content.Context; import android.graphics.drawable.AnimationDrawable; @@ -10,16 +17,18 @@ import android.text.TextUtils; import android.view.Menu; import android.view.View; import android.view.ViewGroup; -import com.xtremelabs.robolectric.Robolectric; -import com.xtremelabs.robolectric.shadows.ShadowContextWrapper; -import com.xtremelabs.robolectric.util.I18nException; -import com.xtremelabs.robolectric.util.PropertiesHelper; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.lang.reflect.Field; -import java.util.*; - -import static com.xtremelabs.robolectric.Robolectric.shadowOf; +import java.util.HashSet; +import java.util.Properties; +import java.util.Set; public class ResourceLoader { private static final FileFilter MENU_DIR_FILE_FILTER = new FileFilter() { @@ -262,18 +271,32 @@ public class ResourceLoader { } private String getPathToAndroidResources() { - String resourcePath; - if ( ( resourcePath = getAndroidResourcePathFromLocalProperties() ) != null ) { - return resourcePath; - } else if ( ( resourcePath = getAndroidResourcePathFromSystemEnvironment() ) != null ) { - return resourcePath; - } else if ( ( resourcePath = getAndroidResourcePathFromSystemProperty() ) != null ) { - return resourcePath; - } else if ( ( resourcePath = getAndroidResourcePathByExecingWhichAndroid() ) != null ) { - return resourcePath; + String resFolder = getAndroidResourcePathFromLocalProperties + if (resFolder == null) { + resFolder = getAndroidResourcePathFromSystemEnvironment(); + if (resFolder == null) { + resFolder = getAndroidResourcePathFromSystemProperty(); + if (resFolder == null) { + resFolder = getAndroidResourcePathByExecingWhichAndroid(); + } + } + } + + // Go through last 5 sdk versions looking for resource folders. + if (resFolder != null) { + for (int i = sdkVersion; i >= sdkVersion - 5 && i >= 4; i--) { + File resourcePath = new File(resFolder, getAndroidResourceSubPath(i)); + if (resourcePath.exists()) { + return resourcePath.getAbsolutePath(); + } else { + System.out.println("WARNING: Unable to find Android resources at: " + + resourcePath.toString() + " continuing."); + } + } + } else { + System.out.println("WARNING: Unable to find path to Android SDK"); } - System.out.println( "WARNING: Unable to find path to Android SDK" ); return null; } @@ -291,10 +314,7 @@ public class ResourceLoader { try { localProperties.load( new FileInputStream( localPropertiesFile ) ); PropertiesHelper.doSubstitutions( localProperties ); - String sdkPath = localProperties.getProperty( "sdk.dir" ); - if ( sdkPath != null ) { - return getResourcePathFromSdkPath( sdkPath ); - } + return localProperties.getProperty( "sdk.dir" ); } catch ( IOException e ) { // fine, we'll try something else } @@ -304,20 +324,12 @@ public class ResourceLoader { private String getAndroidResourcePathFromSystemEnvironment() { // Hand tested - String resourcePath = System.getenv().get( "ANDROID_HOME" ); - if ( resourcePath != null ) { - return new File( resourcePath, getAndroidResourceSubPath() ).toString(); - } - return null; + return System.getenv().get( "ANDROID_HOME" ); } private String getAndroidResourcePathFromSystemProperty() { // this is used by the android-maven-plugin - String resourcePath = System.getProperty( "android.sdk.path" ); - if ( resourcePath != null ) { - return new File( resourcePath, getAndroidResourceSubPath() ).toString(); - } - return null; + return System.getProperty( "android.sdk.path" ); } private String getAndroidResourcePathByExecingWhichAndroid() { @@ -328,7 +340,7 @@ public class ResourceLoader { Process process = Runtime.getRuntime().exec( new String[] { "which", "android" } ); String sdkPath = new BufferedReader( new InputStreamReader( process.getInputStream() ) ).readLine(); if ( sdkPath != null && sdkPath.endsWith( "tools/android" ) ) { - return getResourcePathFromSdkPath( sdkPath.substring( 0, sdkPath.indexOf( "tools/android" ) ) ); + return sdkPath.substring(0, sdkPath.indexOf( "tools/android")); } } catch ( IOException e ) { // fine we'll try something else @@ -336,13 +348,8 @@ public class ResourceLoader { return null; } - private String getResourcePathFromSdkPath( String sdkPath ) { - File androidResourcePath = new File( sdkPath, getAndroidResourceSubPath() ); - return androidResourcePath.exists() ? androidResourcePath.toString() : null; - } - - private String getAndroidResourceSubPath() { - return "platforms/android-" + sdkVersion + "/data/res"; + private static String getAndroidResourceSubPath(int version) { + return "platforms/android-" + version + "/data/res"; } static boolean isLayoutDirectory( String path ) { |