Compare commits
8 Commits
Author | SHA1 | Date |
---|---|---|
|
e5e1d5adc2 | |
![]() |
2408cfd92a | |
![]() |
d7b18b0673 | |
![]() |
b49d1095fd | |
![]() |
26d9c42977 | |
![]() |
7d4dec14e8 | |
![]() |
982f1e1285 | |
![]() |
aba4c3bb89 |
|
@ -3,17 +3,17 @@ buildscript {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
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 plugin: 'com.android.library'
|
||||||
apply from: 'gradle-mvn-push.gradle'
|
apply plugin: 'com.github.dcendents.android-maven'
|
||||||
|
|
||||||
group = 'org.microg'
|
|
||||||
version = '1.0.0'
|
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 22
|
compileSdkVersion 22
|
||||||
buildToolsVersion "22.0.0"
|
buildToolsVersion "22.0.1"
|
||||||
|
compileOptions {
|
||||||
|
sourceCompatibility JavaVersion.VERSION_1_6
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
GROUP=org.microg
|
GROUP=org.microg
|
||||||
POM_ARTIFACT_ID=safe-parcel
|
POM_ARTIFACT_ID=safe-parcel
|
||||||
VERSION_NAME=1.0.0
|
VERSION_NAME=1.2-SNAPSHOT
|
||||||
|
|
||||||
POM_NAME=µg SafeParcel
|
POM_NAME=µg SafeParcel
|
||||||
POM_DESCRIPTION=Easy-to-use implementation of the "SafeParcel" format used for IPC in Play Services
|
POM_DESCRIPTION=Easy-to-use implementation of the "SafeParcel" format used for IPC in Play Services
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest package="org.microg.safeparcel">
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
<!-- This is not needed, it's just here to stop build systems from complaining -->
|
package="org.microg.safeparcel">
|
||||||
|
|
||||||
|
<uses-sdk
|
||||||
|
android:minSdkVersion="9"
|
||||||
|
android:targetSdkVersion="22" />
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|
|
@ -170,6 +170,16 @@ public class SafeParcelReader {
|
||||||
return arr;
|
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) {
|
public static void skip(Parcel parcel, int position) {
|
||||||
int i = readStart(parcel, position);
|
int i = readStart(parcel, position);
|
||||||
parcel.setDataPosition(parcel.dataPosition() + i);
|
parcel.setDataPosition(parcel.dataPosition() + i);
|
||||||
|
|
|
@ -7,7 +7,6 @@ import android.util.Log;
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Constructor;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -27,7 +26,7 @@ public class SafeParcelUtil {
|
||||||
return t;
|
return t;
|
||||||
} catch (NoSuchMethodException e) {
|
} catch (NoSuchMethodException e) {
|
||||||
throw new RuntimeException("createObject() requires a default constructor");
|
throw new RuntimeException("createObject() requires a default constructor");
|
||||||
} catch (InvocationTargetException | InstantiationException | IllegalAccessException e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException("Can't construct object", e);
|
throw new RuntimeException("Can't construct object", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,7 +55,7 @@ public class SafeParcelUtil {
|
||||||
if (object == null)
|
if (object == null)
|
||||||
throw new NullPointerException();
|
throw new NullPointerException();
|
||||||
Class clazz = object.getClass();
|
Class clazz = object.getClass();
|
||||||
Map<Integer, Field> fieldMap = new HashMap<>();
|
Map<Integer, Field> fieldMap = new HashMap<Integer, Field>();
|
||||||
while (clazz != null) {
|
while (clazz != null) {
|
||||||
for (Field field : clazz.getDeclaredFields()) {
|
for (Field field : clazz.getDeclaredFields()) {
|
||||||
if (field.isAnnotationPresent(SafeParceled.class)) {
|
if (field.isAnnotationPresent(SafeParceled.class)) {
|
||||||
|
@ -96,14 +95,19 @@ public class SafeParcelUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Parcelable.Creator getCreator(Field field)
|
private static Parcelable.Creator getCreator(Field field) throws IllegalAccessException {
|
||||||
throws IllegalAccessException {
|
Class clazz = field.getType();
|
||||||
try {
|
if (clazz.isArray()) {
|
||||||
return (Parcelable.Creator) field.getType().getDeclaredField("CREATOR").get(null);
|
clazz = clazz.getComponentType();
|
||||||
} catch (NoSuchFieldException e) {
|
|
||||||
throw new RuntimeException(
|
|
||||||
field.getType() + " is an Parcelable without CREATOR");
|
|
||||||
}
|
}
|
||||||
|
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) {
|
private static ClassLoader getClassLoader(Field field) {
|
||||||
|
@ -141,6 +145,9 @@ public class SafeParcelUtil {
|
||||||
case StringArray:
|
case StringArray:
|
||||||
SafeParcelWriter.write(parcel, num, (String[]) field.get(object), mayNull);
|
SafeParcelWriter.write(parcel, num, (String[]) field.get(object), mayNull);
|
||||||
break;
|
break;
|
||||||
|
case ByteArray:
|
||||||
|
SafeParcelWriter.write(parcel, num, (byte[]) field.get(object), mayNull);
|
||||||
|
break;
|
||||||
case Integer:
|
case Integer:
|
||||||
SafeParcelWriter.write(parcel, num, (Integer) field.get(object));
|
SafeParcelWriter.write(parcel, num, (Integer) field.get(object));
|
||||||
break;
|
break;
|
||||||
|
@ -168,12 +175,10 @@ public class SafeParcelUtil {
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
switch (SafeParcelType.fromClass(field.getType())) {
|
switch (SafeParcelType.fromClass(field.getType())) {
|
||||||
case Parcelable:
|
case Parcelable:
|
||||||
field.set(object, SafeParcelReader
|
field.set(object, SafeParcelReader.readParcelable(parcel, position, getCreator(field)));
|
||||||
.readParcelable(parcel, position, getCreator(field)));
|
|
||||||
break;
|
break;
|
||||||
case Binder:
|
case Binder:
|
||||||
field.set(object, SafeParcelReader.readBinder(parcel,
|
field.set(object, SafeParcelReader.readBinder(parcel, position));
|
||||||
position));
|
|
||||||
break;
|
break;
|
||||||
case List:
|
case List:
|
||||||
field.set(object, SafeParcelReader.readList(parcel, position, getClassLoader(field)));
|
field.set(object, SafeParcelReader.readList(parcel, position, getClassLoader(field)));
|
||||||
|
@ -184,6 +189,9 @@ public class SafeParcelUtil {
|
||||||
case StringArray:
|
case StringArray:
|
||||||
field.set(object, SafeParcelReader.readStringArray(parcel, position));
|
field.set(object, SafeParcelReader.readStringArray(parcel, position));
|
||||||
break;
|
break;
|
||||||
|
case ByteArray:
|
||||||
|
field.set(object, SafeParcelReader.readByteArray(parcel, position));
|
||||||
|
break;
|
||||||
case Integer:
|
case Integer:
|
||||||
field.set(object, SafeParcelReader.readInt(parcel, position));
|
field.set(object, SafeParcelReader.readInt(parcel, position));
|
||||||
break;
|
break;
|
||||||
|
@ -206,7 +214,7 @@ public class SafeParcelUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum SafeParcelType {
|
private enum SafeParcelType {
|
||||||
Parcelable, Binder, List, ParcelableArray, StringArray,
|
Parcelable, Binder, List, ParcelableArray, StringArray, ByteArray,
|
||||||
Integer, Long, Boolean, Float, Double, String;
|
Integer, Long, Boolean, Float, Double, String;
|
||||||
|
|
||||||
public static SafeParcelType fromClass(Class clazz) {
|
public static SafeParcelType fromClass(Class clazz) {
|
||||||
|
@ -214,6 +222,8 @@ public class SafeParcelUtil {
|
||||||
return ParcelableArray;
|
return ParcelableArray;
|
||||||
if (clazz.isArray() && String.class.isAssignableFrom(clazz.getComponentType()))
|
if (clazz.isArray() && String.class.isAssignableFrom(clazz.getComponentType()))
|
||||||
return StringArray;
|
return StringArray;
|
||||||
|
if (clazz.isArray() && byte.class.isAssignableFrom(clazz.getComponentType()))
|
||||||
|
return ByteArray;
|
||||||
if (Parcelable.class.isAssignableFrom(clazz))
|
if (Parcelable.class.isAssignableFrom(clazz))
|
||||||
return Parcelable;
|
return Parcelable;
|
||||||
if (IBinder.class.isAssignableFrom(clazz))
|
if (IBinder.class.isAssignableFrom(clazz))
|
||||||
|
|
Loading…
Reference in New Issue