summaryrefslogtreecommitdiffstats
path: root/tools/layoutlib
diff options
context:
space:
mode:
authorDeepanshu Gupta <deepanshu@google.com>2015-08-25 16:06:57 -0700
committerDeepanshu Gupta <deepanshu@google.com>2015-08-25 16:06:57 -0700
commitc9862b4429b32985d5267fa6ae28025278bdd603 (patch)
treedbf9c08c4d76c631728fcd270c2384bab7496964 /tools/layoutlib
parentb1ad4a155957160de9c4ad5c5beb39ce00ef6799 (diff)
downloadframeworks_base-c9862b4429b32985d5267fa6ae28025278bdd603.zip
frameworks_base-c9862b4429b32985d5267fa6ae28025278bdd603.tar.gz
frameworks_base-c9862b4429b32985d5267fa6ae28025278bdd603.tar.bz2
An ugly hack to render CalendarView. [DO NOT MERGE]
This is an ugly hack to switch the field android.widget.SimpleMonthView.mDayFormatter from java.text.SimpleDateFormat to icu's version of the same class. The hack is only for the L version of the LayoutLib. It's done in a better way in M and even better in N. Change-Id: Id84a1d32040211c46b20cdaf3a77119676e748b6
Diffstat (limited to 'tools/layoutlib')
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java2
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java9
-rw-r--r--tools/layoutlib/create/src/com/android/tools/layoutlib/create/SimpleMonthViewAdapter.java90
3 files changed, 100 insertions, 1 deletions
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java
index c8b2b84..d37a93e 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmAnalyzer.java
@@ -112,6 +112,8 @@ public class AsmAnalyzer {
mGen.setDeps(deps);
mGen.setCopyFiles(filesFound);
mGen.setRewriteMethodCallClasses(mReplaceMethodCallClasses);
+ // hack hack hack
+ mGen.mSimpleMonthViewReader = zipClasses.get(AsmGenerator.SIMPLE_MONTH_VIEW);
}
}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java
index f6c2626..2bfceb4 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java
@@ -77,6 +77,9 @@ public class AsmGenerator {
/** Methods to inject. FQCN of class in which method should be injected => runnable that does
* the injection. */
private final Map<String, ICreateInfo.InjectMethodRunnable> mInjectedMethodsMap;
+ // A hack to do some modifications to simple month view.
+ static final String SIMPLE_MONTH_VIEW = "android/widget/SimpleMonthView";
+ ClassReader mSimpleMonthViewReader;
/**
* Creates a new generator that can generate the output JAR with the stubbed classes.
@@ -204,7 +207,7 @@ public class AsmGenerator {
* Utility that returns the internal ASM class name from a fully qualified binary class
* name. E.g. it returns android/view/View from android.view.View.
*/
- String binaryToInternalClassName(String className) {
+ static String binaryToInternalClassName(String className) {
if (className == null) {
return null;
} else {
@@ -380,6 +383,10 @@ public class AsmGenerator {
}
}
+ if (SIMPLE_MONTH_VIEW.equals(className)) {
+ cv = new SimpleMonthViewAdapter(cv);
+ }
+
cr.accept(cv, 0);
return cw.toByteArray();
}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/SimpleMonthViewAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/SimpleMonthViewAdapter.java
new file mode 100644
index 0000000..49fd456
--- /dev/null
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/SimpleMonthViewAdapter.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools.layoutlib.create;
+
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+
+import java.text.SimpleDateFormat;
+
+import static com.android.tools.layoutlib.create.AsmGenerator.binaryToInternalClassName;
+
+/**
+ * A very ugly hack to transform all references to {@link java.text.SimpleDateFormat} in {@code
+ * android.widget.SimpleMonthView} to {@code com.ibm.icu.text.SimpleDateFormat}.
+ */
+public class SimpleMonthViewAdapter extends ClassVisitor {
+
+ private static final String JAVA_SDF_DESC = Type.getDescriptor(SimpleDateFormat.class);
+ private static final String JAVA_SDF_INTERNAL_NAME =
+ binaryToInternalClassName(SimpleDateFormat.class.getName());
+ private static final String ICU_SDF_INTERNAL_NAME = "com/ibm/icu/text/SimpleDateFormat";
+
+ public SimpleMonthViewAdapter(ClassVisitor cv) {
+ super(Opcodes.ASM4, cv);
+ }
+
+ @Override
+ public FieldVisitor visitField(int access, String name, String desc, String signature,
+ Object value) {
+ if (JAVA_SDF_DESC.equals(desc)) {
+ desc = "L" + ICU_SDF_INTERNAL_NAME + ";";
+ }
+ return super.visitField(access, name, desc, signature, value);
+ }
+
+ @Override
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature,
+ String[] exceptions) {
+ return new MyMethodVisitor(super.visitMethod(access, name, desc, signature, exceptions));
+ }
+
+ private static class MyMethodVisitor extends MethodVisitor {
+ public MyMethodVisitor(MethodVisitor mv) {
+ super(Opcodes.ASM4, mv);
+ }
+
+ @Override
+ public void visitTypeInsn(int opcode, String type) {
+ if (JAVA_SDF_INTERNAL_NAME.equals(type) && opcode == Opcodes.NEW) {
+ type = ICU_SDF_INTERNAL_NAME;
+ }
+ super.visitTypeInsn(opcode, type);
+ }
+
+ @Override
+ public void visitMethodInsn(int opcode, String owner, String name, String desc) {
+ if (JAVA_SDF_INTERNAL_NAME.equals(owner)) {
+ owner = ICU_SDF_INTERNAL_NAME;
+ }
+ super.visitMethodInsn(opcode, owner, name, desc);
+ }
+
+ @Override
+ public void visitFieldInsn(int opcode, String owner, String name, String desc) {
+ if (JAVA_SDF_DESC.equals(desc) &&
+ (opcode == Opcodes.PUTFIELD || opcode == Opcodes.GETFIELD) &&
+ name.equals("mDayFormatter")) {
+ desc = "L" + ICU_SDF_INTERNAL_NAME + ";";
+ }
+ super.visitFieldInsn(opcode, owner, name, desc);
+ }
+ }
+}