summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWolfgang Wiedmeyer <wolfgit@wiedmeyer.de>2016-02-06 17:40:43 +0100
committerWolfgang Wiedmeyer <wolfgit@wiedmeyer.de>2016-02-06 17:40:43 +0100
commit8bc386657e4bd582ea0897410523e27230a8e157 (patch)
tree5850aeac08fed40710b4db0e5f8e8bf03da3a63a
parentdf6d6764259f800d0a57452ecd487a0643d5dde1 (diff)
parentab0b7afb26a80f5af609ccc5fb68e05a97fec901 (diff)
downloadframeworks_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>
-rw-r--r--core/java/com/android/internal/widget/LockPatternUtils.java16
-rw-r--r--core/java/com/android/internal/widget/LockPatternView.java35
-rw-r--r--core/res/res/values/cm_strings.xml6
-rw-r--r--core/res/res/values/cm_symbols.xml5
-rw-r--r--core/res/res/values/config.xml3
-rw-r--r--graphics/java/android/graphics/Typeface.java2
-rw-r--r--packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java6
-rw-r--r--packages/SettingsProvider/res/values/customize.xml4
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java12
-rw-r--r--packages/SystemUI/res/values/cm_strings.xml2
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSDragPanel.java38
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QSPanelTopView.java22
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/tiles/EditTile.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java2
-rw-r--r--services/core/java/com/android/server/BatteryService.java64
-rw-r--r--services/core/java/com/android/server/ThemeService.java29
-rw-r--r--services/core/jni/com_android_server_AlarmManagerService.cpp8
-rw-r--r--telecomm/java/android/telecom/Call.java20
-rw-r--r--telecomm/java/android/telecom/Connection.java14
-rw-r--r--telecomm/java/android/telecom/ConnectionService.java14
-rw-r--r--telecomm/java/android/telecom/InCallAdapter.java7
-rw-r--r--telecomm/java/com/android/internal/telecom/IConnectionService.aidl2
-rw-r--r--telecomm/java/com/android/internal/telecom/IInCallAdapter.aidl2
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);
}