diff options
author | Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de> | 2016-02-06 17:40:43 +0100 |
---|---|---|
committer | Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de> | 2016-02-06 17:40:43 +0100 |
commit | 8bc386657e4bd582ea0897410523e27230a8e157 (patch) | |
tree | 5850aeac08fed40710b4db0e5f8e8bf03da3a63a | |
parent | df6d6764259f800d0a57452ecd487a0643d5dde1 (diff) | |
parent | ab0b7afb26a80f5af609ccc5fb68e05a97fec901 (diff) | |
download | frameworks_base-replicant-6.0-alpha-0003.zip frameworks_base-replicant-6.0-alpha-0003.tar.gz frameworks_base-replicant-6.0-alpha-0003.tar.bz2 |
Merge branch 'cm-13.0' of https://github.com/CyanogenMod/android_frameworks_base into replicant-6.0replicant-6.0-alpha-0003replicant-6.0-alpha-0002
Signed-off-by: Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de>
24 files changed, 251 insertions, 66 deletions
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index ae22b50..be827a4 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -1097,20 +1097,20 @@ public class LockPatternUtils { setLong(Settings.Secure.LOCK_PATTERN_SIZE, size, UserHandle.USER_CURRENT); } - public void setVisibleDotsEnabled(boolean enabled) { - setBoolean(Settings.Secure.LOCK_DOTS_VISIBLE, enabled, UserHandle.USER_CURRENT); + public void setVisibleDotsEnabled(boolean enabled, int userId) { + setBoolean(Settings.Secure.LOCK_DOTS_VISIBLE, enabled, userId); } - public boolean isVisibleDotsEnabled() { - return getBoolean(Settings.Secure.LOCK_DOTS_VISIBLE, true, UserHandle.USER_CURRENT); + public boolean isVisibleDotsEnabled(int userId) { + return getBoolean(Settings.Secure.LOCK_DOTS_VISIBLE, true, userId); } - public void setShowErrorPath(boolean enabled) { - setBoolean(Settings.Secure.LOCK_SHOW_ERROR_PATH, enabled, UserHandle.USER_CURRENT); + public void setShowErrorPath(boolean enabled, int userId) { + setBoolean(Settings.Secure.LOCK_SHOW_ERROR_PATH, enabled, userId); } - public boolean isShowErrorPath() { - return getBoolean(Settings.Secure.LOCK_SHOW_ERROR_PATH, true, UserHandle.USER_CURRENT); + public boolean isShowErrorPath(int userId) { + return getBoolean(Settings.Secure.LOCK_SHOW_ERROR_PATH, true, userId); } /** diff --git a/core/java/com/android/internal/widget/LockPatternView.java b/core/java/com/android/internal/widget/LockPatternView.java index a3cd8ad..baa228f 100644 --- a/core/java/com/android/internal/widget/LockPatternView.java +++ b/core/java/com/android/internal/widget/LockPatternView.java @@ -1149,20 +1149,21 @@ public class LockPatternView extends View { currentPath.rewind(); // draw the circles - for (int i = 0; i < mPatternSize; i++) { - float centerY = getCenterYForRow(i); - for (int j = 0; j < mPatternSize; j++) { - CellState cellState = mCellStates[i][j]; - float centerX = getCenterXForColumn(j); - float translationY = cellState.translationY; - if (isHardwareAccelerated() && cellState.hwAnimating) { - DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas; - displayListCanvas.drawCircle(cellState.hwCenterX, cellState.hwCenterY, - cellState.hwRadius, cellState.hwPaint); - } else { - drawCircle(canvas, (int) centerX, (int) centerY + translationY, - cellState.radius, drawLookup[i][j], cellState.alpha); - + if (mVisibleDots) { + for (int i = 0; i < mPatternSize; i++) { + float centerY = getCenterYForRow(i); + for (int j = 0; j < mPatternSize; j++) { + CellState cellState = mCellStates[i][j]; + float centerX = getCenterXForColumn(j); + float translationY = cellState.translationY; + if (isHardwareAccelerated() && cellState.hwAnimating) { + DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas; + displayListCanvas.drawCircle(cellState.hwCenterX, cellState.hwCenterY, + cellState.hwRadius, cellState.hwPaint); + } else { + drawCircle(canvas, (int) centerX, (int) centerY + translationY, + cellState.radius, drawLookup[i][j], cellState.alpha); + } } } } @@ -1170,8 +1171,6 @@ public class LockPatternView extends View { // TODO: the path should be created and cached every time we hit-detect a cell // only the last segment of the path should be computed here // draw the path of the pattern (unless we are in stealth mode) - // draw the path of the pattern (unless the user is in progress, and - // we are in stealth mode) final boolean drawPath = ((!mInStealthMode && mPatternDisplayMode != DisplayMode.Wrong) || (mPatternDisplayMode == DisplayMode.Wrong && mShowErrorPath)); if (drawPath) { @@ -1231,7 +1230,9 @@ public class LockPatternView extends View { } private int getCurrentColor(boolean partOfPattern) { - if (!partOfPattern || mInStealthMode || mPatternInProgress) { + if (!partOfPattern || (mInStealthMode && mPatternDisplayMode != DisplayMode.Wrong) + || (mPatternDisplayMode == DisplayMode.Wrong && !mShowErrorPath) + || mPatternInProgress) { // unselected circle return mRegularColor; } else if (mPatternDisplayMode == DisplayMode.Wrong) { diff --git a/core/res/res/values/cm_strings.xml b/core/res/res/values/cm_strings.xml index a77d370..a48e9e5 100644 --- a/core/res/res/values/cm_strings.xml +++ b/core/res/res/values/cm_strings.xml @@ -185,7 +185,7 @@ <string name="app_ops_start_at_bootup">start at power up</string> <string name="app_ops_toast_window">display toast messages</string> <string name="app_ops_toggle_bluetooth">toggle Bluetooth</string> - <string name="app_ops_toggle_mobile_data">toggle mobile data</string> + <string name="app_ops_toggle_mobile_data">toggle cellular data</string> <string name="app_ops_toggle_nfc">toggle NFC</string> <string name="app_ops_toggle_wifi">toggle Wi-Fi</string> <string name="app_ops_use_alarm_volume">control alarm volume</string> @@ -249,4 +249,8 @@ <!-- Protected Apps Notification --> <string name="notify_package_component_protected_title">Activity launch blocked</string> <string name="notify_package_component_protected_text"><xliff:g id="app_name">%1$s</xliff:g> is protected from being launched. Tap to authenticate and launch the application.</string> + + <!-- Battery fully charged notification --> + <string name="notify_battery_fully_charged_title">Battery fully charged</string> + <string name="notify_battery_fully_charged_text">Disconnect your device from the charger to improve battery longevity.</string> </resources> diff --git a/core/res/res/values/cm_symbols.xml b/core/res/res/values/cm_symbols.xml index 5938060..4c24573 100644 --- a/core/res/res/values/cm_symbols.xml +++ b/core/res/res/values/cm_symbols.xml @@ -157,4 +157,9 @@ <!-- Restricted fingerprint config --> <java-symbol type="bool" name="config_fingerprintRestrictedToSystemAndOwner" /> + <!-- Show battery fully charged notification --> + <java-symbol type="bool" name="config_showBatteryFullyChargedNotification" /> + <java-symbol type="string" name="notify_battery_fully_charged_title" /> + <java-symbol type="string" name="notify_battery_fully_charged_text" /> + </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index d153f88..7aa778b 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2524,4 +2524,7 @@ automatically try to pair with it when the device exits tablet mode. --> <string translatable="false" name="config_packagedKeyboardName"></string> <integer name="config_dayColorTemperature">6500</integer> + + <!-- Show battery fully charged notification --> + <bool name="config_showBatteryFullyChargedNotification">false</bool> </resources> diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java index 4e9788a..6aba87b 100644 --- a/graphics/java/android/graphics/Typeface.java +++ b/graphics/java/android/graphics/Typeface.java @@ -379,9 +379,9 @@ public class Typeface { if (configFile == themeConfigFile) { systemFontConfig = FontListParser.parse(systemConfigFile, getSystemFontDirLocation().getAbsolutePath()); + addFallbackFontsForFamilyName(systemFontConfig, fontConfig, SANS_SERIF_FAMILY_NAME); addMissingFontFamilies(systemFontConfig, fontConfig); addMissingFontAliases(systemFontConfig, fontConfig); - addFallbackFontsForFamilyName(systemFontConfig, fontConfig, SANS_SERIF_FAMILY_NAME); } List<FontFamily> familyList = new ArrayList<FontFamily>(); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java index 9fc253b..e8dd871 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java @@ -135,8 +135,10 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit mLockPatternView.setLockPatternUtils(mLockPatternUtils); mLockPatternView.setLockPatternSize(mLockPatternUtils.getLockPatternSize()); - mLockPatternView.setVisibleDots(mLockPatternUtils.isVisibleDotsEnabled()); - mLockPatternView.setShowErrorPath(mLockPatternUtils.isShowErrorPath()); + mLockPatternView.setVisibleDots(mLockPatternUtils.isVisibleDotsEnabled( + KeyguardUpdateMonitor.getCurrentUser())); + mLockPatternView.setShowErrorPath(mLockPatternUtils.isShowErrorPath( + KeyguardUpdateMonitor.getCurrentUser())); // stealth mode will be the same for the life of this screen mLockPatternView.setInStealthMode(!mLockPatternUtils.isVisiblePatternEnabled( diff --git a/packages/SettingsProvider/res/values/customize.xml b/packages/SettingsProvider/res/values/customize.xml index b5e6648..9085d2d 100644 --- a/packages/SettingsProvider/res/values/customize.xml +++ b/packages/SettingsProvider/res/values/customize.xml @@ -30,10 +30,10 @@ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. <resources> <!-- Time format,default vlaue is 24 : 24 format,other value is 12 format --> - <string name="def_time_format" translatable="false">24</string> + <string name="def_time_format" translatable="false"></string> <!-- Date format,yyyy-MM-dd: 2013/07/30; MM-dd-yyyy:07/30/2013; dd-MM-yyyy:30/07/2013 --> - <string name="def_date_format" translatable="false">MM-dd-yyyy</string> + <string name="def_date_format" translatable="false"></string> <!-- Default Input Method, its value is from inputmethod's package name and main class name diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index fe7c986..203c592 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -2595,11 +2595,15 @@ class DatabaseHelper extends SQLiteOpenHelper { */ //LEGACY CAF CHANGES - loadStringSetting(stmt, Settings.System.TIME_12_24, - R.string.def_time_format); + if (!TextUtils.isEmpty(mContext.getResources().getString(R.string.def_time_format))) { + loadStringSetting(stmt, Settings.System.TIME_12_24, + R.string.def_time_format); + } - loadStringSetting(stmt, Settings.System.DATE_FORMAT, - R.string.def_date_format); + if (!TextUtils.isEmpty(mContext.getResources().getString(R.string.def_date_format))) { + loadStringSetting(stmt, Settings.System.DATE_FORMAT, + R.string.def_date_format); + } } finally { if (stmt != null) stmt.close(); } diff --git a/packages/SystemUI/res/values/cm_strings.xml b/packages/SystemUI/res/values/cm_strings.xml index 46f3e69..dcd02a2 100644 --- a/packages/SystemUI/res/values/cm_strings.xml +++ b/packages/SystemUI/res/values/cm_strings.xml @@ -240,7 +240,7 @@ <string name="quick_settings_tiles_add_tiles">Add a tile</string> <!-- Hotspot dialog message --> - <string name="hotspot_apm_message">Unable to connect to mobile networks while Airplane mode is enabled. Disable Airplane mode and try again.</string> + <string name="hotspot_apm_message">Unable to connect to cellular networks while Airplane mode is enabled. Disable Airplane mode and try again.</string> <!-- Notification which notifies user flashlight is enabled --> <string name="quick_settings_tile_flashlight_not_title">Flashlight is on</string> diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDragPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSDragPanel.java index 995237d..0615842 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSDragPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSDragPanel.java @@ -390,34 +390,42 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On } } + private void persistRecords() { + // persist the new config. + List<String> newTiles = new ArrayList<>(); + for (TileRecord record : mRecords) { + newTiles.add(mHost.getSpec(record.tile)); + } + mHost.setTiles(newTiles); + } + public void setEditing(boolean editing) { if (mEditing == editing) return; - mEditing = editing; + final boolean isOnSettings = isOnSettingsPage(); + mQsPanelTop.setEditing(editing, isOnSettings); if (!editing) { - // persist the new config. - List<String> newTiles = new ArrayList<>(); - for (TileRecord record : mRecords) { - newTiles.add(mHost.getSpec(record.tile)); - } - mHost.setTiles(newTiles); + persistRecords(); refreshAllTiles(); - mQsPanelTop.animate().translationX(0).start(); + mQsPanelTop.setTranslationX(0); + if (isOnSettings) { + mViewPager.setCurrentItem(1, true); + } } + mEditing = editing; + mPagerAdapter.notifyDataSetChanged(); + + mPageIndicator.setEditing(editing); + mViewPager.setOffscreenPageLimit(mEditing ? getCurrentMaxPageCount() + 1 : 1); + mPagerAdapter.notifyDataSetChanged(); // clear the record state for (TileRecord record : mRecords) { setupRecord(record); drawTile(record, record.tile.getState()); } - mQsPanelTop.setEditing(editing); - mPageIndicator.setEditing(editing); - mPagerAdapter.notifyDataSetChanged(); - - mViewPager.setOffscreenPageLimit(mEditing ? getCurrentMaxPageCount() + 1 : 1); - mPagerAdapter.notifyDataSetChanged(); requestLayout(); } @@ -2110,8 +2118,8 @@ public class QSDragPanel extends QSPanel implements View.OnDragListener, View.On CMSettings.Secure.QS_USE_MAIN_TILES, 1, currentUserId) == 1; if (firstRowLarge != mFirstRowLarge) { mFirstRowLarge = firstRowLarge; - setTiles(new ArrayList<QSTile<?>>()); // clear out states setTiles(mHost.getTiles()); + mPagerAdapter.notifyDataSetChanged(); } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanelTopView.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanelTopView.java index 57c311c..5f57be1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanelTopView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanelTopView.java @@ -65,6 +65,7 @@ public class QSPanelTopView extends FrameLayout { private SettingsObserver mSettingsObserver; private boolean mListening; + private boolean mSkipAnimations; public QSPanelTopView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); @@ -137,12 +138,11 @@ public class QSPanelTopView extends FrameLayout { boolean animateToState = !isLaidOut(); super.onLayout(changed, left, top, right, bottom); if (animateToState) { - Log.e(TAG, "first layout animating to state!"); - animateToState(); + goToState(); } } - public void setEditing(boolean editing) { + public void setEditing(boolean editing, boolean skipAnim) { mEditing = editing; if (editing) { mDisplayingInstructions = true; @@ -151,7 +151,11 @@ public class QSPanelTopView extends FrameLayout { mDisplayingInstructions = false; mDisplayingTrash = false; } - animateToState(); + if (skipAnim) { + goToState(); + } else { + animateToState(); + } } public void onStopDrag() { @@ -254,9 +258,9 @@ public class QSPanelTopView extends FrameLayout { } }); - mAnimator.setDuration(500); + mAnimator.setDuration(mSkipAnimations ? 0 : 500); mAnimator.setInterpolator(new FastOutSlowInInterpolator()); - mAnimator.setStartDelay(100); + mAnimator.setStartDelay(mSkipAnimations ? 0 : 100); mAnimator.playTogether(instructionAnimator, trashAnimator, brightnessAnimator, toastAnimator); mAnimator.start(); @@ -271,6 +275,12 @@ public class QSPanelTopView extends FrameLayout { } private void animateToState() { + mSkipAnimations = false; + post(mAnimateRunnable); + } + + private void goToState() { + mSkipAnimations = true; post(mAnimateRunnable); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/EditTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/EditTile.java index 7c9b762..7173786 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/EditTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/EditTile.java @@ -57,7 +57,7 @@ public class EditTile extends QSTile<QSTile.BooleanState> implements KeyguardMon final boolean showing = getHost().getKeyguardMonitor().isShowing(); final boolean secure = getHost().getKeyguardMonitor().isSecure(); state.visible = !showing || !secure; - state.enabled = true; + state.enabled = !showing; state.label = mContext.getString(R.string.quick_settings_edit_label); if (arg instanceof Boolean) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 2713cd0..6adbe85 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -320,7 +320,7 @@ public class NotificationPanelView extends PanelView implements }); mLockPatternUtils = new CmLockPatternUtils(getContext()); - if (mLockPatternUtils.isThirdPartyKeyguardEnabled()) { + if (mLockPatternUtils.isThirdPartyKeyguardEnabled() && mLiveLockScreenEnabled) { mThirdPartyKeyguardViewComponent = mLockPatternUtils.getThirdPartyKeyguardComponent(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java index 0bc05c4..27c8a4d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java @@ -776,7 +776,7 @@ public class StatusBarHeaderView extends RelativeLayout implements View.OnClickL public void setEditing(boolean editing) { mEditing = editing; - if (mEditingDetailAdapter == null) { + if (editing && mEditingDetailAdapter == null) { mEditingDetailAdapter = new QSTile.DetailAdapter() { @Override public int getTitle() { diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java index 43cd475..63c3e97 100644 --- a/services/core/java/com/android/server/BatteryService.java +++ b/services/core/java/com/android/server/BatteryService.java @@ -25,6 +25,9 @@ import com.android.server.lights.Light; import com.android.server.lights.LightsManager; import android.app.ActivityManagerNative; +import android.app.Notification; +import android.app.NotificationManager; +import android.app.PendingIntent; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -166,6 +169,9 @@ public final class BatteryService extends SystemService { private boolean mSentLowBatteryBroadcast = false; + private boolean mShowBatteryFullyChargedNotification; + private boolean mIsShowingBatteryFullyChargedNotification; + public BatteryService(Context context) { super(context); @@ -182,6 +188,8 @@ public final class BatteryService extends SystemService { com.android.internal.R.integer.config_lowBatteryCloseWarningBump); mShutdownBatteryTemperature = mContext.getResources().getInteger( com.android.internal.R.integer.config_shutdownBatteryTemperature); + mShowBatteryFullyChargedNotification = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_showBatteryFullyChargedNotification); // watch for invalid charger messages if the invalid_charger switch exists if (new File("/sys/devices/virtual/switch/invalid_charger/state").exists()) { @@ -498,6 +506,12 @@ public final class BatteryService extends SystemService { // Update the battery LED mLed.updateLightsLocked(); + if (shouldShowBatteryFullyChargedNotificationLocked()) { + showBatteryFullyChargedNotificationLocked(); + } else if (shouldClearBatteryFullyChargedNotificationLocked()) { + clearBatteryFullyChargedNotificationLocked(); + } + // This needs to be done after sendIntent() so that we get the lastest battery stats. if (logOutlier && dischargeDuration != 0) { logOutlierLocked(dischargeDuration); @@ -752,6 +766,56 @@ public final class BatteryService extends SystemService { mLed.updateLightsLocked(); } + private boolean shouldShowBatteryFullyChargedNotificationLocked() { + return mShowBatteryFullyChargedNotification && mPlugType != 0 + && mBatteryProps.batteryLevel == BATTERY_SCALE + && !mIsShowingBatteryFullyChargedNotification; + } + + private void showBatteryFullyChargedNotificationLocked() { + NotificationManager nm = mContext.getSystemService(NotificationManager.class); + Intent intent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY); + PendingIntent pi = PendingIntent.getActivityAsUser(mContext, 0, + intent, 0, null, UserHandle.CURRENT); + + CharSequence title = mContext.getText( + com.android.internal.R.string.notify_battery_fully_charged_title); + CharSequence message = mContext.getText( + com.android.internal.R.string.notify_battery_fully_charged_text); + + Notification notification = new Notification.Builder(mContext) + .setSmallIcon(com.android.internal.R.drawable.stat_sys_battery_charge) + .setWhen(0) + .setOngoing(false) + .setAutoCancel(true) + .setTicker(title) + .setDefaults(0) // please be quiet + .setPriority(Notification.PRIORITY_DEFAULT) + .setColor(mContext.getColor( + com.android.internal.R.color.system_notification_accent_color)) + .setContentTitle(title) + .setContentText(message) + .setStyle(new Notification.BigTextStyle().bigText(message)) + .setContentIntent(pi) + .setVisibility(Notification.VISIBILITY_PUBLIC) + .build(); + + nm.notifyAsUser(null, com.android.internal.R.string.notify_battery_fully_charged_title, + notification, UserHandle.ALL); + mIsShowingBatteryFullyChargedNotification = true; + } + + private boolean shouldClearBatteryFullyChargedNotificationLocked() { + return mIsShowingBatteryFullyChargedNotification && + (mPlugType == 0 || mBatteryProps.batteryLevel < BATTERY_SCALE); + } + + private void clearBatteryFullyChargedNotificationLocked() { + NotificationManager nm = mContext.getSystemService(NotificationManager.class); + nm.cancel(com.android.internal.R.string.notify_battery_fully_charged_title); + mIsShowingBatteryFullyChargedNotification = false; + } + private final class Led { private final Light mBatteryLight; diff --git a/services/core/java/com/android/server/ThemeService.java b/services/core/java/com/android/server/ThemeService.java index 6cdb8ab..96d1c5d 100644 --- a/services/core/java/com/android/server/ThemeService.java +++ b/services/core/java/com/android/server/ThemeService.java @@ -1188,7 +1188,7 @@ public class ThemeService extends IThemeService.Stub { }; private void processInstalledThemes() { - final String defaultTheme = ThemeUtils.getDefaultThemePackageName(mContext); + final String defaultTheme = getDefaultThemePackageName(mContext); Message msg; // Make sure the default theme is the first to get processed! if (!ThemeConfig.SYSTEM_DEFAULT.equals(defaultTheme)) { @@ -1247,4 +1247,31 @@ public class ThemeService extends IThemeService.Stub { return null; } + + /** + * Get the default theme package name + * Historically this was done using {@link ThemeUtils#getDefaultThemePackageName(Context)} but + * the setting that is queried in that method uses the AOSP settings provider but the setting + * is now in CMSettings. Since {@link ThemeUtils} is in the core framework we cannot access + * CMSettings. + * @param context + * @return Default theme package name + */ + private static String getDefaultThemePackageName(Context context) { + final String defaultThemePkg = CMSettings.Secure.getString(context.getContentResolver(), + CMSettings.Secure.DEFAULT_THEME_PACKAGE); + if (!TextUtils.isEmpty(defaultThemePkg)) { + PackageManager pm = context.getPackageManager(); + try { + if (pm.getPackageInfo(defaultThemePkg, 0) != null) { + return defaultThemePkg; + } + } catch (PackageManager.NameNotFoundException e) { + // doesn't exist so system will be default + Log.w(TAG, "Default theme " + defaultThemePkg + " not found", e); + } + } + + return SYSTEM_DEFAULT; + } } diff --git a/services/core/jni/com_android_server_AlarmManagerService.cpp b/services/core/jni/com_android_server_AlarmManagerService.cpp index 80b8923..0352461 100644 --- a/services/core/jni/com_android_server_AlarmManagerService.cpp +++ b/services/core/jni/com_android_server_AlarmManagerService.cpp @@ -40,6 +40,8 @@ #include <linux/android_alarm.h> #include <linux/rtc.h> +#include <memory> + #if HAVE_QC_TIME_SERVICES extern "C" { #include <private/time_genoff.h> @@ -380,14 +382,14 @@ static bool rtc_is_hctosys(unsigned int rtc_id) static int wall_clock_rtc() { - DIR *dir = opendir(rtc_sysfs); - if (!dir) { + std::unique_ptr<DIR, int(*)(DIR*)> dir(opendir(rtc_sysfs), closedir); + if (!dir.get()) { ALOGE("failed to open %s: %s", rtc_sysfs, strerror(errno)); return -1; } struct dirent *dirent; - while (errno = 0, dirent = readdir(dir)) { + while (errno = 0, dirent = readdir(dir.get())) { unsigned int rtc_id; int matched = sscanf(dirent->d_name, "rtc%u", &rtc_id); diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index 36de974..128d38da 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -230,8 +230,14 @@ public final class Call { */ public static final int CAPABILITY_ADD_PARTICIPANT = 0x02000000; + /** + * Remote device supports call transfers. + * @hide + */ + public static final int CAPABILITY_SUPPORTS_TRANSFER = 0x04000000; + //****************************************************************************************** - // Next CAPABILITY value: 0x04000000 + // Next CAPABILITY value: 0x08000000 //****************************************************************************************** /** @@ -400,6 +406,9 @@ public final class Call { if (can(capabilities, CAPABILITY_ADD_PARTICIPANT)) { builder.append(" CAPABILITY_ADD_PARTICIPANT"); } + if (can(capabilities, CAPABILITY_SUPPORTS_TRANSFER)) { + builder.append(" CAPABILITY_SUPPORTS_TRANSFER"); + } builder.append("]"); return builder.toString(); } @@ -928,6 +937,15 @@ public final class Call { } /** + * Instructs this {@code Call} to connect the current active call and the call on hold. + * The current call will then disconnect. See {@link Details#CAPABILITY_SUPPORTS_TRANSFER}. + * @hide + */ + public void transferCall() { + mInCallAdapter.transferCall(mTelecomCallId); + } + + /** * Swaps the calls within this conference. See {@link Details#CAPABILITY_SWAP_CONFERENCE}. */ public void swapConference() { diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 01582a8..a972425 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -272,8 +272,14 @@ public abstract class Connection extends Conferenceable { */ public static final int CAPABILITY_SUPPORTS_DOWNGRADE_TO_VOICE_REMOTE = 0x01000000; + /** + * Remote device supports call transfers. + * @hide + */ + public static final int CAPABILITY_SUPPORTS_TRANSFER = 0x04000000; + //********************************************************************************************** - // Next CAPABILITY value: 0x04000000 + // Next CAPABILITY value: 0x08000000 //********************************************************************************************** /** @@ -1945,6 +1951,12 @@ public abstract class Connection extends Conferenceable { public void onReject() {} /** + * Transfers the current call. + * @hide + */ + public void onTransfer() { } + + /** * Notifies this Connection whether the user wishes to proceed with the post-dial DTMF codes. */ public void onPostDialContinue(boolean proceed) {} diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java index 9e4f9bb..0054be6 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -102,6 +102,7 @@ public abstract class ConnectionService extends Service { private static final int MSG_MERGE_CONFERENCE = 18; private static final int MSG_SWAP_CONFERENCE = 19; private static final int MSG_SET_LOCAL_HOLD = 20; + private static final int MSG_EXPLICIT_TRANSFER = 21; //Proprietary values starts after this. private static final int MSG_ADD_PARTICIPANT_WITH_CONFERENCE = 30; @@ -247,6 +248,11 @@ public abstract class ConnectionService extends Service { args.argi1 = proceed ? 1 : 0; mHandler.obtainMessage(MSG_ON_POST_DIAL_CONTINUE, args).sendToTarget(); } + + @Override + public void explicitTransfer(String callId) { + mHandler.obtainMessage(MSG_EXPLICIT_TRANSFER, callId).sendToTarget(); + } }; private final Handler mHandler = new Handler(Looper.getMainLooper()) { @@ -394,6 +400,9 @@ public abstract class ConnectionService extends Service { } break; } + case MSG_EXPLICIT_TRANSFER: + transfer((String) msg.obj); + break; default: break; } @@ -766,6 +775,11 @@ public abstract class ConnectionService extends Service { } } + private void transfer(String callId) { + Log.d(this, "transfer %s", callId); + findConnectionForAction(callId, "transfer").onTransfer(); + } + private void unhold(String callId) { Log.d(this, "unhold %s", callId); if (mConnectionById.containsKey(callId)) { diff --git a/telecomm/java/android/telecom/InCallAdapter.java b/telecomm/java/android/telecom/InCallAdapter.java index 7d0f5a7..8eb62ec 100644 --- a/telecomm/java/android/telecom/InCallAdapter.java +++ b/telecomm/java/android/telecom/InCallAdapter.java @@ -240,6 +240,13 @@ public final class InCallAdapter { } } + public void transferCall(String callId) { + try { + mAdapter.transferCall(callId); + } catch (RemoteException ignored) { + } + } + /** * Instructs Telecom to swap the child calls of the specified conference call. */ diff --git a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl index 23d70d5..26e2008 100644 --- a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl +++ b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl @@ -75,4 +75,6 @@ oneway interface IConnectionService { void setLocalCallHold(String callId, boolean lchState); void addParticipantWithConference(String callId, String recipients); + + void explicitTransfer(String callId); } diff --git a/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl b/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl index ee51efa..6ef8eda 100644 --- a/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl +++ b/telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl @@ -62,4 +62,6 @@ oneway interface IInCallAdapter { void turnOffProximitySensor(boolean screenOnImmediately); void switchToOtherActiveSub(String subId); + + void transferCall(String callId); } |