Merge "Enhance WPS"
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
mConfiguration.label,
SQLiteDebug.DEBUG_SQL_STATEMENTS, SQLiteDebug.DEBUG_SQL_TIME);
- setSyncMode();
setPageSize();
- setAutoCheckpointInterval();
- setJournalSizeLimit();
+ setSyncModeFromConfiguration();
setJournalModeFromConfiguration();
+ setJournalSizeLimit();
+ setAutoCheckpointInterval();
setLocaleFromConfiguration();
}
@@ -236,12 +236,6 @@
}
}
- 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 @@
}
}
+ 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 @@
}
// 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 @@
// 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 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 @@
}
/**
+ * 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 @@
mIsWALEnabledLocked = true;
mConfigurationLocked.maxConnectionPoolSize = SQLiteGlobal.getWALConnectionPoolSize();
+ mConfigurationLocked.syncMode = SQLiteGlobal.getWALSyncMode();
mConfigurationLocked.journalMode = "WAL";
mConnectionPoolLocked.reconfigure(mConfigurationLocked);
}
@@ -1766,6 +1802,7 @@
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 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 @@
maxConnectionPoolSize = 1;
maxSqlCacheSize = 25;
locale = Locale.getDefault();
+ syncMode = SQLiteGlobal.getDefaultSyncMode();
journalMode = SQLiteGlobal.getDefaultJournalMode();
}
@@ -154,6 +162,7 @@
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 @@
}
/**
- * 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 @@
}
/**
- * 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 fa59b32f..83799c4 100644
--- a/core/java/android/provider/CalendarContract.java
+++ b/core/java/android/provider/CalendarContract.java
@@ -856,6 +856,17 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
}
mShowWeekNumber = showWeekNumber;
mAdapter.notifyDataSetChanged();
- setUpHeader(DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID);
+ setUpHeader();
}
/**
@@ -594,7 +823,7 @@
mFirstDayOfWeek = firstDayOfWeek;
mAdapter.init();
mAdapter.notifyDataSetChanged();
- setUpHeader(DEFAULT_WEEK_DAY_TEXT_APPEARANCE_RES_ID);
+ setUpHeader();
}
/**
@@ -655,6 +884,25 @@
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 @@
/**
* 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 @@
}
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 @@
// 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 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 @@
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 @@
}
/**
- * 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 @@
@Override
protected void onDraw(Canvas canvas) {
drawBackground(canvas);
- drawWeekNumbers(canvas);
+ drawWeekNumbersAndDates(canvas);
drawWeekSeparators(canvas);
drawSelectedDateVerticalBars(canvas);
}
@@ -1401,12 +1653,13 @@
*
* @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 @@
@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 @@
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 @@
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 @@
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" />
+ <attr name="internalMinWidth" format="dimension" />
<!-- @hide The max width of the NumberPicker. -->
- <attr name="maxWidth" />
- <!-- @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 @@
</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 @@
<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 @@
/**
* 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 @@
* 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 @@
* 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 @@
/**
* 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 @@
}
/**
- * 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 @@
}
/**
- * 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 @@
*
* @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 @@
/* 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 @@
/* 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 @@
}
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 @@
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 @@
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 @@
}
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 @@
}
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 @@
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);
}
/**