OSDN Git Service

am b736868b: Merge "Fix NullPointerException in Bundle#hasFileDescriptors"
authorNarayan Kamath <narayan@google.com>
Tue, 28 Apr 2015 09:48:19 +0000 (09:48 +0000)
committerAndroid Git Automerger <android-git-automerger@android.com>
Tue, 28 Apr 2015 09:48:19 +0000 (09:48 +0000)
* commit 'b736868be917afd5d3ea7e8a8d3d658c4350a239':
  Fix NullPointerException in Bundle#hasFileDescriptors

1  2 
core/java/android/os/Bundle.java

@@@ -16,7 -16,6 +16,7 @@@
  
  package android.os;
  
 +import android.annotation.Nullable;
  import android.util.ArrayMap;
  import android.util.Size;
  import android.util.SizeF;
@@@ -25,6 -24,7 +25,6 @@@ import android.util.SparseArray
  import java.io.Serializable;
  import java.util.ArrayList;
  import java.util.List;
 -import java.util.Set;
  
  /**
   * A mapping from String values to various Parcelable types.
@@@ -211,8 -211,9 +211,9 @@@ public final class Bundle extends BaseB
                      } else if (obj instanceof Parcelable[]) {
                          Parcelable[] array = (Parcelable[]) obj;
                          for (int n = array.length - 1; n >= 0; n--) {
-                             if ((array[n].describeContents()
-                                     & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0) {
+                             Parcelable p = array[n];
+                             if (p != null && ((p.describeContents()
+                                     & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0)) {
                                  fdFound = true;
                                  break;
                              }
      }
  
      /**
 +     * Filter values in Bundle to only basic types.
 +     * @hide
 +     */
 +    public void filterValues() {
 +        unparcel();
 +        if (mMap != null) {
 +            for (int i = mMap.size() - 1; i >= 0; i--) {
 +                Object value = mMap.valueAt(i);
 +                if (PersistableBundle.isValidType(value)) {
 +                    continue;
 +                }
 +                if (value instanceof Bundle) {
 +                    ((Bundle)value).filterValues();
 +                }
 +                if (value.getClass().getName().startsWith("android.")) {
 +                    continue;
 +                }
 +                mMap.removeAt(i);
 +            }
 +        }
 +    }
 +
 +    /**
       * Inserts a byte value into the mapping of this Bundle, replacing
       * any existing value for the given key.
       *
       * @param value a byte
       */
      @Override
 -    public void putByte(String key, byte value) {
 +    public void putByte(@Nullable String key, byte value) {
          super.putByte(key, value);
      }
  
       * any existing value for the given key.
       *
       * @param key a String, or null
 -     * @param value a char, or null
 +     * @param value a char
       */
      @Override
 -    public void putChar(String key, char value) {
 +    public void putChar(@Nullable String key, char value) {
          super.putChar(key, value);
      }
  
       * @param value a short
       */
      @Override
 -    public void putShort(String key, short value) {
 +    public void putShort(@Nullable String key, short value) {
          super.putShort(key, value);
      }
  
       * @param value a float
       */
      @Override
 -    public void putFloat(String key, float value) {
 +    public void putFloat(@Nullable String key, float value) {
          super.putFloat(key, value);
      }
  
       * @param value a CharSequence, or null
       */
      @Override
 -    public void putCharSequence(String key, CharSequence value) {
 +    public void putCharSequence(@Nullable String key, @Nullable CharSequence value) {
          super.putCharSequence(key, value);
      }
  
       * @param key a String, or null
       * @param value a Parcelable object, or null
       */
 -    public void putParcelable(String key, Parcelable value) {
 +    public void putParcelable(@Nullable String key, @Nullable Parcelable value) {
          unparcel();
          mMap.put(key, value);
          mFdsKnown = false;
       * @param key a String, or null
       * @param value a Size object, or null
       */
 -    public void putSize(String key, Size value) {
 +    public void putSize(@Nullable String key, @Nullable Size value) {
          unparcel();
          mMap.put(key, value);
      }
       * @param key a String, or null
       * @param value a SizeF object, or null
       */
 -    public void putSizeF(String key, SizeF value) {
 +    public void putSizeF(@Nullable String key, @Nullable SizeF value) {
          unparcel();
          mMap.put(key, value);
      }
       * @param key a String, or null
       * @param value an array of Parcelable objects, or null
       */
 -    public void putParcelableArray(String key, Parcelable[] value) {
 +    public void putParcelableArray(@Nullable String key, @Nullable Parcelable[] value) {
          unparcel();
          mMap.put(key, value);
          mFdsKnown = false;
       * @param key a String, or null
       * @param value an ArrayList of Parcelable objects, or null
       */
 -    public void putParcelableArrayList(String key,
 -            ArrayList<? extends Parcelable> value) {
 +    public void putParcelableArrayList(@Nullable String key,
 +            @Nullable ArrayList<? extends Parcelable> value) {
          unparcel();
          mMap.put(key, value);
          mFdsKnown = false;
       * @param key a String, or null
       * @param value a SparseArray of Parcelable objects, or null
       */
 -    public void putSparseParcelableArray(String key,
 -            SparseArray<? extends Parcelable> value) {
 +    public void putSparseParcelableArray(@Nullable String key,
 +            @Nullable SparseArray<? extends Parcelable> value) {
          unparcel();
          mMap.put(key, value);
          mFdsKnown = false;
       * @param value an ArrayList<Integer> object, or null
       */
      @Override
 -    public void putIntegerArrayList(String key, ArrayList<Integer> value) {
 +    public void putIntegerArrayList(@Nullable String key, @Nullable ArrayList<Integer> value) {
          super.putIntegerArrayList(key, value);
      }
  
       * @param value an ArrayList<String> object, or null
       */
      @Override
 -    public void putStringArrayList(String key, ArrayList<String> value) {
 +    public void putStringArrayList(@Nullable String key, @Nullable ArrayList<String> value) {
          super.putStringArrayList(key, value);
      }
  
       * @param value an ArrayList<CharSequence> object, or null
       */
      @Override
 -    public void putCharSequenceArrayList(String key, ArrayList<CharSequence> value) {
 +    public void putCharSequenceArrayList(@Nullable String key,
 +            @Nullable ArrayList<CharSequence> value) {
          super.putCharSequenceArrayList(key, value);
      }
  
       * @param value a Serializable object, or null
       */
      @Override
 -    public void putSerializable(String key, Serializable value) {
 +    public void putSerializable(@Nullable String key, @Nullable Serializable value) {
          super.putSerializable(key, value);
      }
  
       * @param value a byte array object, or null
       */
      @Override
 -    public void putByteArray(String key, byte[] value) {
 +    public void putByteArray(@Nullable String key, @Nullable byte[] value) {
          super.putByteArray(key, value);
      }
  
       * @param value a short array object, or null
       */
      @Override
 -    public void putShortArray(String key, short[] value) {
 +    public void putShortArray(@Nullable String key, @Nullable short[] value) {
          super.putShortArray(key, value);
      }
  
       * @param value a char array object, or null
       */
      @Override
 -    public void putCharArray(String key, char[] value) {
 +    public void putCharArray(@Nullable String key, @Nullable char[] value) {
          super.putCharArray(key, value);
      }
  
       * @param value a float array object, or null
       */
      @Override
 -    public void putFloatArray(String key, float[] value) {
 +    public void putFloatArray(@Nullable String key, @Nullable float[] value) {
          super.putFloatArray(key, value);
      }
  
       * @param value a CharSequence array object, or null
       */
      @Override
 -    public void putCharSequenceArray(String key, CharSequence[] value) {
 +    public void putCharSequenceArray(@Nullable String key, @Nullable CharSequence[] value) {
          super.putCharSequenceArray(key, value);
      }
  
       * @param key a String, or null
       * @param value a Bundle object, or null
       */
 -    public void putBundle(String key, Bundle value) {
 +    public void putBundle(@Nullable String key, @Nullable Bundle value) {
          unparcel();
          mMap.put(key, value);
      }
       * @param key a String, or null
       * @param value an IBinder object, or null
       */
 -    public void putBinder(String key, IBinder value) {
 +    public void putBinder(@Nullable String key, @Nullable IBinder value) {
          unparcel();
          mMap.put(key, value);
      }
       * @hide This is the old name of the function.
       */
      @Deprecated
 -    public void putIBinder(String key, IBinder value) {
 +    public void putIBinder(@Nullable String key, @Nullable IBinder value) {
          unparcel();
          mMap.put(key, value);
      }
       * @return a CharSequence value, or null
       */
      @Override
 -    public CharSequence getCharSequence(String key) {
 +    @Nullable
 +    public CharSequence getCharSequence(@Nullable String key) {
          return super.getCharSequence(key);
      }
  
       *     if no valid CharSequence object is currently mapped to that key.
       */
      @Override
 -    public CharSequence getCharSequence(String key, CharSequence defaultValue) {
 +    public CharSequence getCharSequence(@Nullable String key, CharSequence defaultValue) {
          return super.getCharSequence(key, defaultValue);
      }
  
       * @param key a String, or null
       * @return a Size value, or null
       */
 -    public Size getSize(String key) {
 +    @Nullable
 +    public Size getSize(@Nullable String key) {
          unparcel();
          final Object o = mMap.get(key);
          try {
       * @param key a String, or null
       * @return a Size value, or null
       */
 -    public SizeF getSizeF(String key) {
 +    @Nullable
 +    public SizeF getSizeF(@Nullable String key) {
          unparcel();
          final Object o = mMap.get(key);
          try {
       * @param key a String, or null
       * @return a Bundle value, or null
       */
 -    public Bundle getBundle(String key) {
 +    @Nullable
 +    public Bundle getBundle(@Nullable String key) {
          unparcel();
          Object o = mMap.get(key);
          if (o == null) {
       * @param key a String, or null
       * @return a Parcelable value, or null
       */
 -    public <T extends Parcelable> T getParcelable(String key) {
 +    @Nullable
 +    public <T extends Parcelable> T getParcelable(@Nullable String key) {
          unparcel();
          Object o = mMap.get(key);
          if (o == null) {
       * @param key a String, or null
       * @return a Parcelable[] value, or null
       */
 -    public Parcelable[] getParcelableArray(String key) {
 +    @Nullable
 +    public Parcelable[] getParcelableArray(@Nullable String key) {
          unparcel();
          Object o = mMap.get(key);
          if (o == null) {
       * @param key a String, or null
       * @return an ArrayList<T> value, or null
       */
 -    public <T extends Parcelable> ArrayList<T> getParcelableArrayList(String key) {
 +    @Nullable
 +    public <T extends Parcelable> ArrayList<T> getParcelableArrayList(@Nullable String key) {
          unparcel();
          Object o = mMap.get(key);
          if (o == null) {
       *
       * @return a SparseArray of T values, or null
       */
 -    public <T extends Parcelable> SparseArray<T> getSparseParcelableArray(String key) {
 +    @Nullable
 +    public <T extends Parcelable> SparseArray<T> getSparseParcelableArray(@Nullable String key) {
          unparcel();
          Object o = mMap.get(key);
          if (o == null) {
       * @return a Serializable value, or null
       */
      @Override
 -    public Serializable getSerializable(String key) {
 +    @Nullable
 +    public Serializable getSerializable(@Nullable String key) {
          return super.getSerializable(key);
      }
  
       * @return an ArrayList<String> value, or null
       */
      @Override
 -    public ArrayList<Integer> getIntegerArrayList(String key) {
 +    @Nullable
 +    public ArrayList<Integer> getIntegerArrayList(@Nullable String key) {
          return super.getIntegerArrayList(key);
      }
  
       * @return an ArrayList<String> value, or null
       */
      @Override
 -    public ArrayList<String> getStringArrayList(String key) {
 +    @Nullable
 +    public ArrayList<String> getStringArrayList(@Nullable String key) {
          return super.getStringArrayList(key);
      }
  
       * @return an ArrayList<CharSequence> value, or null
       */
      @Override
 -    public ArrayList<CharSequence> getCharSequenceArrayList(String key) {
 +    @Nullable
 +    public ArrayList<CharSequence> getCharSequenceArrayList(@Nullable String key) {
          return super.getCharSequenceArrayList(key);
      }
  
       * @return a byte[] value, or null
       */
      @Override
 -    public byte[] getByteArray(String key) {
 +    @Nullable
 +    public byte[] getByteArray(@Nullable String key) {
          return super.getByteArray(key);
      }
  
       * @return a short[] value, or null
       */
      @Override
 -    public short[] getShortArray(String key) {
 +    @Nullable
 +    public short[] getShortArray(@Nullable String key) {
          return super.getShortArray(key);
      }
  
       * @return a char[] value, or null
       */
      @Override
 -    public char[] getCharArray(String key) {
 +    @Nullable
 +    public char[] getCharArray(@Nullable String key) {
          return super.getCharArray(key);
      }
  
       * @return a float[] value, or null
       */
      @Override
 -    public float[] getFloatArray(String key) {
 +    @Nullable
 +    public float[] getFloatArray(@Nullable String key) {
          return super.getFloatArray(key);
      }
  
       * @return a CharSequence[] value, or null
       */
      @Override
 -    public CharSequence[] getCharSequenceArray(String key) {
 +    @Nullable
 +    public CharSequence[] getCharSequenceArray(@Nullable String key) {
          return super.getCharSequenceArray(key);
      }
  
       * @param key a String, or null
       * @return an IBinder value, or null
       */
 -    public IBinder getBinder(String key) {
 +    @Nullable
 +    public IBinder getBinder(@Nullable String key) {
          unparcel();
          Object o = mMap.get(key);
          if (o == null) {
       * @hide This is the old name of the function.
       */
      @Deprecated
 -    public IBinder getIBinder(String key) {
 +    @Nullable
 +    public IBinder getIBinder(@Nullable String key) {
          unparcel();
          Object o = mMap.get(key);
          if (o == null) {