/src/main/java/com/xtremelabs/robolectric/shadows/ShadowContext.java

https://github.com/shazam/robolectric · Java · 201 lines · 161 code · 31 blank · 9 comment · 17 complexity · 3aacfe890a662224abf22e041f17a857 MD5 · raw file

  1. package com.xtremelabs.robolectric.shadows;
  2. import android.app.Application;
  3. import android.content.Context;
  4. import android.content.res.Resources;
  5. import android.content.res.TypedArray;
  6. import android.util.AttributeSet;
  7. import com.xtremelabs.robolectric.Robolectric;
  8. import com.xtremelabs.robolectric.internal.Implementation;
  9. import com.xtremelabs.robolectric.internal.Implements;
  10. import com.xtremelabs.robolectric.internal.RealObject;
  11. import com.xtremelabs.robolectric.res.ResourceLoader;
  12. import java.io.File;
  13. import java.io.FileInputStream;
  14. import java.io.FileNotFoundException;
  15. import java.io.FileOutputStream;
  16. import java.io.IOException;
  17. import static com.xtremelabs.robolectric.Robolectric.shadowOf;
  18. /**
  19. * Calls through to the {@code resourceLoader} to actually load resources.
  20. */
  21. @SuppressWarnings({"UnusedDeclaration"})
  22. @Implements(Context.class)
  23. abstract public class ShadowContext {
  24. public static final File CACHE_DIR = createTempDir("android-cache");
  25. public static final File EXTERNAL_CACHE_DIR = createTempDir("android-external-cache");
  26. public static final File FILES_DIR = createTempDir("android-tmp");
  27. public static final File EXTERNAL_FILES_DIR = createTempDir("android-external-files");
  28. public static final File DATABASE_DIR = createTempDir("android-database");
  29. @RealObject private Context realContext;
  30. @Implementation
  31. public File getDir(String name, int mode) {
  32. // TODO: honor operating mode.
  33. File file = new File(FILES_DIR, name);
  34. if (!file.exists()) {
  35. file.mkdir();
  36. }
  37. return file;
  38. }
  39. @Implementation
  40. public String getString(int resId) {
  41. return realContext.getResources().getString(resId);
  42. }
  43. @Implementation
  44. public CharSequence getText(int resId) {
  45. return realContext.getResources().getText(resId);
  46. }
  47. @Implementation
  48. public String getString(int resId, Object... formatArgs) {
  49. return realContext.getResources().getString(resId, formatArgs);
  50. }
  51. @Implementation
  52. abstract public Resources.Theme getTheme();
  53. @Implementation
  54. public final TypedArray obtainStyledAttributes(int[] attrs) {
  55. return getTheme().obtainStyledAttributes(attrs);
  56. }
  57. @Implementation
  58. public final TypedArray obtainStyledAttributes(int resid, int[] attrs) throws Resources.NotFoundException {
  59. return getTheme().obtainStyledAttributes(resid, attrs);
  60. }
  61. @Implementation
  62. public final TypedArray obtainStyledAttributes(AttributeSet set, int[] attrs) {
  63. TypedArray result = Robolectric.newInstanceOf(TypedArray.class);
  64. if (attrs == null) {
  65. return result;
  66. }
  67. if( set == null ){
  68. return getTheme().obtainStyledAttributes( attrs );
  69. }
  70. ShadowTypedArray styledAttributes = Robolectric.shadowOf(result);
  71. for(int attr : attrs) {
  72. styledAttributes.add(set.getAttributeValue(attr));
  73. }
  74. return result;
  75. }
  76. @Implementation
  77. public final TypedArray obtainStyledAttributes(
  78. AttributeSet set, int[] attrs, int defStyleAttr, int defStyleRes) {
  79. return getTheme().obtainStyledAttributes(
  80. set, attrs, defStyleAttr, defStyleRes);
  81. }
  82. @Implementation
  83. public File getCacheDir() {
  84. CACHE_DIR.mkdirs();
  85. return CACHE_DIR;
  86. }
  87. @Implementation
  88. public File getFilesDir() {
  89. FILES_DIR.mkdirs();
  90. return FILES_DIR;
  91. }
  92. @Implementation
  93. public String[] fileList() {
  94. return getFilesDir().list();
  95. }
  96. @Implementation
  97. public File getDatabasePath(String name) {
  98. DATABASE_DIR.mkdirs();
  99. return new File(DATABASE_DIR, name);
  100. }
  101. @Implementation
  102. public File getExternalCacheDir() {
  103. EXTERNAL_CACHE_DIR.mkdir();
  104. return EXTERNAL_CACHE_DIR;
  105. }
  106. @Implementation
  107. public File getExternalFilesDir(String type) {
  108. File f = (type == null) ? EXTERNAL_FILES_DIR : new File( EXTERNAL_FILES_DIR, type );
  109. f.mkdirs();
  110. return f;
  111. }
  112. @Implementation
  113. public FileInputStream openFileInput(String path) throws FileNotFoundException {
  114. return new FileInputStream(getFileStreamPath(path));
  115. }
  116. @Implementation
  117. public FileOutputStream openFileOutput(String path, int mode) throws FileNotFoundException {
  118. return new FileOutputStream(getFileStreamPath(path));
  119. }
  120. @Implementation
  121. public File getFileStreamPath(String name) {
  122. if (name.contains(File.separator)) {
  123. throw new IllegalArgumentException("File " + name + " contains a path separator");
  124. }
  125. return new File(getFilesDir(), name);
  126. }
  127. @Implementation
  128. public boolean deleteFile(String name) {
  129. return getFileStreamPath(name).delete();
  130. }
  131. /**
  132. * Non-Android accessor.
  133. *
  134. * @return the {@code ResourceLoader} associated with this {@code Context}
  135. */
  136. public ResourceLoader getResourceLoader() {
  137. return shadowOf((Application) realContext.getApplicationContext()).getResourceLoader();
  138. }
  139. public static void clearFilesAndCache() {
  140. clearFiles(FILES_DIR);
  141. clearFiles(CACHE_DIR);
  142. clearFiles(EXTERNAL_CACHE_DIR);
  143. clearFiles(EXTERNAL_FILES_DIR);
  144. clearFiles(DATABASE_DIR);
  145. }
  146. public static void clearFiles(File dir) {
  147. if (dir != null && dir.isDirectory()) {
  148. File[] files = dir.listFiles();
  149. if (files != null) {
  150. for (File f : files) {
  151. if (f.isDirectory()) {
  152. clearFiles(f);
  153. }
  154. f.delete();
  155. }
  156. }
  157. }
  158. }
  159. private static File createTempDir(String name) {
  160. try {
  161. File tmp = File.createTempFile(name, "robolectric");
  162. if (!tmp.delete()) throw new IOException("could not delete "+tmp);
  163. if (!tmp.mkdirs()) throw new IOException("could not create "+tmp);
  164. tmp.deleteOnExit();
  165. return tmp;
  166. } catch (IOException e) {
  167. throw new RuntimeException(e);
  168. }
  169. }
  170. }