diff options
25 files changed, 612 insertions, 141 deletions
diff --git a/api/current.txt b/api/current.txt index f3111a6..b11f30d 100644 --- a/api/current.txt +++ b/api/current.txt @@ -414,7 +414,7 @@ package android { field public static final int ems = 16843096; // 0x1010158 field public static final deprecated int enabled = 16842766; // 0x101000e field public static final int endColor = 16843166; // 0x101019e - field public static final int endYear = 16843133; // 0x101017d + field public static final deprecated int endYear = 16843133; // 0x101017d field public static final int enterFadeDuration = 16843532; // 0x101030c field public static final int entries = 16842930; // 0x10100b2 field public static final int entryValues = 16843256; // 0x10101f8 @@ -888,7 +888,7 @@ package android { field public static final int starStyle = 16842882; // 0x1010082 field public static final int startColor = 16843165; // 0x101019d field public static final int startOffset = 16843198; // 0x10101be - field public static final int startYear = 16843132; // 0x101017c + field public static final deprecated int startYear = 16843132; // 0x101017c field public static final int stateNotNeeded = 16842774; // 0x1010016 field public static final int state_above_anchor = 16842922; // 0x10100aa field public static final int state_accelerated = 16843547; // 0x101031b @@ -7276,6 +7276,7 @@ package android.database.sqlite { method public android.database.sqlite.SQLiteStatement compileStatement(java.lang.String) throws android.database.SQLException; method public static android.database.sqlite.SQLiteDatabase create(android.database.sqlite.SQLiteDatabase.CursorFactory); method public int delete(java.lang.String, java.lang.String, java.lang.String[]); + method public static boolean deleteDatabase(java.io.File); method public boolean enableWriteAheadLogging(); method public void endTransaction(); method public void execSQL(java.lang.String) throws android.database.SQLException; @@ -16002,6 +16003,7 @@ package android.provider { field public static final java.lang.String CALENDAR_ID = "calendar_id"; field public static final java.lang.String CAN_INVITE_OTHERS = "canInviteOthers"; field public static final java.lang.String DESCRIPTION = "description"; + field public static final java.lang.String DISPLAY_COLOR = "displayColor"; field public static final java.lang.String DTEND = "dtend"; field public static final java.lang.String DTSTART = "dtstart"; field public static final java.lang.String DURATION = "duration"; @@ -26111,17 +26113,36 @@ package android.widget { ctor public CalendarView(android.content.Context, android.util.AttributeSet); ctor public CalendarView(android.content.Context, android.util.AttributeSet, int); method public long getDate(); + method public int getDateTextAppearance(); method public int getFirstDayOfWeek(); + method public int getFocusedMonthDateColor(); method public long getMaxDate(); method public long getMinDate(); + method public android.graphics.drawable.Drawable getSelectedDateVerticalBar(); + method public int getSelectedWeekBackgroundColor(); method public boolean getShowWeekNumber(); + method public int getShownWeekCount(); + method public int getUnfocusedMonthDateColor(); + method public int getWeekDayTextAppearance(); + method public int getWeekNumberColor(); + method public int getWeekSeparatorLineColor(); method public void setDate(long); method public void setDate(long, boolean, boolean); + method public void setDateTextAppearance(int); method public void setFirstDayOfWeek(int); + method public void setFocusedMonthDateColor(int); method public void setMaxDate(long); method public void setMinDate(long); method public void setOnDateChangeListener(android.widget.CalendarView.OnDateChangeListener); + method public void setSelectedDateVerticalBar(int); + method public void setSelectedDateVerticalBar(android.graphics.drawable.Drawable); + method public void setSelectedWeekBackgroundColor(int); method public void setShowWeekNumber(boolean); + method public void setShownWeekCount(int); + method public void setUnfocusedMonthDateColor(int); + method public void setWeekDayTextAppearance(int); + method public void setWeekNumberColor(int); + method public void setWeekSeparatorLineColor(int); } public static abstract interface CalendarView.OnDateChangeListener { diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 6d5cce5..e348b87 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -785,7 +785,7 @@ class ContextImpl extends Context { public boolean deleteDatabase(String name) { try { File f = validateFilePath(name, false); - return f.delete(); + return SQLiteDatabase.deleteDatabase(f); } catch (Exception e) { } return false; diff --git a/core/java/android/database/sqlite/SQLiteConnection.java b/core/java/android/database/sqlite/SQLiteConnection.java index 1900301..d16f29f 100644 --- a/core/java/android/database/sqlite/SQLiteConnection.java +++ b/core/java/android/database/sqlite/SQLiteConnection.java @@ -208,11 +208,11 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen mConfiguration.label, SQLiteDebug.DEBUG_SQL_STATEMENTS, SQLiteDebug.DEBUG_SQL_TIME); - setSyncMode(); setPageSize(); - setAutoCheckpointInterval(); - setJournalSizeLimit(); + setSyncModeFromConfiguration(); setJournalModeFromConfiguration(); + setJournalSizeLimit(); + setAutoCheckpointInterval(); setLocaleFromConfiguration(); } @@ -236,12 +236,6 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen } } - private void setSyncMode() { - if (!mConfiguration.isInMemoryDb()) { - execute("PRAGMA synchronous=" + SQLiteGlobal.getSyncMode(), null, null); - } - } - private void setPageSize() { if (!mConfiguration.isInMemoryDb()) { execute("PRAGMA page_size=" + SQLiteGlobal.getDefaultPageSize(), null, null); @@ -262,6 +256,12 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen } } + private void setSyncModeFromConfiguration() { + if (!mConfiguration.isInMemoryDb()) { + execute("PRAGMA synchronous=" + mConfiguration.syncMode, null, null); + } + } + private void setJournalModeFromConfiguration() { if (!mConfiguration.isInMemoryDb()) { String result = executeForString("PRAGMA journal_mode=" + mConfiguration.journalMode, @@ -290,6 +290,8 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen } // Remember what changed. + boolean syncModeChanged = !configuration.syncMode.equalsIgnoreCase( + mConfiguration.syncMode); boolean journalModeChanged = !configuration.journalMode.equalsIgnoreCase( mConfiguration.journalMode); boolean localeChanged = !configuration.locale.equals(mConfiguration.locale); @@ -300,6 +302,11 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen // Update prepared statement cache size. mPreparedStatementCache.resize(configuration.maxSqlCacheSize); + // Update sync mode. + if (syncModeChanged) { + setSyncModeFromConfiguration(); + } + // Update journal mode. if (journalModeChanged) { setJournalModeFromConfiguration(); diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index 515658f..04ee142 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -36,6 +36,7 @@ import android.util.Printer; import dalvik.system.CloseGuard; import java.io.File; +import java.io.FileFilter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -678,6 +679,40 @@ public class SQLiteDatabase extends SQLiteClosable { } /** + * Deletes a database including its journal file and other auxiliary files + * that may have been created by the database engine. + * + * @param file The database file path. + * @return True if the database was successfully deleted. + */ + public static boolean deleteDatabase(File file) { + if (file == null) { + throw new IllegalArgumentException("file must not be null"); + } + + boolean deleted = false; + deleted |= file.delete(); + deleted |= new File(file.getPath() + "-journal").delete(); + deleted |= new File(file.getPath() + "-shm").delete(); + deleted |= new File(file.getPath() + "-wal").delete(); + + File dir = file.getParentFile(); + if (dir != null) { + final String prefix = file.getName() + "-mj"; + final FileFilter filter = new FileFilter() { + @Override + public boolean accept(File candidate) { + return candidate.getName().startsWith(prefix); + } + }; + for (File masterJournal : dir.listFiles(filter)) { + deleted |= masterJournal.delete(); + } + } + return deleted; + } + + /** * Reopens the database in read-write mode. * If the database is already read-write, does nothing. * @@ -1746,6 +1781,7 @@ public class SQLiteDatabase extends SQLiteClosable { mIsWALEnabledLocked = true; mConfigurationLocked.maxConnectionPoolSize = SQLiteGlobal.getWALConnectionPoolSize(); + mConfigurationLocked.syncMode = SQLiteGlobal.getWALSyncMode(); mConfigurationLocked.journalMode = "WAL"; mConnectionPoolLocked.reconfigure(mConfigurationLocked); } @@ -1766,6 +1802,7 @@ public class SQLiteDatabase extends SQLiteClosable { mIsWALEnabledLocked = false; mConfigurationLocked.maxConnectionPoolSize = 1; + mConfigurationLocked.syncMode = SQLiteGlobal.getDefaultSyncMode(); mConfigurationLocked.journalMode = SQLiteGlobal.getDefaultJournalMode(); mConnectionPoolLocked.reconfigure(mConfigurationLocked); } diff --git a/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java b/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java index 32a1bcb..efbcaca 100644 --- a/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java +++ b/core/java/android/database/sqlite/SQLiteDatabaseConfiguration.java @@ -85,6 +85,13 @@ public final class SQLiteDatabaseConfiguration { public Locale locale; /** + * The database synchronization mode. + * + * Default is {@link SQLiteGlobal#getDefaultSyncMode()}. + */ + public String syncMode; + + /** * The database journal mode. * * Default is {@link SQLiteGlobal#getDefaultJournalMode()}. @@ -117,6 +124,7 @@ public final class SQLiteDatabaseConfiguration { maxConnectionPoolSize = 1; maxSqlCacheSize = 25; locale = Locale.getDefault(); + syncMode = SQLiteGlobal.getDefaultSyncMode(); journalMode = SQLiteGlobal.getDefaultJournalMode(); } @@ -154,6 +162,7 @@ public final class SQLiteDatabaseConfiguration { maxConnectionPoolSize = other.maxConnectionPoolSize; maxSqlCacheSize = other.maxSqlCacheSize; locale = other.locale; + syncMode = other.syncMode; journalMode = other.journalMode; customFunctions.clear(); customFunctions.addAll(other.customFunctions); diff --git a/core/java/android/database/sqlite/SQLiteGlobal.java b/core/java/android/database/sqlite/SQLiteGlobal.java index af0cf45..5d8f80e 100644 --- a/core/java/android/database/sqlite/SQLiteGlobal.java +++ b/core/java/android/database/sqlite/SQLiteGlobal.java @@ -83,11 +83,19 @@ public final class SQLiteGlobal { } /** - * Gets the database synchronization mode. + * Gets the default database synchronization mode when WAL is not in use. */ - public static String getSyncMode() { + public static String getDefaultSyncMode() { return Resources.getSystem().getString( - com.android.internal.R.string.db_sync_mode); + com.android.internal.R.string.db_default_sync_mode); + } + + /** + * Gets the database synchronization mode when in WAL mode. + */ + public static String getWALSyncMode() { + return Resources.getSystem().getString( + com.android.internal.R.string.db_wal_sync_mode); } /** @@ -99,7 +107,7 @@ public final class SQLiteGlobal { } /** - * Gets the default connection pool size when in WAL mode. + * Gets the connection pool size when in WAL mode. */ public static int getWALConnectionPoolSize() { return Math.max(2, Resources.getSystem().getInteger( diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java index fa59b32..83799c4 100644 --- a/core/java/android/provider/CalendarContract.java +++ b/core/java/android/provider/CalendarContract.java @@ -856,6 +856,17 @@ public final class CalendarContract { public static final String EVENT_COLOR_KEY = "eventColor_index"; /** + * This will be {@link #EVENT_COLOR} if it is not null; otherwise, this will be + * {@link Calendars#CALENDAR_COLOR}. + * Read-only value. To modify, write to {@link #EVENT_COLOR} or + * {@link Calendars#CALENDAR_COLOR} directly. + *<P> + * Type: INTEGER + *</P> + */ + public static final String DISPLAY_COLOR = "displayColor"; + + /** * The event status. Column name. * <P>Type: INTEGER (one of {@link #STATUS_TENTATIVE}...)</P> */ diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java index 76fc8f4..4983003 100644 --- a/core/java/android/webkit/WebViewClassic.java +++ b/core/java/android/webkit/WebViewClassic.java @@ -10314,6 +10314,11 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc return nativeGetCursorRingBounds(); } + // Called via JNI + private void postInvalidate() { + mWebView.postInvalidate(); + } + private native int nativeCacheHitFramePointer(); private native boolean nativeCacheHitIsPlugin(); private native Rect nativeCacheHitNodeBounds(); diff --git a/core/java/android/widget/CalendarView.java b/core/java/android/widget/CalendarView.java index 85252af..2a74f6a 100644 --- a/core/java/android/widget/CalendarView.java +++ b/core/java/android/widget/CalendarView.java @@ -154,21 +154,25 @@ public class CalendarView extends FrameLayout { private final int mWeekSeperatorLineWidth; - private final int mDateTextSize; + private int mDateTextSize; - private final Drawable mSelectedDateVerticalBar; + private Drawable mSelectedDateVerticalBar; private final int mSelectedDateVerticalBarWidth; - private final int mSelectedWeekBackgroundColor; + private int mSelectedWeekBackgroundColor; - private final int mFocusedMonthDateColor; + private int mFocusedMonthDateColor; - private final int mUnfocusedMonthDateColor; + private int mUnfocusedMonthDateColor; - private final int mWeekSeparatorLineColor; + private int mWeekSeparatorLineColor; - private final int mWeekNumberColor; + private int mWeekNumberColor; + + private int mWeekDayTextAppearanceResId; + + private int mDateTextAppearanceResId; /** * The top offset of the weeks list. @@ -366,15 +370,11 @@ public class CalendarView extends FrameLayout { mSelectedDateVerticalBar = attributesArray.getDrawable( R.styleable.CalendarView_selectedDateVerticalBar); - int dateTextAppearanceResId= attributesArray.getResourceId( + mDateTextAppearanceResId = attributesArray.getResourceId( R.styleable.CalendarView_dateTextAppearance, R.style.TextAppearance_Small); - TypedArray dateTextAppearance = context.obtainStyledAttributes(dateTextAppearanceResId, - com.android.internal.R.styleable.TextAppearance); - mDateTextSize = dateTextAppearance.getDimensionPixelSize( - R.styleable.TextAppearance_textSize, DEFAULT_DATE_TEXT_SIZE); - dateTextAppearance.recycle(); + updateDateTextSize(); - int weekDayTextAppearanceResId = attributesArray.getResourceId( + mWeekDayTextAppearanceResId = attributesArray.getResourceId( R.styleable.CalendarView_weekDayTextAppearance, DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID); attributesArray.recycle(); @@ -400,7 +400,7 @@ public class CalendarView extends FrameLayout { mDayNamesHeader = (ViewGroup) content.findViewById(com.android.internal.R.id.day_names); mMonthName = (TextView) content.findViewById(com.android.internal.R.id.month_name); - setUpHeader(weekDayTextAppearanceResId); + setUpHeader(); setUpListView(); setUpAdapter(); @@ -417,6 +417,235 @@ public class CalendarView extends FrameLayout { invalidate(); } + /** + * Sets the number of weeks to be shown. + * + * @param count The shown week count. + */ + public void setShownWeekCount(int count) { + if (mShownWeekCount != count) { + mShownWeekCount = count; + invalidate(); + } + } + + /** + * Gets the number of weeks to be shown. + * + * @return The shown week count. + */ + public int getShownWeekCount() { + return mShownWeekCount; + } + + /** + * Sets the background color for the selected week. + * + * @param color The week background color. + */ + public void setSelectedWeekBackgroundColor(int color) { + if (mSelectedWeekBackgroundColor != color) { + mSelectedWeekBackgroundColor = color; + final int childCount = mListView.getChildCount(); + for (int i = 0; i < childCount; i++) { + WeekView weekView = (WeekView) mListView.getChildAt(i); + if (weekView.mHasSelectedDay) { + weekView.invalidate(); + } + } + } + } + + /** + * Gets the background color for the selected week. + * + * @return The week background color. + */ + public int getSelectedWeekBackgroundColor() { + return mSelectedWeekBackgroundColor; + } + + /** + * Sets the color for the dates of the focused month. + * + * @param color The focused month date color. + */ + public void setFocusedMonthDateColor(int color) { + if (mFocusedMonthDateColor != color) { + mFocusedMonthDateColor = color; + final int childCount = mListView.getChildCount(); + for (int i = 0; i < childCount; i++) { + WeekView weekView = (WeekView) mListView.getChildAt(i); + if (weekView.mHasFocusedDay) { + weekView.invalidate(); + } + } + } + } + + /** + * Gets the color for the dates in the focused month. + * + * @return The focused month date color. + */ + public int getFocusedMonthDateColor() { + return mFocusedMonthDateColor; + } + + /** + * Sets the color for the dates of a not focused month. + * + * @param color A not focused month date color. + */ + public void setUnfocusedMonthDateColor(int color) { + if (mUnfocusedMonthDateColor != color) { + mUnfocusedMonthDateColor = color; + final int childCount = mListView.getChildCount(); + for (int i = 0; i < childCount; i++) { + WeekView weekView = (WeekView) mListView.getChildAt(i); + if (weekView.mHasUnfocusedDay) { + weekView.invalidate(); + } + } + } + } + + /** + * Gets the color for the dates in a not focused month. + * + * @return A not focused month date color. + */ + public int getUnfocusedMonthDateColor() { + return mFocusedMonthDateColor; + } + + /** + * Sets the color for the week numbers. + * + * @param color The week number color. + */ + public void setWeekNumberColor(int color) { + if (mWeekNumberColor != color) { + mWeekNumberColor = color; + if (mShowWeekNumber) { + invalidateAllWeekViews(); + } + } + } + + /** + * Gets the color for the week numbers. + * + * @return The week number color. + */ + public int getWeekNumberColor() { + return mWeekNumberColor; + } + + /** + * Sets the color for the separator line between weeks. + * + * @param color The week separator color. + */ + public void setWeekSeparatorLineColor(int color) { + if (mWeekSeparatorLineColor != color) { + mWeekSeparatorLineColor = color; + invalidateAllWeekViews(); + } + } + + /** + * Gets the color for the separator line between weeks. + * + * @return The week separator color. + */ + public int getWeekSeparatorLineColor() { + return mWeekSeparatorLineColor; + } + + /** + * Sets the drawable for the vertical bar shown at the beginning and at + * the end of the selected date. + * + * @param resourceId The vertical bar drawable resource id. + */ + public void setSelectedDateVerticalBar(int resourceId) { + Drawable drawable = getResources().getDrawable(resourceId); + setSelectedDateVerticalBar(drawable); + } + + /** + * Sets the drawable for the vertical bar shown at the beginning and at + * the end of the selected date. + * + * @param drawable The vertical bar drawable. + */ + public void setSelectedDateVerticalBar(Drawable drawable) { + if (mSelectedDateVerticalBar != drawable) { + mSelectedDateVerticalBar = drawable; + final int childCount = mListView.getChildCount(); + for (int i = 0; i < childCount; i++) { + WeekView weekView = (WeekView) mListView.getChildAt(i); + if (weekView.mHasSelectedDay) { + weekView.invalidate(); + } + } + } + } + + /** + * Gets the drawable for the vertical bar shown at the beginning and at + * the end of the selected date. + * + * @return The vertical bar drawable. + */ + public Drawable getSelectedDateVerticalBar() { + return mSelectedDateVerticalBar; + } + + /** + * Sets the text appearance for the week day abbreviation of the calendar header. + * + * @param resourceId The text appearance resource id. + */ + public void setWeekDayTextAppearance(int resourceId) { + if (mWeekDayTextAppearanceResId != resourceId) { + mWeekDayTextAppearanceResId = resourceId; + setUpHeader(); + } + } + + /** + * Gets the text appearance for the week day abbreviation of the calendar header. + * + * @return The text appearance resource id. + */ + public int getWeekDayTextAppearance() { + return mWeekDayTextAppearanceResId; + } + + /** + * Sets the text appearance for the calendar dates. + * + * @param resourceId The text appearance resource id. + */ + public void setDateTextAppearance(int resourceId) { + if (mDateTextAppearanceResId != resourceId) { + mDateTextAppearanceResId = resourceId; + updateDateTextSize(); + invalidateAllWeekViews(); + } + } + + /** + * Gets the text appearance for the calendar dates. + * + * @return The text appearance resource id. + */ + public int getDateTextAppearance() { + return mDateTextAppearanceResId; + } + @Override public void setEnabled(boolean enabled) { mListView.setEnabled(enabled); @@ -545,7 +774,7 @@ public class CalendarView extends FrameLayout { } mShowWeekNumber = showWeekNumber; mAdapter.notifyDataSetChanged(); - setUpHeader(DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID); + setUpHeader(); } /** @@ -594,7 +823,7 @@ public class CalendarView extends FrameLayout { mFirstDayOfWeek = firstDayOfWeek; mAdapter.init(); mAdapter.notifyDataSetChanged(); - setUpHeader(DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID); + setUpHeader(); } /** @@ -655,6 +884,25 @@ public class CalendarView extends FrameLayout { goTo(mTempDate, animate, true, center); } + private void updateDateTextSize() { + TypedArray dateTextAppearance = getContext().obtainStyledAttributes( + mDateTextAppearanceResId, R.styleable.TextAppearance); + mDateTextSize = dateTextAppearance.getDimensionPixelSize( + R.styleable.TextAppearance_textSize, DEFAULT_DATE_TEXT_SIZE); + dateTextAppearance.recycle(); + } + + /** + * Invalidates all week views. + */ + private void invalidateAllWeekViews() { + final int childCount = mListView.getChildCount(); + for (int i = 0; i < childCount; i++) { + View view = mListView.getChildAt(i); + view.invalidate(); + } + } + /** * Sets the current locale. * @@ -727,7 +975,7 @@ public class CalendarView extends FrameLayout { /** * Sets up the strings to be used by the header. */ - private void setUpHeader(int weekDayTextAppearanceResId) { + private void setUpHeader() { mDayLabels = new String[mDaysPerWeek]; for (int i = mFirstDayOfWeek, count = mFirstDayOfWeek + mDaysPerWeek; i < count; i++) { int calendarDay = (i > Calendar.SATURDAY) ? i - Calendar.SATURDAY : i; @@ -743,8 +991,8 @@ public class CalendarView extends FrameLayout { } for (int i = 1, count = mDayNamesHeader.getChildCount(); i < count; i++) { label = (TextView) mDayNamesHeader.getChildAt(i); - if (weekDayTextAppearanceResId > -1) { - label.setTextAppearance(mContext, weekDayTextAppearanceResId); + if (mWeekDayTextAppearanceResId > -1) { + label.setTextAppearance(mContext, mWeekDayTextAppearanceResId); } if (i < mDaysPerWeek + 1) { label.setText(mDayLabels[i - 1]); @@ -1198,6 +1446,12 @@ public class CalendarView extends FrameLayout { // Quick lookup for checking which days are in the focus month private boolean[] mFocusDay; + // Whether this view has a focused day. + private boolean mHasFocusedDay; + + // Whether this view has only focused days. + private boolean mHasUnfocusedDay; + // The first day displayed by this item private Calendar mFirstDay; @@ -1235,11 +1489,8 @@ public class CalendarView extends FrameLayout { public WeekView(Context context) { super(context); - mHeight = (mListView.getHeight() - mListView.getPaddingTop() - mListView - .getPaddingBottom()) / mShownWeekCount; - // Sets up any standard paints that will be used - setPaintProperties(); + initilaizePaints(); } /** @@ -1281,8 +1532,12 @@ public class CalendarView extends FrameLayout { mFirstDay = (Calendar) mTempDate.clone(); mMonthOfFirstWeekDay = mTempDate.get(Calendar.MONTH); + mHasUnfocusedDay = true; for (; i < mNumCells; i++) { - mFocusDay[i] = (mTempDate.get(Calendar.MONTH) == focusedMonth); + final boolean isFocusedDay = (mTempDate.get(Calendar.MONTH) == focusedMonth); + mFocusDay[i] = isFocusedDay; + mHasFocusedDay |= isFocusedDay; + mHasUnfocusedDay &= !isFocusedDay; // do not draw dates outside the valid range to avoid user confusion if (mTempDate.before(mMinDate) || mTempDate.after(mMaxDate)) { mDayNumbers[i] = ""; @@ -1302,18 +1557,15 @@ public class CalendarView extends FrameLayout { } /** - * Sets up the text and style properties for painting. + * Initialize the paint isntances. */ - private void setPaintProperties() { + private void initilaizePaints() { mDrawPaint.setFakeBoldText(false); mDrawPaint.setAntiAlias(true); - mDrawPaint.setTextSize(mDateTextSize); mDrawPaint.setStyle(Style.FILL); mMonthNumDrawPaint.setFakeBoldText(true); mMonthNumDrawPaint.setAntiAlias(true); - mMonthNumDrawPaint.setTextSize(mDateTextSize); - mMonthNumDrawPaint.setColor(mFocusedMonthDateColor); mMonthNumDrawPaint.setStyle(Style.FILL); mMonthNumDrawPaint.setTextAlign(Align.CENTER); } @@ -1369,7 +1621,7 @@ public class CalendarView extends FrameLayout { @Override protected void onDraw(Canvas canvas) { drawBackground(canvas); - drawWeekNumbers(canvas); + drawWeekNumbersAndDates(canvas); drawWeekSeparators(canvas); drawSelectedDateVerticalBars(canvas); } @@ -1401,12 +1653,13 @@ public class CalendarView extends FrameLayout { * * @param canvas The canvas to draw on */ - private void drawWeekNumbers(Canvas canvas) { + private void drawWeekNumbersAndDates(Canvas canvas) { float textHeight = mDrawPaint.getTextSize(); int y = (int) ((mHeight + textHeight) / 2) - mWeekSeperatorLineWidth; int nDays = mNumCells; mDrawPaint.setTextAlign(Align.CENTER); + mDrawPaint.setTextSize(mDateTextSize); int i = 0; int divisor = 2 * nDays; if (mShowWeekNumber) { @@ -1487,6 +1740,8 @@ public class CalendarView extends FrameLayout { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + mHeight = (mListView.getHeight() - mListView.getPaddingTop() - mListView + .getPaddingBottom()) / mShownWeekCount; setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), mHeight); } } diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index 110c8f3..fd93980 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -162,7 +162,7 @@ public class DatePicker extends FrameLayout { int endYear = attributesArray.getInt(R.styleable.DatePicker_endYear, DEFAULT_END_YEAR); String minDate = attributesArray.getString(R.styleable.DatePicker_minDate); String maxDate = attributesArray.getString(R.styleable.DatePicker_maxDate); - int layoutResourceId = attributesArray.getResourceId(R.styleable.DatePicker_layout, + int layoutResourceId = attributesArray.getResourceId(R.styleable.DatePicker_internalLayout, R.layout.date_picker); attributesArray.recycle(); diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index 6405ee9..3335da0 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -559,17 +559,17 @@ public class NumberPicker extends LinearLayout { getResources().getDisplayMetrics()); mSelectionDividerHeight = attributesArray.getDimensionPixelSize( R.styleable.NumberPicker_selectionDividerHeight, defSelectionDividerHeight); - mMinHeight = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_minHeight, - SIZE_UNSPECIFIED); - mMaxHeight = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_maxHeight, - SIZE_UNSPECIFIED); + mMinHeight = attributesArray.getDimensionPixelSize( + R.styleable.NumberPicker_internalMinHeight, SIZE_UNSPECIFIED); + mMaxHeight = attributesArray.getDimensionPixelSize( + R.styleable.NumberPicker_internalMaxHeight, SIZE_UNSPECIFIED); if (mMinHeight != SIZE_UNSPECIFIED && mMaxHeight != SIZE_UNSPECIFIED && mMinHeight > mMaxHeight) { throw new IllegalArgumentException("minHeight > maxHeight"); } - mMinWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_minWidth, + mMinWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_internalMinWidth, SIZE_UNSPECIFIED); - mMaxWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_maxWidth, + mMaxWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_internalMaxWidth, SIZE_UNSPECIFIED); if (mMinWidth != SIZE_UNSPECIFIED && mMaxWidth != SIZE_UNSPECIFIED && mMinWidth > mMaxWidth) { diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java index ef1d7d0..7eff1aa 100644 --- a/core/java/android/widget/TimePicker.java +++ b/core/java/android/widget/TimePicker.java @@ -136,7 +136,7 @@ public class TimePicker extends FrameLayout { TypedArray attributesArray = context.obtainStyledAttributes( attrs, R.styleable.TimePicker, defStyle, 0); int layoutResourceId = attributesArray.getResourceId( - R.styleable.TimePicker_layout, R.layout.time_picker); + R.styleable.TimePicker_internalLayout, R.layout.time_picker); attributesArray.recycle(); LayoutInflater inflater = (LayoutInflater) context.getSystemService( diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 9375730..f31deef 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -3376,9 +3376,13 @@ </declare-styleable> <declare-styleable name="DatePicker"> - <!-- The first year (inclusive), for example "1940". --> + <!-- The first year (inclusive), for example "1940". + {@deprecated Use minDate instead.} + --> <attr name="startYear" format="integer" /> - <!-- The last year (inclusive), for example "2010". --> + <!-- The last year (inclusive), for example "2010". + {@deprecated Use maxDate instead.} + --> <attr name="endYear" format="integer" /> <!-- Whether the spinners are shown. --> <attr name="spinnersShown" format="boolean" /> @@ -3388,8 +3392,8 @@ <attr name="minDate" format="string" /> <!-- The minimal date shown by this calendar view in mm/dd/yyyy format. --> <attr name="maxDate" format="string" /> - <!-- @hide The layout of the time picker. --> - <attr name="layout" /> + <!-- @hide The layout of the date picker. --> + <attr name="internalLayout" format="reference" /> </declare-styleable> <declare-styleable name="TwoLineListItem"> @@ -3593,15 +3597,15 @@ <attr name="shownWeekCount" format="integer"/> <!-- The background color for the selected week. --> <attr name="selectedWeekBackgroundColor" format="color|reference" /> - <!-- The color for the dates of the selected month. --> + <!-- The color for the dates of the focused month. --> <attr name="focusedMonthDateColor" format="color|reference" /> <!-- The color for the dates of an unfocused month. --> <attr name="unfocusedMonthDateColor" format="color|reference" /> <!-- The color for the week numbers. --> <attr name="weekNumberColor" format="color|reference" /> - <!-- The color for the sepatator line between weeks. --> + <!-- The color for the separator line between weeks. --> <attr name="weekSeparatorLineColor" format="color|reference" /> - <!-- Drawable for the vertical bar shown at the beggining and at the end of a selected date. --> + <!-- Drawable for the vertical bar shown at the beginning and at the end of the selected date. --> <attr name="selectedDateVerticalBar" format="reference" /> <!-- The text appearance for the week day abbreviation of the calendar header. --> <attr name="weekDayTextAppearance" format="reference" /> @@ -3619,20 +3623,18 @@ <!-- @hide The height of the selection divider. --> <attr name="selectionDividerHeight" format="dimension" /> <!-- @hide The min height of the NumberPicker. --> - <attr name="minHeight" /> + <attr name="internalMinHeight" format="dimension" /> <!-- @hide The max height of the NumberPicker. --> - <attr name="maxHeight" /> + <attr name="internalMaxHeight" format="dimension" /> <!-- @hide The min width of the NumberPicker. --> - <attr name="minWidth" /> - <!-- @hide The max width of the NumberPicker. --> - <attr name="maxWidth" /> + <attr name="internalMinWidth" format="dimension" /> <!-- @hide The max width of the NumberPicker. --> - <attr name="maxWidth" /> + <attr name="internalMaxWidth" format="dimension" /> </declare-styleable> <declare-styleable name="TimePicker"> <!-- @hide The layout of the time picker. --> - <attr name="layout" /> + <attr name="internalLayout" /> </declare-styleable> <!-- ========================= --> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 8e5b509..eaf9c8c 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -654,20 +654,37 @@ PERSIST may improve performance by reducing how often journal blocks are reallocated (compared to truncation) resulting in better data block locality and less churn of the storage media. --> - <string name="db_default_journal_mode">TRUNCATE</string> + <string name="db_default_journal_mode">PERSIST</string> <!-- Maximum size of the persistent journal file in bytes. If the journal file grows to be larger than this amount then SQLite will truncate it after committing the transaction. --> <integer name="db_journal_size_limit">524288</integer> - <!-- The database synchronization mode. + <!-- The database synchronization mode when using the default journal mode. + FULL is safest and preserves durability at the cost of extra fsyncs. + NORMAL also preserves durability in non-WAL modes and uses checksums to ensure + integrity although there is a small chance that an error might go unnoticed. Choices are: FULL, NORMAL, OFF. --> - <string name="db_sync_mode">FULL</string> + <string name="db_default_sync_mode">FULL</string> - <!-- The Write-Ahead Log auto-checkpoint interval in database pages. - The log is checkpointed automatically whenever it exceeds this many pages. --> - <integer name="db_wal_autocheckpoint">1</integer> + <!-- The database synchronization mode when using Write-Ahead Logging. + FULL is safest and preserves durability at the cost of extra fsyncs. + NORMAL sacrifices durability in WAL mode because syncs are only performed before + and after checkpoint operations. If checkpoints are infrequent and power loss + occurs, then committed transactions could be lost and applications might break. + Choices are: FULL, NORMAL, OFF. --> + <string name="db_wal_sync_mode">FULL</string> + + <!-- The Write-Ahead Log auto-checkpoint interval in database pages (typically 1 to 4KB). + The log is checkpointed automatically whenever it exceeds this many pages. + When a database is reopened, its journal mode is set back to the default + journal mode, which may cause a checkpoint operation to occur. Checkpoints + can also happen at other times when transactions are committed. + The bigger the WAL file, the longer a checkpoint operation takes, so we try + to keep the WAL file relatively small to avoid long delays. + The size of the WAL file is also constrained by 'db_journal_size_limit'. --> + <integer name="db_wal_autocheckpoint">100</integer> <!-- Max space (in MB) allocated to DownloadManager to store the downloaded files if they are to be stored in DownloadManager's data dir, diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 2c80fb7..39c6a18 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -441,7 +441,8 @@ <java-symbol type="string" name="day_of_week_shortest_tuesday" /> <java-symbol type="string" name="day_of_week_shortest_wednesday" /> <java-symbol type="string" name="db_default_journal_mode" /> - <java-symbol type="string" name="db_sync_mode" /> + <java-symbol type="string" name="db_default_sync_mode" /> + <java-symbol type="string" name="db_wal_sync_mode" /> <java-symbol type="string" name="decline" /> <java-symbol type="string" name="default_permission_group" /> <java-symbol type="string" name="default_text_encoding" /> @@ -1954,7 +1955,9 @@ <public type="attr" name="flipInterval" id="0x01010179" /> <public type="attr" name="fillViewport" id="0x0101017a" /> <public type="attr" name="prompt" id="0x0101017b" /> + <!-- {@deprecated Use minDate instead.} --> <public type="attr" name="startYear" id="0x0101017c" /> + <!-- {@deprecated Use maxDate instead.} --> <public type="attr" name="endYear" id="0x0101017d" /> <public type="attr" name="mode" id="0x0101017e" /> <public type="attr" name="layout_x" id="0x0101017f" /> diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index 610bad8..569be90 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -528,11 +528,11 @@ please see styles_device_defaults.xml. </style> <style name="Widget.TimePicker"> - <item name="android:layout">@android:layout/time_picker</item> + <item name="android:internalLayout">@android:layout/time_picker</item> </style> <style name="Widget.DatePicker"> - <item name="android:layout">@android:layout/date_picker</item> + <item name="android:internalLayout">@android:layout/date_picker</item> <item name="android:calendarViewShown">false</item> </style> @@ -1656,16 +1656,16 @@ please see styles_device_defaults.xml. <item name="android:flingable">true</item> <item name="android:selectionDivider">@android:drawable/numberpicker_selection_divider</item> <item name="android:selectionDividerHeight">2dip</item> - <item name="android:minWidth">48dip</item> - <item name="android:maxHeight">200dip</item> + <item name="android:internalMinWidth">48dip</item> + <item name="android:internalMaxHeight">200dip</item> </style> <style name="Widget.Holo.TimePicker" parent="Widget.TimePicker"> - <item name="android:layout">@android:layout/time_picker_holo</item> + <item name="android:internalLayout">@android:layout/time_picker_holo</item> </style> <style name="Widget.Holo.DatePicker" parent="Widget.DatePicker"> - <item name="android:layout">@android:layout/date_picker_holo</item> + <item name="android:internalLayout">@android:layout/date_picker_holo</item> <item name="android:calendarViewShown">true</item> </style> diff --git a/drm/java/android/drm/DrmConvertedStatus.java b/drm/java/android/drm/DrmConvertedStatus.java index cecb135..f6e570a 100755 --- a/drm/java/android/drm/DrmConvertedStatus.java +++ b/drm/java/android/drm/DrmConvertedStatus.java @@ -18,36 +18,67 @@ package android.drm; /** * An entity class that wraps converted data, conversion status, and the - * offset for appending the header and body signature to the converted data. An instance of this - * class is returned by the {@link DrmManagerClient#convertData convertData()} and - * {@link DrmManagerClient#closeConvertSession closeConvertSession()} methods. The offset is provided only when a - * conversion session is closed by calling {@link DrmManagerClient#closeConvertSession closeConvertSession()}. + * offset for appending the header and body signature to the converted data. + * An instance of this class may be created two ways by the drm framework: + * a) a call to {@link DrmManagerClient#convertData DrmManagerClient.convertData()} and + * b) a call to {@link DrmManagerClient#closeConvertSession DrmManagerClient.closeConvertSession()}. + * An valid offset value is provided only from a success call to + * {@link DrmManagerClient#closeConvertSession DrmManagerClient.closeConvertSession()}. * */ public class DrmConvertedStatus { - // Should be in sync with DrmConvertedStatus.cpp + // The following status code constants must be in sync with + // DrmConvertedStatus.cpp. Please also update isValidStatusCode() + // when more status code constants are added. + /** + * Indicate the conversion status is successful. + */ public static final int STATUS_OK = 1; + /** + * Indicate a failed conversion status due to input data. + */ public static final int STATUS_INPUTDATA_ERROR = 2; + /** + * Indicate a general failed conversion status. + */ public static final int STATUS_ERROR = 3; - /** Status code for the conversion.*/ + /** + * Status code for the conversion. Must be one of the defined status + * constants above. + */ public final int statusCode; - /** Converted data.*/ + /** + * Converted data. It is optional and thus can be null. + */ public final byte[] convertedData; - /** Offset value for the body and header signature.*/ + /** + * Offset value for the body and header signature. + */ public final int offset; /** * Creates a <code>DrmConvertedStatus</code> object with the specified parameters. * - * @param _statusCode Conversion status. - * @param _convertedData Converted data. - * @param _offset Offset value for appending the header and body signature. + * @param statusCode Conversion status. Must be one of the status code constants + * defined above. + * @param convertedData Converted data. It can be null. + * @param offset Offset value for appending the header and body signature. */ - public DrmConvertedStatus(int _statusCode, byte[] _convertedData, int _offset) { - statusCode = _statusCode; - convertedData = _convertedData; - offset = _offset; + public DrmConvertedStatus(int statusCode, byte[] convertedData, int offset) { + if (!isValidStatusCode(statusCode)) { + throw new IllegalArgumentException("Unsupported status code: " + statusCode); + } + + this.statusCode = statusCode; + this.convertedData = convertedData; + this.offset = offset; + } + + private boolean isValidStatusCode(int statusCode) { + return statusCode == STATUS_OK || + statusCode == STATUS_INPUTDATA_ERROR || + statusCode == STATUS_ERROR; } } diff --git a/drm/java/android/drm/DrmInfoStatus.java b/drm/java/android/drm/DrmInfoStatus.java index 2fe0a78..9a3a7df 100755 --- a/drm/java/android/drm/DrmInfoStatus.java +++ b/drm/java/android/drm/DrmInfoStatus.java @@ -17,53 +17,81 @@ package android.drm; /** - * An entity class that wraps the result of communication between a device and an online DRM - * server. Specifically, when the {@link DrmManagerClient#processDrmInfo processDrmInfo()} method - * is called, an instance of <code>DrmInfoStatus</code> is returned. + * An entity class that wraps the result of communication between a device + * and an online DRM server. Specifically, when the + * {@link DrmManagerClient#processDrmInfo DrmManagerClient.processDrmInfo()} + * method is called, an instance of <code>DrmInfoStatus</code> is returned. *<p> - * This class contains the {@link ProcessedData} object, which can be used to instantiate a - * {@link DrmRights} object during license acquisition. + * This class contains the {@link ProcessedData} object, which can be used + * to instantiate a {@link DrmRights} object during license acquisition. * */ public class DrmInfoStatus { - // Should be in sync with DrmInfoStatus.cpp + // The following status code constants must be in sync with DrmInfoStatus.cpp + // Please update isValidStatusCode() if more status codes are added. + /** + * Indicate successful communication. + */ public static final int STATUS_OK = 1; + + /** + * Indicate failed communication. + */ public static final int STATUS_ERROR = 2; /** - * The status of the communication. + * The status of the communication. Must be one of the defined status + * constants above. */ public final int statusCode; /** - * The type of DRM information processed. + * The type of DRM information processed. Must be one of the valid type + * constants defined in {@link DrmInfoRequest}. */ public final int infoType; /** - * The MIME type of the content. + * The MIME type of the content. Must not be null or an empty string. */ public final String mimeType; /** - * The processed data. + * The processed data. It is optional and thus could be null. When it + * is null, it indicates that a particular call to + * {@link DrmManagerClient#processDrmInfo DrmManagerClient.processDrmInfo()} + * does not return any additional useful information except for the status code. */ public final ProcessedData data; /** * Creates a <code>DrmInfoStatus</code> object with the specified parameters. * - * @param _statusCode The status of the communication. - * @param _infoType The type of the DRM information processed. - * @param _data The processed data. - * @param _mimeType The MIME type. + * @param statusCode The status of the communication. Must be one of the defined + * status constants above. + * @param infoType The type of the DRM information processed. Must be a valid + * type for {@link DrmInfoRequest}. + * @param data The processed data. + * @param mimeType The MIME type. */ - public DrmInfoStatus(int _statusCode, int _infoType, ProcessedData _data, String _mimeType) { - if (!DrmInfoRequest.isValidType(_infoType)) { - throw new IllegalArgumentException("infoType: " + _infoType); + public DrmInfoStatus(int statusCode, int infoType, ProcessedData data, String mimeType) { + if (!DrmInfoRequest.isValidType(infoType)) { + throw new IllegalArgumentException("infoType: " + infoType); } - statusCode = _statusCode; - infoType = _infoType; - data = _data; - mimeType = _mimeType; + if (!isValidStatusCode(statusCode)) { + throw new IllegalArgumentException("Unsupported status code: " + statusCode); + } + + if (mimeType == null || mimeType == "") { + throw new IllegalArgumentException("mimeType is null or an empty string"); + } + + this.statusCode = statusCode; + this.infoType = infoType; + this.data = data; + this.mimeType = mimeType; + } + + private boolean isValidStatusCode(int statusCode) { + return statusCode == STATUS_OK || statusCode == STATUS_ERROR; } } diff --git a/drm/java/android/drm/DrmSupportInfo.java b/drm/java/android/drm/DrmSupportInfo.java index 6484fa7..3694ff4 100755 --- a/drm/java/android/drm/DrmSupportInfo.java +++ b/drm/java/android/drm/DrmSupportInfo.java @@ -36,8 +36,16 @@ public class DrmSupportInfo { * Adds the specified MIME type to the list of MIME types this DRM plug-in supports. * * @param mimeType MIME type that can be handles by this DRM plug-in. + * Must not be null or an empty string. */ public void addMimeType(String mimeType) { + if (mimeType == null) { + throw new IllegalArgumentException("mimeType is null"); + } + if (mimeType == "") { + throw new IllegalArgumentException("mimeType is an empty string"); + } + mMimeTypeList.add(mimeType); } @@ -45,8 +53,14 @@ public class DrmSupportInfo { * Adds the specified file suffix to the list of file suffixes this DRM plug-in supports. * * @param fileSuffix File suffix that can be handled by this DRM plug-in. + * it could be null but not an empty string. When it is null, it indicates + * that some DRM content comes with no file suffix. */ public void addFileSuffix(String fileSuffix) { + if (fileSuffix == "") { + throw new IllegalArgumentException("fileSuffix is an empty string"); + } + mFileSuffixList.add(fileSuffix); } @@ -73,12 +87,18 @@ public class DrmSupportInfo { /** * Sets a description for the DRM plug-in (agent). * - * @param description Unique description of plug-in. + * @param description Unique description of plug-in. Must not be null + * or an empty string. */ public void setDescription(String description) { - if (null != description) { - mDescription = description; + if (description == null) { + throw new IllegalArgumentException("description is null"); + } + if (description == "") { + throw new IllegalArgumentException("description is an empty string"); } + + mDescription = description; } /** @@ -93,7 +113,10 @@ public class DrmSupportInfo { } /** - * Retrieves the DRM plug-in (agent) description. + * Retrieves the DRM plug-in (agent) description. Even if null or an empty + * string is not allowed in {@link #setDescription(String)}, if + * {@link #setDescription(String)} is not called, description returned + * from this method is an empty string. * * @return The plug-in description. */ @@ -111,20 +134,21 @@ public class DrmSupportInfo { } /** - * Overridden <code>equals</code> implementation. + * Overridden <code>equals</code> implementation. Two DrmSupportInfo objects + * are considered being equal if they support exactly the same set of mime + * types, file suffixes, and has exactly the same description. * * @param object The object to be compared. * @return True if equal; false if not equal. */ public boolean equals(Object object) { - boolean result = false; - if (object instanceof DrmSupportInfo) { - result = mFileSuffixList.equals(((DrmSupportInfo) object).mFileSuffixList) && - mMimeTypeList.equals(((DrmSupportInfo) object).mMimeTypeList) && - mDescription.equals(((DrmSupportInfo) object).mDescription); + DrmSupportInfo info = (DrmSupportInfo) object; + return mFileSuffixList.equals(info.mFileSuffixList) && + mMimeTypeList.equals(info.mMimeTypeList) && + mDescription.equals(info.mDescription); } - return result; + return false; } /** @@ -132,11 +156,17 @@ public class DrmSupportInfo { * * @param mimeType MIME type. * @return True if Mime type is supported; false if MIME type is not supported. + * Null or empty string is not a supported mimeType. */ /* package */ boolean isSupportedMimeType(String mimeType) { if (null != mimeType && !mimeType.equals("")) { for (int i = 0; i < mMimeTypeList.size(); i++) { String completeMimeType = mMimeTypeList.get(i); + + // The reason that equals() is not used is that sometimes, + // content distributor might just append something to + // the basic MIME type. startsWith() is used to avoid + // frequent update of DRM agent. if (completeMimeType.startsWith(mimeType)) { return true; } diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h index b0c581a..4fbeb38 100644 --- a/include/media/AudioRecord.h +++ b/include/media/AudioRecord.h @@ -299,7 +299,7 @@ public: /* obtains a buffer of "frameCount" frames. The buffer must be * filled entirely. If the track is stopped, obtainBuffer() returns - * STOPPED instead of NO_ERROR as long as there are buffers availlable, + * STOPPED instead of NO_ERROR as long as there are buffers available, * at which point NO_MORE_BUFFERS is returned. * Buffers will be returned until the pool (buffercount()) * is exhausted, at which point obtainBuffer() will either block @@ -317,13 +317,14 @@ public: /* As a convenience we provide a read() interface to the audio buffer. - * This is implemented on top of lockBuffer/unlockBuffer. + * This is implemented on top of obtainBuffer/releaseBuffer. */ ssize_t read(void* buffer, size_t size); - /* Return the amount of input frames lost in the audio driver since the last call of this function. - * Audio driver is expected to reset the value to 0 and restart counting upon returning the current value by this function call. - * Such loss typically occurs when the user space process is blocked longer than the capacity of audio driver buffers. + /* Return the amount of input frames lost in the audio driver since the last call of this + * function. Audio driver is expected to reset the value to 0 and restart counting upon + * returning the current value by this function call. Such loss typically occurs when the + * user space process is blocked longer than the capacity of audio driver buffers. * Unit: the number of input audio frames */ unsigned int getInputFramesLost() const; diff --git a/media/libeffects/data/audio_effects.conf b/media/libeffects/data/audio_effects.conf index b8fa487..ce25bc8 100644 --- a/media/libeffects/data/audio_effects.conf +++ b/media/libeffects/data/audio_effects.conf @@ -50,11 +50,11 @@ effects { } volume { library bundle - uuid 119341a0-8469-11df-81f9- 0002a5d5c51b + uuid 119341a0-8469-11df-81f9-0002a5d5c51b } reverb_env_aux { library reverb - uuid 4a387fc0-8ab3-11df-8bad- 0002a5d5c51b + uuid 4a387fc0-8ab3-11df-8bad-0002a5d5c51b } reverb_env_ins { library reverb diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index eab60a7..352decf 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -2179,8 +2179,9 @@ private NetworkStateTracker makeWimaxStateTracker() { String dnsString = dns.getHostAddress(); if (changed || !dnsString.equals(SystemProperties.get("net.dns" + j + "." + pid))) { changed = true; - SystemProperties.set("net.dns" + j++ + "." + pid, dns.getHostAddress()); + SystemProperties.set("net.dns" + j + "." + pid, dns.getHostAddress()); } + j++; } return changed; } diff --git a/services/java/com/android/server/wm/ScreenRotationAnimation.java b/services/java/com/android/server/wm/ScreenRotationAnimation.java index 1335a44..932e456 100644 --- a/services/java/com/android/server/wm/ScreenRotationAnimation.java +++ b/services/java/com/android/server/wm/ScreenRotationAnimation.java @@ -602,6 +602,7 @@ class ScreenRotationAnimation implements WindowManagerService.StepAnimator { public boolean startAndFinishAnimationLocked(long now) { if (!isAnimating()) { if (DEBUG_STATE) Slog.v(TAG, "Step: no animations running"); + mFinishAnimReady = false; return false; } diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 6221b90..1c5a70f 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -7661,7 +7661,7 @@ public class WindowManagerService extends IWindowManager.Stub } final int NEAT = mExitingAppTokens.size(); for (i=0; i<NEAT; i++) { - final AppWindowToken appToken = mAppTokens.get(i); + final AppWindowToken appToken = mExitingAppTokens.get(i); if (appToken.startAndFinishAnimationLocked(currentTime, innerDw, innerDh)) { mStepAnimators.add(appToken); mInnerFields.mAnimating = true; @@ -7669,7 +7669,8 @@ public class WindowManagerService extends IWindowManager.Stub } if (mScreenRotationAnimation != null) { - if (mScreenRotationAnimation.isAnimating()) { + if (mScreenRotationAnimation.isAnimating() || + mScreenRotationAnimation.mFinishAnimReady) { if (mScreenRotationAnimation.startAndFinishAnimationLocked(currentTime)) { mInnerFields.mUpdateRotation = false; mInnerFields.mAnimating = true; diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index bc423a5..d746810 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -1310,7 +1310,10 @@ public class WifiManager { if (c == null) throw new IllegalArgumentException("Channel needs to be initialized"); if (config == null) throw new IllegalArgumentException("config cannot be null"); - c.mAsyncChannel.sendMessage(CONNECT_NETWORK, 0, c.putListener(listener), config); + // Use INVALID_NETWORK_ID for arg1 when passing a config object + // arg1 is used to pass network id when the network already exists + c.mAsyncChannel.sendMessage(CONNECT_NETWORK, WifiConfiguration.INVALID_NETWORK_ID, + c.putListener(listener), config); } /** |