diff --git a/src/api-impl/android/app/Activity.java b/src/api-impl/android/app/Activity.java index 13a54350..40bb91d1 100644 --- a/src/api-impl/android/app/Activity.java +++ b/src/api-impl/android/app/Activity.java @@ -290,6 +290,10 @@ public class Activity extends Context implements Window.Callback { } } + public void setResult(int resultCode) { + setResult(resultCode, null); + } + public void startActivity(Intent intent) { System.out.println("startActivity(" + intent + ") called"); try { @@ -392,4 +396,12 @@ public class Activity extends Context implements Window.Callback { onOptionsMenuClosed(menu); } } + + public void setTitle(CharSequence title) {} + + public void onBackPressed() { + finish(); + } + + public void unregisterReceiver(BroadcastReceiver receiver) {} } diff --git a/src/api-impl/android/app/ProgressDialog.java b/src/api-impl/android/app/ProgressDialog.java index c98cf404..c7e140ba 100644 --- a/src/api-impl/android/app/ProgressDialog.java +++ b/src/api-impl/android/app/ProgressDialog.java @@ -1,4 +1,10 @@ package android.app; +import android.content.Context; + public class ProgressDialog extends Dialog { + + public ProgressDialog(Context context, int themeResId) { + super(context, themeResId); + } } diff --git a/src/api-impl/android/content/Context.java b/src/api-impl/android/content/Context.java index 6bfde6e1..1385ab8c 100644 --- a/src/api-impl/android/content/Context.java +++ b/src/api-impl/android/content/Context.java @@ -7,10 +7,6 @@ import android.app.KeyguardManager; import android.app.NotificationManager; import android.app.SharedPreferencesImpl; import android.app.UiModeManager; -import android.content.BroadcastReceiver; -import android.content.ClipboardManager; -import android.content.Intent; -import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.res.AssetManager; @@ -32,8 +28,10 @@ import android.telephony.TelephonyManager; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; -import android.view.WindowManager; import android.view.WindowManagerImpl; +import android.view.accessibility.AccessibilityManager; +import android.view.inputmethod.InputMethodManager; + import com.reandroid.arsc.chunk.xml.AndroidManifestBlock; import com.reandroid.arsc.chunk.xml.ResXmlAttribute; @@ -171,6 +169,10 @@ public class Context extends Object { return new LocationManager(); case "uimode": return new UiModeManager(); + case "input_method": + return new InputMethodManager(); + case "accessibility": + return new AccessibilityManager(); default: System.out.println("!!!!!!! getSystemService: case >" + name + "< is not implemented yet"); return null; @@ -367,4 +369,10 @@ public class Context extends Object { databaseDir.mkdirs(); return new File(databaseDir, dbName); } + + public void sendBroadcast(Intent intent) {} + + public boolean stopService(Intent intent) {return false;} + + public void unbindService(ServiceConnection serviceConnection) {} } diff --git a/src/api-impl/android/content/Intent.java b/src/api-impl/android/content/Intent.java index 6e1f02ff..40133b64 100644 --- a/src/api-impl/android/content/Intent.java +++ b/src/api-impl/android/content/Intent.java @@ -4,8 +4,6 @@ import android.net.Uri; import android.os.Bundle; import android.os.Parcelable; import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; public class Intent { private ComponentName component; @@ -193,6 +191,18 @@ public class Intent { return (Serializable)extras.get(name); } + public Parcelable getParcelableExtra(String name) { + return extras.getParcelable(name); + } + + public String[] getStringArrayExtra(String name) { + return extras.getStringArray(name); + } + + public int getIntExtra(String name, int def) { + return extras.getInt(name, def); + } + public Bundle getExtras() { return extras; } diff --git a/src/api-impl/android/content/res/AssetManager.java b/src/api-impl/android/content/res/AssetManager.java index d749a23d..5a795333 100644 --- a/src/api-impl/android/content/res/AssetManager.java +++ b/src/api-impl/android/content/res/AssetManager.java @@ -37,6 +37,9 @@ import com.reandroid.arsc.value.ResValue; import com.reandroid.arsc.value.ResValueMap; import com.reandroid.arsc.value.ValueItem; import com.reandroid.arsc.value.ValueType; +import com.reandroid.arsc.value.plurals.PluralsBag; +import com.reandroid.arsc.value.plurals.PluralsQuantity; + import java.io.FileDescriptor; import java.io.FileNotFoundException; import java.io.FileReader; @@ -219,17 +222,20 @@ public final class AssetManager { * identifier for the current configuration / skin. */ /*package*/ final CharSequence getResourceBagText(int ident, int bagEntryId) { - synchronized (this) { - TypedValue tmpValue = mValue; - int block = loadResourceBagValue(ident, bagEntryId, tmpValue, true); - if (block >= 0) { - if (tmpValue.type == TypedValue.TYPE_STRING) { - return mStringBlocks[block].get(tmpValue.data); - } - return tmpValue.coerceToString(); - } - } - return null; + PluralsBag pluralsBag = PluralsBag.create(tableBlockSearch(ident).pickOne()); + return pluralsBag.getQuantityString(PluralsQuantity.valueOf((short)bagEntryId)); + +// synchronized (this) { +// TypedValue tmpValue = mValue; +// int block = loadResourceBagValue(ident, bagEntryId, tmpValue, true); +// if (block >= 0) { +// if (tmpValue.type == TypedValue.TYPE_STRING) { +// return mStringBlocks[block].get(tmpValue.data); +// } +// return tmpValue.coerceToString(); +// } +// } +// return null; } /** @@ -240,7 +246,13 @@ public final class AssetManager { /*package*/ final String[] getResourceStringArray(final int id) { ArrayList values = new ArrayList(); for (ResValueMap map : tableBlockSearch(id).pickOne().getResValueMapArray().getChildes()) { - values.add(map.getValueAsString()); + if (map.getType() == TypedValue.TYPE_REFERENCE) { + values.add(String.valueOf(getResourceText(map.getData()))); + } else if (map.getType() == TypedValue.TYPE_STRING) { + values.add(map.getValueAsString()); + } else { + values.add("value of unknown type " + map.getType()); + } } return values.toArray(new String[0]); } diff --git a/src/api-impl/android/graphics/Matrix.java b/src/api-impl/android/graphics/Matrix.java index 5d3639aa..6cf7a22a 100644 --- a/src/api-impl/android/graphics/Matrix.java +++ b/src/api-impl/android/graphics/Matrix.java @@ -260,13 +260,13 @@ public class Matrix { * specified transformation. */ public void setScale(float sx, float sy, float px, float py) { - native_setScale(native_instance, sx, sy, px, py); + // native_setScale(native_instance, sx, sy, px, py); } /** * Set the matrix to scale by sx and sy. */ public void setScale(float sx, float sy) { - native_setScale(native_instance, sx, sy); + // native_setScale(native_instance, sx, sy); } /** * Set the matrix to rotate by the specified number of degrees, with a pivot diff --git a/src/api-impl/android/graphics/drawable/BitmapDrawable.java b/src/api-impl/android/graphics/drawable/BitmapDrawable.java index 2f67e3c2..18ec53bf 100644 --- a/src/api-impl/android/graphics/drawable/BitmapDrawable.java +++ b/src/api-impl/android/graphics/drawable/BitmapDrawable.java @@ -19,4 +19,8 @@ public class BitmapDrawable extends Drawable { canvas.drawBitmap(bitmap, new Rect(0, 0, bitmap.getWidth(), bitmap.getWidth()), new RectF(getBounds()), null); } + public Bitmap getBitmap() { + return bitmap; + } + } diff --git a/src/api-impl/android/graphics/drawable/ColorDrawable.java b/src/api-impl/android/graphics/drawable/ColorDrawable.java index fcea5117..b4b54add 100644 --- a/src/api-impl/android/graphics/drawable/ColorDrawable.java +++ b/src/api-impl/android/graphics/drawable/ColorDrawable.java @@ -4,6 +4,9 @@ import android.graphics.Canvas; public class ColorDrawable extends Drawable { + public ColorDrawable(int color) { + } + @Override public void draw(Canvas canvas) { // TODO Auto-generated method stub diff --git a/src/api-impl/android/graphics/drawable/Drawable.java b/src/api-impl/android/graphics/drawable/Drawable.java index cbda40e7..ff5c4518 100644 --- a/src/api-impl/android/graphics/drawable/Drawable.java +++ b/src/api-impl/android/graphics/drawable/Drawable.java @@ -24,7 +24,9 @@ public abstract class Drawable { public abstract class ConstantState { - public abstract Drawable newDrawable(Resources res); + public abstract Drawable newDrawable(Resources res); + + public abstract Drawable newDrawable(); } public void setBounds(int left, int top, int right, int bottom) { diff --git a/src/api-impl/android/graphics/drawable/DrawableContainer.java b/src/api-impl/android/graphics/drawable/DrawableContainer.java new file mode 100644 index 00000000..83fb8943 --- /dev/null +++ b/src/api-impl/android/graphics/drawable/DrawableContainer.java @@ -0,0 +1,13 @@ +package android.graphics.drawable; + +import android.graphics.Canvas; + +public class DrawableContainer extends Drawable { + + @Override + public void draw(Canvas canvas) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'draw'"); + } + +} diff --git a/src/api-impl/android/graphics/drawable/GradientDrawable.java b/src/api-impl/android/graphics/drawable/GradientDrawable.java index bcfb8511..ca1a77be 100644 --- a/src/api-impl/android/graphics/drawable/GradientDrawable.java +++ b/src/api-impl/android/graphics/drawable/GradientDrawable.java @@ -13,5 +13,7 @@ public class GradientDrawable extends Drawable { public void setColor(int color) {} public void setCornerRadius(float cornerRadius) {} + + public void setShape(int shape) {} } diff --git a/src/api-impl/android/graphics/drawable/ScaleDrawable.java b/src/api-impl/android/graphics/drawable/ScaleDrawable.java new file mode 100644 index 00000000..c3734d45 --- /dev/null +++ b/src/api-impl/android/graphics/drawable/ScaleDrawable.java @@ -0,0 +1,13 @@ +package android.graphics.drawable; + +import android.graphics.Canvas; + +public class ScaleDrawable extends Drawable { + + @Override + public void draw(Canvas canvas) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'draw'"); + } + +} diff --git a/src/api-impl/android/graphics/drawable/StateListDrawable.java b/src/api-impl/android/graphics/drawable/StateListDrawable.java new file mode 100644 index 00000000..a6c7551a --- /dev/null +++ b/src/api-impl/android/graphics/drawable/StateListDrawable.java @@ -0,0 +1,15 @@ +package android.graphics.drawable; + +import android.graphics.Canvas; + +public class StateListDrawable extends Drawable { + + @Override + public void draw(Canvas canvas) { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'draw'"); + } + + public void addState(int[] stateSet, Drawable drawable) {} + +} diff --git a/src/api-impl/android/view/KeyCharacterMap.java b/src/api-impl/android/view/KeyCharacterMap.java index 1267de70..e92af218 100644 --- a/src/api-impl/android/view/KeyCharacterMap.java +++ b/src/api-impl/android/view/KeyCharacterMap.java @@ -307,7 +307,7 @@ public class KeyCharacterMap { } } return inputDevice.getKeyCharacterMap();*/ - return null; + return new KeyCharacterMap(0); } /** @@ -609,7 +609,8 @@ public class KeyCharacterMap { * @return The keyboard type. */ public int getKeyboardType() { - return nativeGetKeyboardType(mPtr); + return FULL; + // return nativeGetKeyboardType(mPtr); } /** diff --git a/src/api-impl/android/view/View.java b/src/api-impl/android/view/View.java index f17c0170..235fa427 100644 --- a/src/api-impl/android/view/View.java +++ b/src/api-impl/android/view/View.java @@ -9,8 +9,11 @@ import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.IBinder; import android.os.Looper; +import android.os.Parcelable; import android.util.AttributeSet; import android.util.LayoutDirection; +import android.util.SparseArray; +import android.view.animation.Animation; import java.util.ArrayList; import java.util.HashMap; @@ -779,6 +782,7 @@ public class View extends Object { protected ViewGroup.LayoutParams layout_params; private Context context; private Map tags = new HashMap<>(); + private Object tag; int measuredWidth = 0; int measuredHeight = 0; @@ -1019,7 +1023,10 @@ public class View extends Object { public static class AccessibilityDelegate {} public Drawable getBackground() { - return null; + return new Drawable() { + @Override + public void draw(Canvas canvas) {} + }; } public void setClickable(boolean clickable) {} @@ -1090,6 +1097,10 @@ public class View extends Object { return result | (childMeasuredState&MEASURED_STATE_MASK); } + public static int resolveSize(int size, int measureSpec) { + return resolveSizeAndState(size, measureSpec, 0) & MEASURED_SIZE_MASK; + } + public final int getMeasuredWidth() { return this.measuredWidth & MEASURED_SIZE_MASK; } @@ -1168,6 +1179,13 @@ public class View extends Object { return tags.get(key); } + public void setTag(Object tag) { + this.tag = tag; + } + public Object getTag() { + return tag; + } + public void addOnLayoutChangeListener(OnLayoutChangeListener listener) {} public boolean isSelected() {return false;} @@ -1250,5 +1268,44 @@ public class View extends Object { return result; } + public static class BaseSavedState extends AbsSavedState { + } + + public void clearFocus() {} + + public void setRotation(float rotation) {} + + public void setScaleX(float scaleX) {} + public void setScaleY(float scaleY) {} + + public static View inflate(Context context, int resource, ViewGroup root) { + LayoutInflater factory = LayoutInflater.from(context); + return factory.inflate(resource, root); + } + + public void saveHierarchyState(SparseArray array) {} + + public void setDuplicateParentStateEnabled(boolean enabled) {} + + public boolean performClick() { + return false; + } + + public void playSoundEffect(int soundConstant) {} + public void computeScroll() {} + + public void jumpDrawablesToCurrentState() {} + + public void setOnFocusChangeListener (View.OnFocusChangeListener l) {} + + public boolean hasWindowFocus() {return true;} + + public void setSaveEnabled (boolean enabled) {} + + public boolean willNotDraw() {return false;} + + public void setOnCreateContextMenuListener (View.OnCreateContextMenuListener l) {} + + public void startAnimation(Animation animation) {} } diff --git a/src/api-impl/android/view/ViewGroup.java b/src/api-impl/android/view/ViewGroup.java index 47bef022..a97b0109 100644 --- a/src/api-impl/android/view/ViewGroup.java +++ b/src/api-impl/android/view/ViewGroup.java @@ -103,6 +103,7 @@ public class ViewGroup extends View implements ViewParent, ViewManager { } public void attachViewToParent(View view, int index, LayoutParams params) { + addViewInternal(view, index, params); } protected void removeDetachedView(View child, boolean animate) { @@ -131,6 +132,9 @@ public class ViewGroup extends View implements ViewParent, ViewManager { public LayoutParams generateLayoutParams(AttributeSet attrs) { return new LayoutParams(getContext(), attrs); } + protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { + return p; + } public void bringChildToFront(View child) { // TODO: actually implement this (might make sense to implement it in the subclasses instead), when applicable @@ -150,7 +154,7 @@ public class ViewGroup extends View implements ViewParent, ViewManager { public void setOnHierarchyChangeListener(OnHierarchyChangeListener listener) {} - public boolean checkLayoutParams(LayoutParams params) { + protected boolean checkLayoutParams(LayoutParams params) { return true; } @@ -233,12 +237,30 @@ public class ViewGroup extends View implements ViewParent, ViewManager { child.measure(childWidthMeasureSpec, childHeightMeasureSpec); } + protected void measureChild(View child, int parentWidthMeasureSpec, + int parentHeightMeasureSpec) { + final LayoutParams lp = child.getLayoutParams(); + final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, + /*mPaddingLeft + mPaddingRight*/0, lp.width); + final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec, + /*mPaddingTop + mPaddingBottom*/0, lp.height); + child.measure(childWidthMeasureSpec, childHeightMeasureSpec); + } + public void setAddStatesFromChildren(boolean addsStates) {} public View getFocusedChild() {return null;} public int getDescendantFocusability() {return 0;} + public void startViewTransition(View view) {} + public void endViewTransition(View view) {} + + protected LayoutParams generateDefaultLayoutParams() { + return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); + } + + public void focusableViewAvailable(View v) {} public static class LayoutParams { public static final int FILL_PARENT = -1; public static final int MATCH_PARENT = -1; diff --git a/src/api-impl/android/view/ViewParent.java b/src/api-impl/android/view/ViewParent.java index 21c3c673..31155da3 100644 --- a/src/api-impl/android/view/ViewParent.java +++ b/src/api-impl/android/view/ViewParent.java @@ -2,4 +2,6 @@ package android.view; public interface ViewParent { public abstract ViewParent getParent(); + + public boolean isLayoutRequested(); } diff --git a/src/api-impl/android/view/ViewStub.java b/src/api-impl/android/view/ViewStub.java new file mode 100644 index 00000000..14be6c70 --- /dev/null +++ b/src/api-impl/android/view/ViewStub.java @@ -0,0 +1,16 @@ +package android.view; + +import android.content.Context; +import android.util.AttributeSet; + +public class ViewStub extends View { + + public ViewStub(Context context) { + super(context); + } + + public ViewStub(Context context, AttributeSet attributeSet) { + super(context, attributeSet); + } + +} diff --git a/src/api-impl/android/view/accessibility/AccessibilityManager.java b/src/api-impl/android/view/accessibility/AccessibilityManager.java index adf1a902..f4984bed 100644 --- a/src/api-impl/android/view/accessibility/AccessibilityManager.java +++ b/src/api-impl/android/view/accessibility/AccessibilityManager.java @@ -1,5 +1,16 @@ package android.view.accessibility; +import java.util.ArrayList; +import java.util.List; + public class AccessibilityManager { + public boolean isTouchExplorationEnabled() {return false;} + + public boolean isEnabled() {return false;} + + public List getEnabledAccessibilityServiceList(int feedbackTypeFlags) { + return new ArrayList<>(); + } + } diff --git a/src/api-impl/android/view/inputmethod/InputMethodManager.java b/src/api-impl/android/view/inputmethod/InputMethodManager.java index b828624d..79b81afc 100644 --- a/src/api-impl/android/view/inputmethod/InputMethodManager.java +++ b/src/api-impl/android/view/inputmethod/InputMethodManager.java @@ -1,5 +1,9 @@ package android.view.inputmethod; +import android.os.IBinder; + public class InputMethodManager { + public boolean hideSoftInputFromWindow(IBinder windowToken, int flags) {return false;} + } diff --git a/src/api-impl/android/webkit/MimeTypeMap.java b/src/api-impl/android/webkit/MimeTypeMap.java new file mode 100644 index 00000000..8f6e0cc7 --- /dev/null +++ b/src/api-impl/android/webkit/MimeTypeMap.java @@ -0,0 +1,507 @@ +/* + * 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 android.webkit; + +import java.util.HashMap; +import java.util.regex.Pattern; + +/** + * Two-way map that maps MIME-types to file extensions and vice versa. + */ +public class MimeTypeMap { + /** + * Singleton MIME-type map instance: + */ + private static MimeTypeMap sMimeTypeMap; + /** + * MIME-type to file extension mapping: + */ + private HashMap mMimeTypeToExtensionMap; + /** + * File extension to MIME type mapping: + */ + private HashMap mExtensionToMimeTypeMap; + /** + * Creates a new MIME-type map. + */ + private MimeTypeMap() { + mMimeTypeToExtensionMap = new HashMap(); + mExtensionToMimeTypeMap = new HashMap(); + } + + /** + * Returns the file extension or an empty string iff there is no + * extension. This method is a convenience method for obtaining the + * extension of a url and has undefined results for other Strings. + * @param url + * @return The file extension of the given url. + */ + public static String getFileExtensionFromUrl(String url) { + if (url != null && url.length() > 0) { + int query = url.lastIndexOf('?'); + if (query > 0) { + url = url.substring(0, query); + } + int filenamePos = url.lastIndexOf('/'); + String filename = + 0 <= filenamePos ? url.substring(filenamePos + 1) : url; + // if the filename contains special characters, we don't + // consider it valid for our matching purposes: + if (filename.length() > 0 && + Pattern.matches("[a-zA-Z_0-9\\.\\-\\(\\)\\%]+", filename)) { + int dotPos = filename.lastIndexOf('.'); + if (0 <= dotPos) { + return filename.substring(dotPos + 1); + } + } + } + return ""; + } + + /** + * Load an entry into the map. This does not check if the item already + * exists, it trusts the caller! + */ + private void loadEntry(String mimeType, String extension) { + // + // if we have an existing x --> y mapping, we do not want to + // override it with another mapping x --> ? + // this is mostly because of the way the mime-type map below + // is constructed (if a mime type maps to several extensions + // the first extension is considered the most popular and is + // added first; we do not want to overwrite it later). + // + if (!mMimeTypeToExtensionMap.containsKey(mimeType)) { + mMimeTypeToExtensionMap.put(mimeType, extension); + } + mExtensionToMimeTypeMap.put(extension, mimeType); + } + + /** + * Return true if the given MIME type has an entry in the map. + * @param mimeType A MIME type (i.e. text/plain) + * @return True iff there is a mimeType entry in the map. + */ + public boolean hasMimeType(String mimeType) { + if (mimeType != null && mimeType.length() > 0) { + return mMimeTypeToExtensionMap.containsKey(mimeType); + } + return false; + } + + /** + * Return the MIME type for the given extension. + * @param extension A file extension without the leading '.' + * @return The MIME type for the given extension or null iff there is none. + */ + public String getMimeTypeFromExtension(String extension) { + if (extension != null && extension.length() > 0) { + return mExtensionToMimeTypeMap.get(extension); + } + return null; + } + + // Static method called by jni. + private static String mimeTypeFromExtension(String extension) { + return getSingleton().getMimeTypeFromExtension(extension); + } + + /** + * Return true if the given extension has a registered MIME type. + * @param extension A file extension without the leading '.' + * @return True iff there is an extension entry in the map. + */ + public boolean hasExtension(String extension) { + if (extension != null && extension.length() > 0) { + return mExtensionToMimeTypeMap.containsKey(extension); + } + return false; + } + + /** + * Return the registered extension for the given MIME type. Note that some + * MIME types map to multiple extensions. This call will return the most + * common extension for the given MIME type. + * @param mimeType A MIME type (i.e. text/plain) + * @return The extension for the given MIME type or null iff there is none. + */ + public String getExtensionFromMimeType(String mimeType) { + if (mimeType != null && mimeType.length() > 0) { + return mMimeTypeToExtensionMap.get(mimeType); + } + return null; + } + + /** + * Get the singleton instance of MimeTypeMap. + * @return The singleton instance of the MIME-type map. + */ + public static MimeTypeMap getSingleton() { + if (sMimeTypeMap == null) { + sMimeTypeMap = new MimeTypeMap(); + // The following table is based on /etc/mime.types data minus + // chemical/* MIME types and MIME types that don't map to any + // file extensions. We also exclude top-level domain names to + // deal with cases like: + // + // mail.google.com/a/google.com + // + // and "active" MIME types (due to potential security issues). + sMimeTypeMap.loadEntry("application/andrew-inset", "ez"); + sMimeTypeMap.loadEntry("application/dsptype", "tsp"); + sMimeTypeMap.loadEntry("application/futuresplash", "spl"); + sMimeTypeMap.loadEntry("application/hta", "hta"); + sMimeTypeMap.loadEntry("application/mac-binhex40", "hqx"); + sMimeTypeMap.loadEntry("application/mac-compactpro", "cpt"); + sMimeTypeMap.loadEntry("application/mathematica", "nb"); + sMimeTypeMap.loadEntry("application/msaccess", "mdb"); + sMimeTypeMap.loadEntry("application/oda", "oda"); + sMimeTypeMap.loadEntry("application/ogg", "ogg"); + sMimeTypeMap.loadEntry("application/pdf", "pdf"); + sMimeTypeMap.loadEntry("application/pgp-keys", "key"); + sMimeTypeMap.loadEntry("application/pgp-signature", "pgp"); + sMimeTypeMap.loadEntry("application/pics-rules", "prf"); + sMimeTypeMap.loadEntry("application/rar", "rar"); + sMimeTypeMap.loadEntry("application/rdf+xml", "rdf"); + sMimeTypeMap.loadEntry("application/rss+xml", "rss"); + sMimeTypeMap.loadEntry("application/zip", "zip"); + sMimeTypeMap.loadEntry("application/vnd.android.package-archive", + "apk"); + sMimeTypeMap.loadEntry("application/vnd.cinderella", "cdy"); + sMimeTypeMap.loadEntry("application/vnd.ms-pki.stl", "stl"); + sMimeTypeMap.loadEntry( + "application/vnd.oasis.opendocument.database", "odb"); + sMimeTypeMap.loadEntry( + "application/vnd.oasis.opendocument.formula", "odf"); + sMimeTypeMap.loadEntry( + "application/vnd.oasis.opendocument.graphics", "odg"); + sMimeTypeMap.loadEntry( + "application/vnd.oasis.opendocument.graphics-template", + "otg"); + sMimeTypeMap.loadEntry( + "application/vnd.oasis.opendocument.image", "odi"); + sMimeTypeMap.loadEntry( + "application/vnd.oasis.opendocument.spreadsheet", "ods"); + sMimeTypeMap.loadEntry( + "application/vnd.oasis.opendocument.spreadsheet-template", + "ots"); + sMimeTypeMap.loadEntry( + "application/vnd.oasis.opendocument.text", "odt"); + sMimeTypeMap.loadEntry( + "application/vnd.oasis.opendocument.text-master", "odm"); + sMimeTypeMap.loadEntry( + "application/vnd.oasis.opendocument.text-template", "ott"); + sMimeTypeMap.loadEntry( + "application/vnd.oasis.opendocument.text-web", "oth"); + sMimeTypeMap.loadEntry("application/msword", "doc"); + sMimeTypeMap.loadEntry("application/msword", "dot"); + sMimeTypeMap.loadEntry( + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "docx"); + sMimeTypeMap.loadEntry( + "application/vnd.openxmlformats-officedocument.wordprocessingml.template", + "dotx"); + sMimeTypeMap.loadEntry("application/vnd.ms-excel", "xls"); + sMimeTypeMap.loadEntry("application/vnd.ms-excel", "xlt"); + sMimeTypeMap.loadEntry( + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "xlsx"); + sMimeTypeMap.loadEntry( + "application/vnd.openxmlformats-officedocument.spreadsheetml.template", + "xltx"); + sMimeTypeMap.loadEntry("application/vnd.ms-powerpoint", "ppt"); + sMimeTypeMap.loadEntry("application/vnd.ms-powerpoint", "pot"); + sMimeTypeMap.loadEntry("application/vnd.ms-powerpoint", "pps"); + sMimeTypeMap.loadEntry( + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "pptx"); + sMimeTypeMap.loadEntry( + "application/vnd.openxmlformats-officedocument.presentationml.template", + "potx"); + sMimeTypeMap.loadEntry( + "application/vnd.openxmlformats-officedocument.presentationml.slideshow", + "ppsx"); + sMimeTypeMap.loadEntry("application/vnd.rim.cod", "cod"); + sMimeTypeMap.loadEntry("application/vnd.smaf", "mmf"); + sMimeTypeMap.loadEntry("application/vnd.stardivision.calc", "sdc"); + sMimeTypeMap.loadEntry("application/vnd.stardivision.draw", "sda"); + sMimeTypeMap.loadEntry( + "application/vnd.stardivision.impress", "sdd"); + sMimeTypeMap.loadEntry( + "application/vnd.stardivision.impress", "sdp"); + sMimeTypeMap.loadEntry("application/vnd.stardivision.math", "smf"); + sMimeTypeMap.loadEntry("application/vnd.stardivision.writer", + "sdw"); + sMimeTypeMap.loadEntry("application/vnd.stardivision.writer", + "vor"); + sMimeTypeMap.loadEntry( + "application/vnd.stardivision.writer-global", "sgl"); + sMimeTypeMap.loadEntry("application/vnd.sun.xml.calc", "sxc"); + sMimeTypeMap.loadEntry( + "application/vnd.sun.xml.calc.template", "stc"); + sMimeTypeMap.loadEntry("application/vnd.sun.xml.draw", "sxd"); + sMimeTypeMap.loadEntry( + "application/vnd.sun.xml.draw.template", "std"); + sMimeTypeMap.loadEntry("application/vnd.sun.xml.impress", "sxi"); + sMimeTypeMap.loadEntry( + "application/vnd.sun.xml.impress.template", "sti"); + sMimeTypeMap.loadEntry("application/vnd.sun.xml.math", "sxm"); + sMimeTypeMap.loadEntry("application/vnd.sun.xml.writer", "sxw"); + sMimeTypeMap.loadEntry( + "application/vnd.sun.xml.writer.global", "sxg"); + sMimeTypeMap.loadEntry( + "application/vnd.sun.xml.writer.template", "stw"); + sMimeTypeMap.loadEntry("application/vnd.visio", "vsd"); + sMimeTypeMap.loadEntry("application/x-abiword", "abw"); + sMimeTypeMap.loadEntry("application/x-apple-diskimage", "dmg"); + sMimeTypeMap.loadEntry("application/x-bcpio", "bcpio"); + sMimeTypeMap.loadEntry("application/x-bittorrent", "torrent"); + sMimeTypeMap.loadEntry("application/x-cdf", "cdf"); + sMimeTypeMap.loadEntry("application/x-cdlink", "vcd"); + sMimeTypeMap.loadEntry("application/x-chess-pgn", "pgn"); + sMimeTypeMap.loadEntry("application/x-cpio", "cpio"); + sMimeTypeMap.loadEntry("application/x-debian-package", "deb"); + sMimeTypeMap.loadEntry("application/x-debian-package", "udeb"); + sMimeTypeMap.loadEntry("application/x-director", "dcr"); + sMimeTypeMap.loadEntry("application/x-director", "dir"); + sMimeTypeMap.loadEntry("application/x-director", "dxr"); + sMimeTypeMap.loadEntry("application/x-dms", "dms"); + sMimeTypeMap.loadEntry("application/x-doom", "wad"); + sMimeTypeMap.loadEntry("application/x-dvi", "dvi"); + sMimeTypeMap.loadEntry("application/x-flac", "flac"); + sMimeTypeMap.loadEntry("application/x-font", "pfa"); + sMimeTypeMap.loadEntry("application/x-font", "pfb"); + sMimeTypeMap.loadEntry("application/x-font", "gsf"); + sMimeTypeMap.loadEntry("application/x-font", "pcf"); + sMimeTypeMap.loadEntry("application/x-font", "pcf.Z"); + sMimeTypeMap.loadEntry("application/x-freemind", "mm"); + sMimeTypeMap.loadEntry("application/x-futuresplash", "spl"); + sMimeTypeMap.loadEntry("application/x-gnumeric", "gnumeric"); + sMimeTypeMap.loadEntry("application/x-go-sgf", "sgf"); + sMimeTypeMap.loadEntry("application/x-graphing-calculator", "gcf"); + sMimeTypeMap.loadEntry("application/x-gtar", "gtar"); + sMimeTypeMap.loadEntry("application/x-gtar", "tgz"); + sMimeTypeMap.loadEntry("application/x-gtar", "taz"); + sMimeTypeMap.loadEntry("application/x-hdf", "hdf"); + sMimeTypeMap.loadEntry("application/x-ica", "ica"); + sMimeTypeMap.loadEntry("application/x-internet-signup", "ins"); + sMimeTypeMap.loadEntry("application/x-internet-signup", "isp"); + sMimeTypeMap.loadEntry("application/x-iphone", "iii"); + sMimeTypeMap.loadEntry("application/x-iso9660-image", "iso"); + sMimeTypeMap.loadEntry("application/x-jmol", "jmz"); + sMimeTypeMap.loadEntry("application/x-kchart", "chrt"); + sMimeTypeMap.loadEntry("application/x-killustrator", "kil"); + sMimeTypeMap.loadEntry("application/x-koan", "skp"); + sMimeTypeMap.loadEntry("application/x-koan", "skd"); + sMimeTypeMap.loadEntry("application/x-koan", "skt"); + sMimeTypeMap.loadEntry("application/x-koan", "skm"); + sMimeTypeMap.loadEntry("application/x-kpresenter", "kpr"); + sMimeTypeMap.loadEntry("application/x-kpresenter", "kpt"); + sMimeTypeMap.loadEntry("application/x-kspread", "ksp"); + sMimeTypeMap.loadEntry("application/x-kword", "kwd"); + sMimeTypeMap.loadEntry("application/x-kword", "kwt"); + sMimeTypeMap.loadEntry("application/x-latex", "latex"); + sMimeTypeMap.loadEntry("application/x-lha", "lha"); + sMimeTypeMap.loadEntry("application/x-lzh", "lzh"); + sMimeTypeMap.loadEntry("application/x-lzx", "lzx"); + sMimeTypeMap.loadEntry("application/x-maker", "frm"); + sMimeTypeMap.loadEntry("application/x-maker", "maker"); + sMimeTypeMap.loadEntry("application/x-maker", "frame"); + sMimeTypeMap.loadEntry("application/x-maker", "fb"); + sMimeTypeMap.loadEntry("application/x-maker", "book"); + sMimeTypeMap.loadEntry("application/x-maker", "fbdoc"); + sMimeTypeMap.loadEntry("application/x-mif", "mif"); + sMimeTypeMap.loadEntry("application/x-ms-wmd", "wmd"); + sMimeTypeMap.loadEntry("application/x-ms-wmz", "wmz"); + sMimeTypeMap.loadEntry("application/x-msi", "msi"); + sMimeTypeMap.loadEntry("application/x-ns-proxy-autoconfig", "pac"); + sMimeTypeMap.loadEntry("application/x-nwc", "nwc"); + sMimeTypeMap.loadEntry("application/x-object", "o"); + sMimeTypeMap.loadEntry("application/x-oz-application", "oza"); + sMimeTypeMap.loadEntry("application/x-pkcs12", "p12"); + sMimeTypeMap.loadEntry("application/x-pkcs7-certreqresp", "p7r"); + sMimeTypeMap.loadEntry("application/x-pkcs7-crl", "crl"); + sMimeTypeMap.loadEntry("application/x-quicktimeplayer", "qtl"); + sMimeTypeMap.loadEntry("application/x-shar", "shar"); + sMimeTypeMap.loadEntry("application/x-shockwave-flash", "swf"); + sMimeTypeMap.loadEntry("application/x-stuffit", "sit"); + sMimeTypeMap.loadEntry("application/x-sv4cpio", "sv4cpio"); + sMimeTypeMap.loadEntry("application/x-sv4crc", "sv4crc"); + sMimeTypeMap.loadEntry("application/x-tar", "tar"); + sMimeTypeMap.loadEntry("application/x-texinfo", "texinfo"); + sMimeTypeMap.loadEntry("application/x-texinfo", "texi"); + sMimeTypeMap.loadEntry("application/x-troff", "t"); + sMimeTypeMap.loadEntry("application/x-troff", "roff"); + sMimeTypeMap.loadEntry("application/x-troff-man", "man"); + sMimeTypeMap.loadEntry("application/x-ustar", "ustar"); + sMimeTypeMap.loadEntry("application/x-wais-source", "src"); + sMimeTypeMap.loadEntry("application/x-wingz", "wz"); + sMimeTypeMap.loadEntry("application/x-webarchive", "webarchive"); + sMimeTypeMap.loadEntry("application/x-x509-ca-cert", "crt"); + sMimeTypeMap.loadEntry("application/x-x509-user-cert", "crt"); + sMimeTypeMap.loadEntry("application/x-xcf", "xcf"); + sMimeTypeMap.loadEntry("application/x-xfig", "fig"); + sMimeTypeMap.loadEntry("application/xhtml+xml", "xhtml"); + sMimeTypeMap.loadEntry("audio/3gpp", "3gpp"); + sMimeTypeMap.loadEntry("audio/basic", "snd"); + sMimeTypeMap.loadEntry("audio/midi", "mid"); + sMimeTypeMap.loadEntry("audio/midi", "midi"); + sMimeTypeMap.loadEntry("audio/midi", "kar"); + sMimeTypeMap.loadEntry("audio/mpeg", "mpga"); + sMimeTypeMap.loadEntry("audio/mpeg", "mpega"); + sMimeTypeMap.loadEntry("audio/mpeg", "mp2"); + sMimeTypeMap.loadEntry("audio/mpeg", "mp3"); + sMimeTypeMap.loadEntry("audio/mpeg", "m4a"); + sMimeTypeMap.loadEntry("audio/mpegurl", "m3u"); + sMimeTypeMap.loadEntry("audio/prs.sid", "sid"); + sMimeTypeMap.loadEntry("audio/x-aiff", "aif"); + sMimeTypeMap.loadEntry("audio/x-aiff", "aiff"); + sMimeTypeMap.loadEntry("audio/x-aiff", "aifc"); + sMimeTypeMap.loadEntry("audio/x-gsm", "gsm"); + sMimeTypeMap.loadEntry("audio/x-mpegurl", "m3u"); + sMimeTypeMap.loadEntry("audio/x-ms-wma", "wma"); + sMimeTypeMap.loadEntry("audio/x-ms-wax", "wax"); + sMimeTypeMap.loadEntry("audio/x-pn-realaudio", "ra"); + sMimeTypeMap.loadEntry("audio/x-pn-realaudio", "rm"); + sMimeTypeMap.loadEntry("audio/x-pn-realaudio", "ram"); + sMimeTypeMap.loadEntry("audio/x-realaudio", "ra"); + sMimeTypeMap.loadEntry("audio/x-scpls", "pls"); + sMimeTypeMap.loadEntry("audio/x-sd2", "sd2"); + sMimeTypeMap.loadEntry("audio/x-wav", "wav"); + sMimeTypeMap.loadEntry("image/bmp", "bmp"); + sMimeTypeMap.loadEntry("image/gif", "gif"); + sMimeTypeMap.loadEntry("image/ico", "cur"); + sMimeTypeMap.loadEntry("image/ico", "ico"); + sMimeTypeMap.loadEntry("image/ief", "ief"); + sMimeTypeMap.loadEntry("image/jpeg", "jpeg"); + sMimeTypeMap.loadEntry("image/jpeg", "jpg"); + sMimeTypeMap.loadEntry("image/jpeg", "jpe"); + sMimeTypeMap.loadEntry("image/pcx", "pcx"); + sMimeTypeMap.loadEntry("image/png", "png"); + sMimeTypeMap.loadEntry("image/svg+xml", "svg"); + sMimeTypeMap.loadEntry("image/svg+xml", "svgz"); + sMimeTypeMap.loadEntry("image/tiff", "tiff"); + sMimeTypeMap.loadEntry("image/tiff", "tif"); + sMimeTypeMap.loadEntry("image/vnd.djvu", "djvu"); + sMimeTypeMap.loadEntry("image/vnd.djvu", "djv"); + sMimeTypeMap.loadEntry("image/vnd.wap.wbmp", "wbmp"); + sMimeTypeMap.loadEntry("image/x-cmu-raster", "ras"); + sMimeTypeMap.loadEntry("image/x-coreldraw", "cdr"); + sMimeTypeMap.loadEntry("image/x-coreldrawpattern", "pat"); + sMimeTypeMap.loadEntry("image/x-coreldrawtemplate", "cdt"); + sMimeTypeMap.loadEntry("image/x-corelphotopaint", "cpt"); + sMimeTypeMap.loadEntry("image/x-icon", "ico"); + sMimeTypeMap.loadEntry("image/x-jg", "art"); + sMimeTypeMap.loadEntry("image/x-jng", "jng"); + sMimeTypeMap.loadEntry("image/x-ms-bmp", "bmp"); + sMimeTypeMap.loadEntry("image/x-photoshop", "psd"); + sMimeTypeMap.loadEntry("image/x-portable-anymap", "pnm"); + sMimeTypeMap.loadEntry("image/x-portable-bitmap", "pbm"); + sMimeTypeMap.loadEntry("image/x-portable-graymap", "pgm"); + sMimeTypeMap.loadEntry("image/x-portable-pixmap", "ppm"); + sMimeTypeMap.loadEntry("image/x-rgb", "rgb"); + sMimeTypeMap.loadEntry("image/x-xbitmap", "xbm"); + sMimeTypeMap.loadEntry("image/x-xpixmap", "xpm"); + sMimeTypeMap.loadEntry("image/x-xwindowdump", "xwd"); + sMimeTypeMap.loadEntry("model/iges", "igs"); + sMimeTypeMap.loadEntry("model/iges", "iges"); + sMimeTypeMap.loadEntry("model/mesh", "msh"); + sMimeTypeMap.loadEntry("model/mesh", "mesh"); + sMimeTypeMap.loadEntry("model/mesh", "silo"); + sMimeTypeMap.loadEntry("text/calendar", "ics"); + sMimeTypeMap.loadEntry("text/calendar", "icz"); + sMimeTypeMap.loadEntry("text/comma-separated-values", "csv"); + sMimeTypeMap.loadEntry("text/css", "css"); + sMimeTypeMap.loadEntry("text/html", "htm"); + sMimeTypeMap.loadEntry("text/html", "html"); + sMimeTypeMap.loadEntry("text/h323", "323"); + sMimeTypeMap.loadEntry("text/iuls", "uls"); + sMimeTypeMap.loadEntry("text/mathml", "mml"); + // add it first so it will be the default for ExtensionFromMimeType + sMimeTypeMap.loadEntry("text/plain", "txt"); + sMimeTypeMap.loadEntry("text/plain", "asc"); + sMimeTypeMap.loadEntry("text/plain", "text"); + sMimeTypeMap.loadEntry("text/plain", "diff"); + sMimeTypeMap.loadEntry("text/plain", "po"); // reserve "pot" for vnd.ms-powerpoint + sMimeTypeMap.loadEntry("text/richtext", "rtx"); + sMimeTypeMap.loadEntry("text/rtf", "rtf"); + sMimeTypeMap.loadEntry("text/texmacs", "ts"); + sMimeTypeMap.loadEntry("text/text", "phps"); + sMimeTypeMap.loadEntry("text/tab-separated-values", "tsv"); + sMimeTypeMap.loadEntry("text/xml", "xml"); + sMimeTypeMap.loadEntry("text/x-bibtex", "bib"); + sMimeTypeMap.loadEntry("text/x-boo", "boo"); + sMimeTypeMap.loadEntry("text/x-c++hdr", "h++"); + sMimeTypeMap.loadEntry("text/x-c++hdr", "hpp"); + sMimeTypeMap.loadEntry("text/x-c++hdr", "hxx"); + sMimeTypeMap.loadEntry("text/x-c++hdr", "hh"); + sMimeTypeMap.loadEntry("text/x-c++src", "c++"); + sMimeTypeMap.loadEntry("text/x-c++src", "cpp"); + sMimeTypeMap.loadEntry("text/x-c++src", "cxx"); + sMimeTypeMap.loadEntry("text/x-chdr", "h"); + sMimeTypeMap.loadEntry("text/x-component", "htc"); + sMimeTypeMap.loadEntry("text/x-csh", "csh"); + sMimeTypeMap.loadEntry("text/x-csrc", "c"); + sMimeTypeMap.loadEntry("text/x-dsrc", "d"); + sMimeTypeMap.loadEntry("text/x-haskell", "hs"); + sMimeTypeMap.loadEntry("text/x-java", "java"); + sMimeTypeMap.loadEntry("text/x-literate-haskell", "lhs"); + sMimeTypeMap.loadEntry("text/x-moc", "moc"); + sMimeTypeMap.loadEntry("text/x-pascal", "p"); + sMimeTypeMap.loadEntry("text/x-pascal", "pas"); + sMimeTypeMap.loadEntry("text/x-pcs-gcd", "gcd"); + sMimeTypeMap.loadEntry("text/x-setext", "etx"); + sMimeTypeMap.loadEntry("text/x-tcl", "tcl"); + sMimeTypeMap.loadEntry("text/x-tex", "tex"); + sMimeTypeMap.loadEntry("text/x-tex", "ltx"); + sMimeTypeMap.loadEntry("text/x-tex", "sty"); + sMimeTypeMap.loadEntry("text/x-tex", "cls"); + sMimeTypeMap.loadEntry("text/x-vcalendar", "vcs"); + sMimeTypeMap.loadEntry("text/x-vcard", "vcf"); + sMimeTypeMap.loadEntry("video/3gpp", "3gpp"); + sMimeTypeMap.loadEntry("video/3gpp", "3gp"); + sMimeTypeMap.loadEntry("video/3gpp", "3g2"); + sMimeTypeMap.loadEntry("video/dl", "dl"); + sMimeTypeMap.loadEntry("video/dv", "dif"); + sMimeTypeMap.loadEntry("video/dv", "dv"); + sMimeTypeMap.loadEntry("video/fli", "fli"); + sMimeTypeMap.loadEntry("video/m4v", "m4v"); + sMimeTypeMap.loadEntry("video/mpeg", "mpeg"); + sMimeTypeMap.loadEntry("video/mpeg", "mpg"); + sMimeTypeMap.loadEntry("video/mpeg", "mpe"); + sMimeTypeMap.loadEntry("video/mp4", "mp4"); + sMimeTypeMap.loadEntry("video/mpeg", "VOB"); + sMimeTypeMap.loadEntry("video/quicktime", "qt"); + sMimeTypeMap.loadEntry("video/quicktime", "mov"); + sMimeTypeMap.loadEntry("video/vnd.mpegurl", "mxu"); + sMimeTypeMap.loadEntry("video/x-la-asf", "lsf"); + sMimeTypeMap.loadEntry("video/x-la-asf", "lsx"); + sMimeTypeMap.loadEntry("video/x-mng", "mng"); + sMimeTypeMap.loadEntry("video/x-ms-asf", "asf"); + sMimeTypeMap.loadEntry("video/x-ms-asf", "asx"); + sMimeTypeMap.loadEntry("video/x-ms-wm", "wm"); + sMimeTypeMap.loadEntry("video/x-ms-wmv", "wmv"); + sMimeTypeMap.loadEntry("video/x-ms-wmx", "wmx"); + sMimeTypeMap.loadEntry("video/x-ms-wvx", "wvx"); + sMimeTypeMap.loadEntry("video/x-msvideo", "avi"); + sMimeTypeMap.loadEntry("video/x-sgi-movie", "movie"); + sMimeTypeMap.loadEntry("x-conference/x-cooltalk", "ice"); + sMimeTypeMap.loadEntry("x-epoc/x-sisx-app", "sisx"); + } + return sMimeTypeMap; + } +} diff --git a/src/api-impl/android/widget/Button.java b/src/api-impl/android/widget/Button.java index 54ad69da..ea731b34 100644 --- a/src/api-impl/android/widget/Button.java +++ b/src/api-impl/android/widget/Button.java @@ -3,9 +3,8 @@ package android.widget; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; -import android.view.View; -public class Button extends View { +public class Button extends TextView { public Button(Context context) { super(context); @@ -26,10 +25,14 @@ public class Button extends View { public native final void native_setText(long widget, String text); protected native void native_setOnClickListener(long widget, OnClickListener l); + @Override public final void setText(CharSequence text) { native_setText(widget, String.valueOf(text)); } + @Override + public void setTextSize(float size) {} + @Override public void setOnClickListener(final OnClickListener l) { native_setOnClickListener(widget, l); diff --git a/src/api-impl/android/widget/CheckBox.java b/src/api-impl/android/widget/CheckBox.java new file mode 100644 index 00000000..c351e218 --- /dev/null +++ b/src/api-impl/android/widget/CheckBox.java @@ -0,0 +1,23 @@ +package android.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; + +public class CheckBox extends View { + + public CheckBox(Context context) { + super(context); + } + + public CheckBox(Context context, AttributeSet attributeSet) { + super(context, attributeSet); + } + + public void setChecked(boolean checked) {} + + public void setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener listener) {} + + public boolean isChecked() {return false;} + +} diff --git a/src/api-impl/android/widget/CheckedTextView.java b/src/api-impl/android/widget/CheckedTextView.java new file mode 100644 index 00000000..5275525f --- /dev/null +++ b/src/api-impl/android/widget/CheckedTextView.java @@ -0,0 +1,18 @@ +package android.widget; + +import android.content.Context; +import android.util.AttributeSet; + +public class CheckedTextView extends TextView { + + public CheckedTextView(Context context) { + super(context); + } + + public CheckedTextView(Context context, AttributeSet attributeSet) { + super(context, attributeSet); + } + + public void setChecked(boolean checked) {} + +} diff --git a/src/api-impl/android/widget/CompoundButton.java b/src/api-impl/android/widget/CompoundButton.java index b39d928e..d2456e92 100644 --- a/src/api-impl/android/widget/CompoundButton.java +++ b/src/api-impl/android/widget/CompoundButton.java @@ -4,14 +4,16 @@ import android.content.Context; import android.util.AttributeSet; public abstract class CompoundButton extends Button { - - public CompoundButton(Context context) { - super(context); - } - - public CompoundButton(Context context, AttributeSet attributeSet) { - super(context, attributeSet); - } + + public CompoundButton(Context context) { + super(context); + } + + public CompoundButton(Context context, AttributeSet attributeSet) { + super(context, attributeSet); + } - public static interface OnCheckedChangeListener {} + public static interface OnCheckedChangeListener {} + + public void setOnCheckedChangeListener(OnCheckedChangeListener listener) {} } diff --git a/src/api-impl/android/widget/Filter.java b/src/api-impl/android/widget/Filter.java new file mode 100644 index 00000000..7f2daf85 --- /dev/null +++ b/src/api-impl/android/widget/Filter.java @@ -0,0 +1,303 @@ +/* + * 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 android.widget; + +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.util.Log; +/** + *

A filter constrains data with a filtering pattern.

+ * + *

Filters are usually created by {@link android.widget.Filterable} + * classes.

+ * + *

Filtering operations performed by calling {@link #filter(CharSequence)} or + * {@link #filter(CharSequence, android.widget.Filter.FilterListener)} are + * performed asynchronously. When these methods are called, a filtering request + * is posted in a request queue and processed later. Any call to one of these + * methods will cancel any previous non-executed filtering request.

+ * + * @see android.widget.Filterable + */ +public abstract class Filter { + private static final String LOG_TAG = "Filter"; + + private static final String THREAD_NAME = "Filter"; + private static final int FILTER_TOKEN = 0xD0D0F00D; + private static final int FINISH_TOKEN = 0xDEADBEEF; + private Handler mThreadHandler; + private Handler mResultHandler; + private Delayer mDelayer; + private final Object mLock = new Object(); + + /** + *

Creates a new asynchronous filter.

+ */ + public Filter() { + mResultHandler = new ResultsHandler(); + } + + /** + * Provide an interface that decides how long to delay the message for a given query. Useful + * for heuristics such as posting a delay for the delete key to avoid doing any work while the + * user holds down the delete key. + * + * @param delayer The delayer. + * @hide + */ + public void setDelayer(Delayer delayer) { + synchronized (mLock) { + mDelayer = delayer; + } + } + + /** + *

Starts an asynchronous filtering operation. Calling this method + * cancels all previous non-executed filtering requests and posts a new + * filtering request that will be executed later.

+ * + * @param constraint the constraint used to filter the data + * + * @see #filter(CharSequence, android.widget.Filter.FilterListener) + */ + public final void filter(CharSequence constraint) { + filter(constraint, null); + } + + /** + *

Starts an asynchronous filtering operation. Calling this method + * cancels all previous non-executed filtering requests and posts a new + * filtering request that will be executed later.

+ * + *

Upon completion, the listener is notified.

+ * + * @param constraint the constraint used to filter the data + * @param listener a listener notified upon completion of the operation + * + * @see #filter(CharSequence) + * @see #performFiltering(CharSequence) + * @see #publishResults(CharSequence, android.widget.Filter.FilterResults) + */ + public final void filter(CharSequence constraint, FilterListener listener) { + synchronized (mLock) { + if (mThreadHandler == null) { + HandlerThread thread = new HandlerThread( + THREAD_NAME, android.os.Process.THREAD_PRIORITY_BACKGROUND); + thread.start(); + mThreadHandler = new RequestHandler(thread.getLooper()); + } + final long delay = (mDelayer == null) ? 0 : mDelayer.getPostingDelay(constraint); + + Message message = mThreadHandler.obtainMessage(FILTER_TOKEN); + + RequestArguments args = new RequestArguments(); + // make sure we use an immutable copy of the constraint, so that + // it doesn't change while the filter operation is in progress + args.constraint = constraint != null ? constraint.toString() : null; + args.listener = listener; + message.obj = args; + + mThreadHandler.removeMessages(FILTER_TOKEN); + mThreadHandler.removeMessages(FINISH_TOKEN); + mThreadHandler.sendMessageDelayed(message, delay); + } + } + + /** + *

Invoked in a worker thread to filter the data according to the + * constraint. Subclasses must implement this method to perform the + * filtering operation. Results computed by the filtering operation + * must be returned as a {@link android.widget.Filter.FilterResults} that + * will then be published in the UI thread through + * {@link #publishResults(CharSequence, + * android.widget.Filter.FilterResults)}.

+ * + *

Contract: When the constraint is null, the original + * data must be restored.

+ * + * @param constraint the constraint used to filter the data + * @return the results of the filtering operation + * + * @see #filter(CharSequence, android.widget.Filter.FilterListener) + * @see #publishResults(CharSequence, android.widget.Filter.FilterResults) + * @see android.widget.Filter.FilterResults + */ + protected abstract FilterResults performFiltering(CharSequence constraint); + /** + *

Invoked in the UI thread to publish the filtering results in the + * user interface. Subclasses must implement this method to display the + * results computed in {@link #performFiltering}.

+ * + * @param constraint the constraint used to filter the data + * @param results the results of the filtering operation + * + * @see #filter(CharSequence, android.widget.Filter.FilterListener) + * @see #performFiltering(CharSequence) + * @see android.widget.Filter.FilterResults + */ + protected abstract void publishResults(CharSequence constraint, + FilterResults results); + /** + *

Converts a value from the filtered set into a CharSequence. Subclasses + * should override this method to convert their results. The default + * implementation returns an empty String for null values or the default + * String representation of the value.

+ * + * @param resultValue the value to convert to a CharSequence + * @return a CharSequence representing the value + */ + public CharSequence convertResultToString(Object resultValue) { + return resultValue == null ? "" : resultValue.toString(); + } + /** + *

Holds the results of a filtering operation. The results are the values + * computed by the filtering operation and the number of these values.

+ */ + protected static class FilterResults { + public FilterResults() { + // nothing to see here + } + /** + *

Contains all the values computed by the filtering operation.

+ */ + public Object values; + /** + *

Contains the number of values computed by the filtering + * operation.

+ */ + public int count; + } + /** + *

Listener used to receive a notification upon completion of a filtering + * operation.

+ */ + public static interface FilterListener { + /** + *

Notifies the end of a filtering operation.

+ * + * @param count the number of values computed by the filter + */ + public void onFilterComplete(int count); + } + /** + *

Worker thread handler. When a new filtering request is posted from + * {@link android.widget.Filter#filter(CharSequence, android.widget.Filter.FilterListener)}, + * it is sent to this handler.

+ */ + private class RequestHandler extends Handler { + public RequestHandler(Looper looper) { + super(looper); + } + + /** + *

Handles filtering requests by calling + * {@link Filter#performFiltering} and then sending a message + * with the results to the results handler.

+ * + * @param msg the filtering request + */ + public void handleMessage(Message msg) { + int what = msg.what; + Message message; + switch (what) { + case FILTER_TOKEN: + RequestArguments args = (RequestArguments) msg.obj; + try { + args.results = performFiltering(args.constraint); + } catch (Exception e) { + args.results = new FilterResults(); + Log.w(LOG_TAG, "An exception occured during performFiltering()!", e); + } finally { + message = mResultHandler.obtainMessage(what); + message.obj = args; + message.sendToTarget(); + } + synchronized (mLock) { + if (mThreadHandler != null) { + Message finishMessage = mThreadHandler.obtainMessage(FINISH_TOKEN); + mThreadHandler.sendMessageDelayed(finishMessage, 3000); + } + } + break; + case FINISH_TOKEN: + synchronized (mLock) { + if (mThreadHandler != null) { + mThreadHandler.getLooper().quit(); + mThreadHandler = null; + } + } + break; + } + } + } + /** + *

Handles the results of a filtering operation. The results are + * handled in the UI thread.

+ */ + private class ResultsHandler extends Handler { + /** + *

Messages received from the request handler are processed in the + * UI thread. The processing involves calling + * {@link Filter#publishResults(CharSequence, + * android.widget.Filter.FilterResults)} + * to post the results back in the UI and then notifying the listener, + * if any.

+ * + * @param msg the filtering results + */ + @Override + public void handleMessage(Message msg) { + RequestArguments args = (RequestArguments) msg.obj; + publishResults(args.constraint, args.results); + if (args.listener != null) { + int count = args.results != null ? args.results.count : -1; + args.listener.onFilterComplete(count); + } + } + } + /** + *

Holds the arguments of a filtering request as well as the results + * of the request.

+ */ + private static class RequestArguments { + /** + *

The constraint used to filter the data.

+ */ + CharSequence constraint; + /** + *

The listener to notify upon completion. Can be null.

+ */ + FilterListener listener; + /** + *

The results of the filtering operation.

+ */ + FilterResults results; + } + /** + * @hide + */ + public interface Delayer { + /** + * @param constraint The constraint passed to {@link Filter#filter(CharSequence)} + * @return The delay that should be used for + * {@link Handler#sendMessageDelayed(android.os.Message, long)} + */ + long getPostingDelay(CharSequence constraint); + } +} diff --git a/src/api-impl/android/widget/ImageView.java b/src/api-impl/android/widget/ImageView.java index b55ed0f2..7335f48a 100644 --- a/src/api-impl/android/widget/ImageView.java +++ b/src/api-impl/android/widget/ImageView.java @@ -4,6 +4,7 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; +import android.graphics.PorterDuff; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; @@ -12,6 +13,7 @@ import android.view.View; public class ImageView extends View { private Bitmap bitmap; + private ScaleType scaleType = ScaleType.FIT_CENTER; public ImageView(Context context, AttributeSet attrs) { super(context, attrs); @@ -43,7 +45,13 @@ public class ImageView extends View { } public void setAdjustViewBounds(boolean adjustViewBounds) {} - public void setScaleType(ScaleType scaleType) {} + public void setScaleType(ScaleType scaleType) { + this.scaleType = scaleType; + } + + public ScaleType getScaleType() { + return scaleType; + } public Drawable getDrawable() { return new BitmapDrawable(getContext().getResources(), bitmap); @@ -53,6 +61,11 @@ public class ImageView extends View { public void setImageMatrix(Matrix matrix) {} + public void setImageBitmap(Bitmap bitmap) { + if (bitmap != null) + native_setPixbuf(bitmap.pixbuf); + } + /** * Options for scaling the bounds of an image to the bounds of this view. */ @@ -111,4 +124,6 @@ public class ImageView extends View { } final int nativeInt; } + + public final void setColorFilter(int color, PorterDuff.Mode mode) {} } diff --git a/src/api-impl/android/widget/Switch.java b/src/api-impl/android/widget/Switch.java new file mode 100644 index 00000000..a95ff539 --- /dev/null +++ b/src/api-impl/android/widget/Switch.java @@ -0,0 +1,18 @@ +package android.widget; + +import android.content.Context; +import android.util.AttributeSet; + +public class Switch extends CompoundButton { + + public Switch(Context context) { + super(context); + } + + public Switch(Context context, AttributeSet attributeSet) { + super(context, attributeSet); + } + + public void setChecked(boolean checked) {} + +} diff --git a/src/api-impl/android/widget/TextView.java b/src/api-impl/android/widget/TextView.java index ea0b1ca8..b308cceb 100644 --- a/src/api-impl/android/widget/TextView.java +++ b/src/api-impl/android/widget/TextView.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; import android.graphics.Typeface; +import android.graphics.drawable.Drawable; import android.text.InputFilter; import android.text.TextPaint; import android.text.TextUtils; @@ -91,6 +92,7 @@ public class TextView extends View { } public void addTextChangedListener(TextWatcher watcher) {} + public void removeTextChangedListener(TextWatcher watcher) {} public void setOnEditorActionListener(TextView.OnEditorActionListener l) {} public TransformationMethod getTransformationMethod() { @@ -122,6 +124,20 @@ public class TextView extends View { public int getCompoundPaddingTop() {return 0;} public int getCompoundPaddingBottom() {return 0;} + public CharSequence getText() { + return "FIXME"; + } + + public void setCompoundDrawablePadding(int pad) {} + + public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) {} + + public void setAllCaps(boolean allCaps) {} + + public void setSaveEnabled(boolean enabled) {} + + public final void setAutoLinkMask(int mask) {} + public static interface OnEditorActionListener { } } diff --git a/src/api-impl/meson.build b/src/api-impl/meson.build index b7028cd2..351814a2 100644 --- a/src/api-impl/meson.build +++ b/src/api-impl/meson.build @@ -161,10 +161,13 @@ hax_jar = jar('hax', [ 'android/graphics/drawable/BitmapDrawable.java', 'android/graphics/drawable/ColorDrawable.java', 'android/graphics/drawable/Drawable.java', + 'android/graphics/drawable/DrawableContainer.java', 'android/graphics/drawable/GradientDrawable.java', 'android/graphics/drawable/InsetDrawable.java', 'android/graphics/drawable/LayerDrawable.java', 'android/graphics/drawable/Animatable.java', + 'android/graphics/drawable/ScaleDrawable.java', + 'android/graphics/drawable/StateListDrawable.java', 'android/hardware/display/DisplayManager.java', 'android/hardware/input/InputManager.java', 'android/hardware/SensorEvent.java', @@ -315,6 +318,7 @@ hax_jar = jar('hax', [ 'android/view/ViewManager.java', 'android/view/ViewParent.java', 'android/view/ViewPropertyAnimator.java', + 'android/view/ViewStub.java', 'android/view/ViewTreeObserver.java', 'android/view/Window.java', 'android/view/WindowManagerImpl.java', @@ -327,6 +331,7 @@ hax_jar = jar('hax', [ 'android/view/accessibility/AccessibilityManager.java', 'android/view/textservice/TextServicesManager.java', 'android/webkit/DownloadListener.java', + 'android/webkit/MimeTypeMap.java', 'android/webkit/WebSettings.java', 'android/webkit/WebView.java', 'android/webkit/WebViewClient.java', @@ -337,9 +342,12 @@ hax_jar = jar('hax', [ 'android/widget/BaseAdapter.java', 'android/widget/Button.java', 'android/widget/Checkable.java', + 'android/widget/CheckBox.java', + 'android/widget/CheckedTextView.java', 'android/widget/CompoundButton.java', 'android/widget/EdgeEffect.java', 'android/widget/EditText.java', + 'android/widget/Filter.java', 'android/widget/FrameLayout.java', 'android/widget/HorizontalScrollView.java', 'android/widget/ImageButton.java', @@ -357,6 +365,7 @@ hax_jar = jar('hax', [ 'android/widget/SeekBar.java', 'android/widget/Spinner.java', 'android/widget/SpinnerAdapter.java', + 'android/widget/Switch.java', 'android/widget/TextView.java', 'com/android/internal/Manifest.java', 'com/android/internal/R.java',