From 2e00a07d401e4ce62fe59ad492acc86ef6601a66 Mon Sep 17 00:00:00 2001 From: Xavier Ducrohet Date: Fri, 24 Feb 2012 17:44:27 -0800 Subject: Fix support for custom views in library on ADT's side. Don't check for final field when parsing R.java (in libraries fields are not final anymore) and fix a bug in the new aaptparser which would return a failed to parse aapt error when the output is empty. Also add customview in library test app. --- .../customViewTest/libWithCustomView/.classpath | 8 + testapps/customViewTest/libWithCustomView/.project | 33 ++++ .../libWithCustomView/AndroidManifest.xml | 7 + .../libWithCustomView/ant.properties | 17 ++ .../customViewTest/libWithCustomView/build.xml | 85 +++++++++ .../libWithCustomView/local.properties | 10 ++ .../libWithCustomView/proguard-project.txt | 20 +++ .../customViewTest/libWithCustomView/proguard.cfg | 40 +++++ .../libWithCustomView/project.properties | 13 ++ .../libWithCustomView/res/layout/main.xml | 46 +++++ .../libWithCustomView/res/values/attrs.xml | 30 ++++ .../libWithCustomView/res/values/strings.xml | 4 + .../com/android/tests/libwithcustom/LabelView.java | 193 +++++++++++++++++++++ testapps/customViewTest/mainProject/.classpath | 8 + testapps/customViewTest/mainProject/.project | 33 ++++ .../customViewTest/mainProject/AndroidManifest.xml | 15 ++ testapps/customViewTest/mainProject/ant.properties | 17 ++ testapps/customViewTest/mainProject/build.xml | 85 +++++++++ testapps/customViewTest/mainProject/libs/foo.txt | 1 + .../customViewTest/mainProject/local.properties | 10 ++ .../mainProject/proguard-project.txt | 20 +++ testapps/customViewTest/mainProject/proguard.cfg | 40 +++++ .../customViewTest/mainProject/project.properties | 12 ++ .../mainProject/res/values/strings.xml | 4 + .../tests/projectwithsupport/MyActivity.java | 15 ++ 25 files changed, 766 insertions(+) create mode 100644 testapps/customViewTest/libWithCustomView/.classpath create mode 100644 testapps/customViewTest/libWithCustomView/.project create mode 100644 testapps/customViewTest/libWithCustomView/AndroidManifest.xml create mode 100644 testapps/customViewTest/libWithCustomView/ant.properties create mode 100644 testapps/customViewTest/libWithCustomView/build.xml create mode 100644 testapps/customViewTest/libWithCustomView/local.properties create mode 100644 testapps/customViewTest/libWithCustomView/proguard-project.txt create mode 100644 testapps/customViewTest/libWithCustomView/proguard.cfg create mode 100644 testapps/customViewTest/libWithCustomView/project.properties create mode 100644 testapps/customViewTest/libWithCustomView/res/layout/main.xml create mode 100644 testapps/customViewTest/libWithCustomView/res/values/attrs.xml create mode 100644 testapps/customViewTest/libWithCustomView/res/values/strings.xml create mode 100644 testapps/customViewTest/libWithCustomView/src/com/android/tests/libwithcustom/LabelView.java create mode 100644 testapps/customViewTest/mainProject/.classpath create mode 100644 testapps/customViewTest/mainProject/.project create mode 100644 testapps/customViewTest/mainProject/AndroidManifest.xml create mode 100644 testapps/customViewTest/mainProject/ant.properties create mode 100644 testapps/customViewTest/mainProject/build.xml create mode 100644 testapps/customViewTest/mainProject/libs/foo.txt create mode 100644 testapps/customViewTest/mainProject/local.properties create mode 100644 testapps/customViewTest/mainProject/proguard-project.txt create mode 100644 testapps/customViewTest/mainProject/proguard.cfg create mode 100644 testapps/customViewTest/mainProject/project.properties create mode 100644 testapps/customViewTest/mainProject/res/values/strings.xml create mode 100644 testapps/customViewTest/mainProject/src/com/android/tests/projectwithsupport/MyActivity.java (limited to 'testapps') diff --git a/testapps/customViewTest/libWithCustomView/.classpath b/testapps/customViewTest/libWithCustomView/.classpath new file mode 100644 index 0000000..a4763d1 --- /dev/null +++ b/testapps/customViewTest/libWithCustomView/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/testapps/customViewTest/libWithCustomView/.project b/testapps/customViewTest/libWithCustomView/.project new file mode 100644 index 0000000..a2d0697 --- /dev/null +++ b/testapps/customViewTest/libWithCustomView/.project @@ -0,0 +1,33 @@ + + + libWithCustomView + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/testapps/customViewTest/libWithCustomView/AndroidManifest.xml b/testapps/customViewTest/libWithCustomView/AndroidManifest.xml new file mode 100644 index 0000000..7e5c61a --- /dev/null +++ b/testapps/customViewTest/libWithCustomView/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/testapps/customViewTest/libWithCustomView/ant.properties b/testapps/customViewTest/libWithCustomView/ant.properties new file mode 100644 index 0000000..ee52d86 --- /dev/null +++ b/testapps/customViewTest/libWithCustomView/ant.properties @@ -0,0 +1,17 @@ +# This file is used to override default values used by the Ant build system. +# +# This file must be checked in Version Control Systems, as it is +# integral to the build system of your project. + +# This file is only used by the Ant script. + +# You can use this to override default values such as +# 'source.dir' for the location of your java source folder and +# 'out.dir' for the location of your output folder. + +# You can also use it define how the release builds are signed by declaring +# the following properties: +# 'key.store' for the location of your keystore and +# 'key.alias' for the name of the key to use. +# The password will be asked during the build when you use the 'release' target. + diff --git a/testapps/customViewTest/libWithCustomView/build.xml b/testapps/customViewTest/libWithCustomView/build.xml new file mode 100644 index 0000000..772f422 --- /dev/null +++ b/testapps/customViewTest/libWithCustomView/build.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/customViewTest/libWithCustomView/local.properties b/testapps/customViewTest/libWithCustomView/local.properties new file mode 100644 index 0000000..613788a --- /dev/null +++ b/testapps/customViewTest/libWithCustomView/local.properties @@ -0,0 +1,10 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must *NOT* be checked in Version Control Systems, +# as it contains information specific to your local configuration. + +# location of the SDK. This is only used by Ant +# For customization when using a Version Control System, please read the +# header note. +sdk.dir=/android-sdk-dev diff --git a/testapps/customViewTest/libWithCustomView/proguard-project.txt b/testapps/customViewTest/libWithCustomView/proguard-project.txt new file mode 100644 index 0000000..f2fe155 --- /dev/null +++ b/testapps/customViewTest/libWithCustomView/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/testapps/customViewTest/libWithCustomView/proguard.cfg b/testapps/customViewTest/libWithCustomView/proguard.cfg new file mode 100644 index 0000000..b1cdf17 --- /dev/null +++ b/testapps/customViewTest/libWithCustomView/proguard.cfg @@ -0,0 +1,40 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/testapps/customViewTest/libWithCustomView/project.properties b/testapps/customViewTest/libWithCustomView/project.properties new file mode 100644 index 0000000..23d80c4 --- /dev/null +++ b/testapps/customViewTest/libWithCustomView/project.properties @@ -0,0 +1,13 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-15 +android.library=true + diff --git a/testapps/customViewTest/libWithCustomView/res/layout/main.xml b/testapps/customViewTest/libWithCustomView/res/layout/main.xml new file mode 100644 index 0000000..c906a76 --- /dev/null +++ b/testapps/customViewTest/libWithCustomView/res/layout/main.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/testapps/customViewTest/libWithCustomView/res/values/attrs.xml b/testapps/customViewTest/libWithCustomView/res/values/attrs.xml new file mode 100644 index 0000000..f173e02 --- /dev/null +++ b/testapps/customViewTest/libWithCustomView/res/values/attrs.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + #7f00 + #770000ff + #7700ff00 + + \ No newline at end of file diff --git a/testapps/customViewTest/libWithCustomView/res/values/strings.xml b/testapps/customViewTest/libWithCustomView/res/values/strings.xml new file mode 100644 index 0000000..3fa203a --- /dev/null +++ b/testapps/customViewTest/libWithCustomView/res/values/strings.xml @@ -0,0 +1,4 @@ + + + MyActivity + diff --git a/testapps/customViewTest/libWithCustomView/src/com/android/tests/libwithcustom/LabelView.java b/testapps/customViewTest/libWithCustomView/src/com/android/tests/libwithcustom/LabelView.java new file mode 100644 index 0000000..d0b62e9 --- /dev/null +++ b/testapps/customViewTest/libWithCustomView/src/com/android/tests/libwithcustom/LabelView.java @@ -0,0 +1,193 @@ +/* + * Copyright (C) 2007 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.tests.libwithcustom; + +// Need the following import to get access to the app resources, since this +// class is in a sub-package. +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.View; + + +/** + * Example of how to write a custom subclass of View. LabelView + * is used to draw simple text views. Note that it does not handle + * styled text or right-to-left writing systems. + * + */ +public class LabelView extends View { + private Paint mTextPaint; + private String mText; + private int mAscent; + + /** + * Constructor. This version is only needed if you will be instantiating + * the object manually (not from a layout XML file). + * @param context + */ + public LabelView(Context context) { + super(context); + initLabelView(); + } + + /** + * Construct object, initializing with any attributes we understand from a + * layout file. These attributes are defined in + * SDK/assets/res/any/classes.xml. + * + * @see android.view.View#View(android.content.Context, android.util.AttributeSet) + */ + public LabelView(Context context, AttributeSet attrs) { + super(context, attrs); + initLabelView(); + + + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.LabelView); + + CharSequence s = a.getString(R.styleable.LabelView_text); + if (s != null) { + setText(s.toString()); + } + + // Retrieve the color(s) to be used for this view and apply them. + // Note, if you only care about supporting a single color, that you + // can instead call a.getColor() and pass that to setTextColor(). + setTextColor(a.getColor(R.styleable.LabelView_textColor, 0xFF000000)); + + int textSize = a.getDimensionPixelOffset(R.styleable.LabelView_textSize, 0); + if (textSize > 0) { + setTextSize(textSize); + } + + a.recycle(); + } + + private final void initLabelView() { + mTextPaint = new Paint(); + mTextPaint.setAntiAlias(true); + // Must manually scale the desired text size to match screen density + mTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density); + mTextPaint.setColor(0xFF000000); + setPadding(3, 3, 3, 3); + } + + /** + * Sets the text to display in this label + * @param text The text to display. This will be drawn as one line. + */ + public void setText(String text) { + mText = text; + requestLayout(); + invalidate(); + } + + /** + * Sets the text size for this label + * @param size Font size + */ + public void setTextSize(int size) { + // This text size has been pre-scaled by the getDimensionPixelOffset method + mTextPaint.setTextSize(size); + requestLayout(); + invalidate(); + } + + /** + * Sets the text color for this label. + * @param color ARGB value for the text + */ + public void setTextColor(int color) { + mTextPaint.setColor(color); + invalidate(); + } + + /** + * @see android.view.View#measure(int, int) + */ + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(measureWidth(widthMeasureSpec), + measureHeight(heightMeasureSpec)); + } + + /** + * Determines the width of this view + * @param measureSpec A measureSpec packed into an int + * @return The width of the view, honoring constraints from measureSpec + */ + private int measureWidth(int measureSpec) { + int result = 0; + int specMode = MeasureSpec.getMode(measureSpec); + int specSize = MeasureSpec.getSize(measureSpec); + + if (specMode == MeasureSpec.EXACTLY) { + // We were told how big to be + result = specSize; + } else { + // Measure the text + result = (int) mTextPaint.measureText(mText) + getPaddingLeft() + + getPaddingRight(); + if (specMode == MeasureSpec.AT_MOST) { + // Respect AT_MOST value if that was what is called for by measureSpec + result = Math.min(result, specSize); + } + } + + return result; + } + + /** + * Determines the height of this view + * @param measureSpec A measureSpec packed into an int + * @return The height of the view, honoring constraints from measureSpec + */ + private int measureHeight(int measureSpec) { + int result = 0; + int specMode = MeasureSpec.getMode(measureSpec); + int specSize = MeasureSpec.getSize(measureSpec); + + mAscent = (int) mTextPaint.ascent(); + if (specMode == MeasureSpec.EXACTLY) { + // We were told how big to be + result = specSize; + } else { + // Measure the text (beware: ascent is a negative number) + result = (int) (-mAscent + mTextPaint.descent()) + getPaddingTop() + + getPaddingBottom(); + if (specMode == MeasureSpec.AT_MOST) { + // Respect AT_MOST value if that was what is called for by measureSpec + result = Math.min(result, specSize); + } + } + return result; + } + + /** + * Render the text + * + * @see android.view.View#onDraw(android.graphics.Canvas) + */ + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + canvas.drawText(mText, getPaddingLeft(), getPaddingTop() - mAscent, mTextPaint); + } +} diff --git a/testapps/customViewTest/mainProject/.classpath b/testapps/customViewTest/mainProject/.classpath new file mode 100644 index 0000000..a4763d1 --- /dev/null +++ b/testapps/customViewTest/mainProject/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/testapps/customViewTest/mainProject/.project b/testapps/customViewTest/mainProject/.project new file mode 100644 index 0000000..12bba31 --- /dev/null +++ b/testapps/customViewTest/mainProject/.project @@ -0,0 +1,33 @@ + + + mainProject + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/testapps/customViewTest/mainProject/AndroidManifest.xml b/testapps/customViewTest/mainProject/AndroidManifest.xml new file mode 100644 index 0000000..ff41761 --- /dev/null +++ b/testapps/customViewTest/mainProject/AndroidManifest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/testapps/customViewTest/mainProject/ant.properties b/testapps/customViewTest/mainProject/ant.properties new file mode 100644 index 0000000..ee52d86 --- /dev/null +++ b/testapps/customViewTest/mainProject/ant.properties @@ -0,0 +1,17 @@ +# This file is used to override default values used by the Ant build system. +# +# This file must be checked in Version Control Systems, as it is +# integral to the build system of your project. + +# This file is only used by the Ant script. + +# You can use this to override default values such as +# 'source.dir' for the location of your java source folder and +# 'out.dir' for the location of your output folder. + +# You can also use it define how the release builds are signed by declaring +# the following properties: +# 'key.store' for the location of your keystore and +# 'key.alias' for the name of the key to use. +# The password will be asked during the build when you use the 'release' target. + diff --git a/testapps/customViewTest/mainProject/build.xml b/testapps/customViewTest/mainProject/build.xml new file mode 100644 index 0000000..f3a3d91 --- /dev/null +++ b/testapps/customViewTest/mainProject/build.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/testapps/customViewTest/mainProject/libs/foo.txt b/testapps/customViewTest/mainProject/libs/foo.txt new file mode 100644 index 0000000..fe0c852 --- /dev/null +++ b/testapps/customViewTest/mainProject/libs/foo.txt @@ -0,0 +1 @@ +sdf \ No newline at end of file diff --git a/testapps/customViewTest/mainProject/local.properties b/testapps/customViewTest/mainProject/local.properties new file mode 100644 index 0000000..613788a --- /dev/null +++ b/testapps/customViewTest/mainProject/local.properties @@ -0,0 +1,10 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must *NOT* be checked in Version Control Systems, +# as it contains information specific to your local configuration. + +# location of the SDK. This is only used by Ant +# For customization when using a Version Control System, please read the +# header note. +sdk.dir=/android-sdk-dev diff --git a/testapps/customViewTest/mainProject/proguard-project.txt b/testapps/customViewTest/mainProject/proguard-project.txt new file mode 100644 index 0000000..f2fe155 --- /dev/null +++ b/testapps/customViewTest/mainProject/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/testapps/customViewTest/mainProject/proguard.cfg b/testapps/customViewTest/mainProject/proguard.cfg new file mode 100644 index 0000000..b1cdf17 --- /dev/null +++ b/testapps/customViewTest/mainProject/proguard.cfg @@ -0,0 +1,40 @@ +-optimizationpasses 5 +-dontusemixedcaseclassnames +-dontskipnonpubliclibraryclasses +-dontpreverify +-verbose +-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgentHelper +-keep public class * extends android.preference.Preference +-keep public class com.android.vending.licensing.ILicensingService + +-keepclasseswithmembernames class * { + native ; +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} diff --git a/testapps/customViewTest/mainProject/project.properties b/testapps/customViewTest/mainProject/project.properties new file mode 100644 index 0000000..b80c0cf --- /dev/null +++ b/testapps/customViewTest/mainProject/project.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +# Project target. +target=android-15 +android.library.reference.1=../libWithCustomView diff --git a/testapps/customViewTest/mainProject/res/values/strings.xml b/testapps/customViewTest/mainProject/res/values/strings.xml new file mode 100644 index 0000000..3fa203a --- /dev/null +++ b/testapps/customViewTest/mainProject/res/values/strings.xml @@ -0,0 +1,4 @@ + + + MyActivity + diff --git a/testapps/customViewTest/mainProject/src/com/android/tests/projectwithsupport/MyActivity.java b/testapps/customViewTest/mainProject/src/com/android/tests/projectwithsupport/MyActivity.java new file mode 100644 index 0000000..c065839 --- /dev/null +++ b/testapps/customViewTest/mainProject/src/com/android/tests/projectwithsupport/MyActivity.java @@ -0,0 +1,15 @@ +package com.android.tests.projectwithsupport; + +import android.app.Activity; +import android.os.Bundle; + +public class MyActivity extends Activity +{ + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + } +} -- cgit v1.1