Compare commits

...

8 Commits

Author SHA1 Message Date
Travis Burtrum e5e1d5adc2 Update build for gradle 2.4 2015-10-01 00:51:44 -04:00
mar-v-in 2408cfd92a Update tools to 22.0.1 2015-04-15 01:11:26 +02:00
mar-v-in d7b18b0673 Java 6 compat 2015-04-13 23:49:44 +02:00
mar-v-in b49d1095fd Increase version number 2015-04-11 13:44:59 +02:00
mar-v-in 26d9c42977 Release 1.1.0 2015-04-11 13:39:51 +02:00
mar-v-in 7d4dec14e8 Fix Parcelable[] 2015-04-11 11:43:28 +02:00
mar-v-in 982f1e1285 Add support for byte[] 2015-04-11 11:04:52 +02:00
mar-v-in aba4c3bb89 Prepare next version 2015-03-29 21:10:53 +02:00
5 changed files with 49 additions and 25 deletions

View File

@ -3,17 +3,17 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
classpath 'com.android.tools.build:gradle:1.3.1'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
}
}
apply plugin: 'com.android.library'
apply from: 'gradle-mvn-push.gradle'
group = 'org.microg'
version = '1.0.0'
apply plugin: 'com.github.dcendents.android-maven'
android {
compileSdkVersion 22
buildToolsVersion "22.0.0"
buildToolsVersion "22.0.1"
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_6
}
}

View File

@ -1,6 +1,6 @@
GROUP=org.microg
POM_ARTIFACT_ID=safe-parcel
VERSION_NAME=1.0.0
VERSION_NAME=1.2-SNAPSHOT
POM_NAME=µg SafeParcel
POM_DESCRIPTION=Easy-to-use implementation of the "SafeParcel" format used for IPC in Play Services

View File

@ -1,4 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="org.microg.safeparcel">
<!-- This is not needed, it's just here to stop build systems from complaining -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.microg.safeparcel">
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="22" />
</manifest>

View File

@ -170,6 +170,16 @@ public class SafeParcelReader {
return arr;
}
public static byte[] readByteArray(Parcel parcel, int position) {
int length = readStart(parcel, position);
int start = parcel.dataPosition();
if (length == 0)
return null;
byte[] arr = parcel.createByteArray();
parcel.setDataPosition(start + length);
return arr;
}
public static void skip(Parcel parcel, int position) {
int i = readStart(parcel, position);
parcel.setDataPosition(parcel.dataPosition() + i);

View File

@ -7,7 +7,6 @@ import android.util.Log;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -27,7 +26,7 @@ public class SafeParcelUtil {
return t;
} catch (NoSuchMethodException e) {
throw new RuntimeException("createObject() requires a default constructor");
} catch (InvocationTargetException | InstantiationException | IllegalAccessException e) {
} catch (Exception e) {
throw new RuntimeException("Can't construct object", e);
}
}
@ -56,7 +55,7 @@ public class SafeParcelUtil {
if (object == null)
throw new NullPointerException();
Class clazz = object.getClass();
Map<Integer, Field> fieldMap = new HashMap<>();
Map<Integer, Field> fieldMap = new HashMap<Integer, Field>();
while (clazz != null) {
for (Field field : clazz.getDeclaredFields()) {
if (field.isAnnotationPresent(SafeParceled.class)) {
@ -96,14 +95,19 @@ public class SafeParcelUtil {
}
}
private static Parcelable.Creator getCreator(Field field)
throws IllegalAccessException {
try {
return (Parcelable.Creator) field.getType().getDeclaredField("CREATOR").get(null);
} catch (NoSuchFieldException e) {
throw new RuntimeException(
field.getType() + " is an Parcelable without CREATOR");
private static Parcelable.Creator getCreator(Field field) throws IllegalAccessException {
Class clazz = field.getType();
if (clazz.isArray()) {
clazz = clazz.getComponentType();
}
if (Parcelable.class.isAssignableFrom(clazz)) {
try {
return (Parcelable.Creator) clazz.getDeclaredField("CREATOR").get(null);
} catch (NoSuchFieldException e) {
throw new RuntimeException(clazz + " is an Parcelable without CREATOR");
}
}
throw new RuntimeException(clazz + " is not an Parcelable");
}
private static ClassLoader getClassLoader(Field field) {
@ -141,6 +145,9 @@ public class SafeParcelUtil {
case StringArray:
SafeParcelWriter.write(parcel, num, (String[]) field.get(object), mayNull);
break;
case ByteArray:
SafeParcelWriter.write(parcel, num, (byte[]) field.get(object), mayNull);
break;
case Integer:
SafeParcelWriter.write(parcel, num, (Integer) field.get(object));
break;
@ -168,12 +175,10 @@ public class SafeParcelUtil {
field.setAccessible(true);
switch (SafeParcelType.fromClass(field.getType())) {
case Parcelable:
field.set(object, SafeParcelReader
.readParcelable(parcel, position, getCreator(field)));
field.set(object, SafeParcelReader.readParcelable(parcel, position, getCreator(field)));
break;
case Binder:
field.set(object, SafeParcelReader.readBinder(parcel,
position));
field.set(object, SafeParcelReader.readBinder(parcel, position));
break;
case List:
field.set(object, SafeParcelReader.readList(parcel, position, getClassLoader(field)));
@ -184,6 +189,9 @@ public class SafeParcelUtil {
case StringArray:
field.set(object, SafeParcelReader.readStringArray(parcel, position));
break;
case ByteArray:
field.set(object, SafeParcelReader.readByteArray(parcel, position));
break;
case Integer:
field.set(object, SafeParcelReader.readInt(parcel, position));
break;
@ -206,7 +214,7 @@ public class SafeParcelUtil {
}
private enum SafeParcelType {
Parcelable, Binder, List, ParcelableArray, StringArray,
Parcelable, Binder, List, ParcelableArray, StringArray, ByteArray,
Integer, Long, Boolean, Float, Double, String;
public static SafeParcelType fromClass(Class clazz) {
@ -214,6 +222,8 @@ public class SafeParcelUtil {
return ParcelableArray;
if (clazz.isArray() && String.class.isAssignableFrom(clazz.getComponentType()))
return StringArray;
if (clazz.isArray() && byte.class.isAssignableFrom(clazz.getComponentType()))
return ByteArray;
if (Parcelable.class.isAssignableFrom(clazz))
return Parcelable;
if (IBinder.class.isAssignableFrom(clazz))