diff options
6 files changed, 131 insertions, 69 deletions
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index 57a72bf..2b083dc 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -30,6 +30,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; +import android.graphics.PixelFormat; import android.graphics.Rect; import android.os.Bundle; import android.os.IBinder; @@ -178,6 +179,9 @@ public abstract class WallpaperService extends Service { }; final BaseSurfaceHolder mSurfaceHolder = new BaseSurfaceHolder() { + { + mRequestedFormat = PixelFormat.RGB_565; + } @Override public boolean onAllowLockCanvas() { diff --git a/core/java/com/android/internal/view/BaseSurfaceHolder.java b/core/java/com/android/internal/view/BaseSurfaceHolder.java index 3a04993..1e97cd6 100644 --- a/core/java/com/android/internal/view/BaseSurfaceHolder.java +++ b/core/java/com/android/internal/view/BaseSurfaceHolder.java @@ -41,7 +41,8 @@ public abstract class BaseSurfaceHolder implements SurfaceHolder { int mRequestedWidth = -1; int mRequestedHeight = -1; - int mRequestedFormat = PixelFormat.OPAQUE; + /** @hide */ + protected int mRequestedFormat = PixelFormat.OPAQUE; int mRequestedType = -1; long mLastLockTime = 0; diff --git a/include/media/EffectEnvironmentalReverbApi.h b/include/media/EffectEnvironmentalReverbApi.h index 2233e3f..36accd8 100644 --- a/include/media/EffectEnvironmentalReverbApi.h +++ b/include/media/EffectEnvironmentalReverbApi.h @@ -48,16 +48,16 @@ typedef enum //t_reverb_settings is equal to SLEnvironmentalReverbSettings defined in OpenSL ES specification. typedef struct s_reverb_settings { - int16_t roomLevel; - int16_t roomHFLevel; - int32_t decayTime; - int16_t decayHFRatio; - int16_t reflectionsLevel; - int32_t reflectionsDelay; - int16_t reverbLevel; - int32_t reverbDelay; - int16_t diffusion; - int16_t density; + int16_t roomLevel; + int16_t roomHFLevel; + uint32_t decayTime; + int16_t decayHFRatio; + int16_t reflectionsLevel; + uint32_t reflectionsDelay; + int16_t reverbLevel; + uint32_t reverbDelay; + int16_t diffusion; + int16_t density; } __attribute__((packed)) t_reverb_settings; diff --git a/media/libeffects/lvm/wrapper/Reverb/EffectReverb.cpp b/media/libeffects/lvm/wrapper/Reverb/EffectReverb.cpp index 45ef416..b3e1531 100755 --- a/media/libeffects/lvm/wrapper/Reverb/EffectReverb.cpp +++ b/media/libeffects/lvm/wrapper/Reverb/EffectReverb.cpp @@ -1133,7 +1133,7 @@ void ReverbSetDecayTime(ReverbContext *pContext, uint32_t time){ //LOGV("\tReverbSetDecayTime() just Got -> %d\n", ActiveParams.T60); if (time <= LVREV_MAX_T60) { - ActiveParams.T60 = time; + ActiveParams.T60 = (LVM_UINT16)time; } else { ActiveParams.T60 = LVREV_MAX_T60; @@ -1146,7 +1146,7 @@ void ReverbSetDecayTime(ReverbContext *pContext, uint32_t time){ pContext->SamplesToExitCount = (ActiveParams.T60 * pContext->config.inputCfg.samplingRate)/1000; //LOGV("\tReverbSetDecayTime() just Set SamplesToExitCount-> %d\n",pContext->SamplesToExitCount); - pContext->SavedDecayTime = time; + pContext->SavedDecayTime = (int16_t)time; //LOGV("\tReverbSetDecayTime end"); return; } @@ -1162,7 +1162,7 @@ void ReverbSetDecayTime(ReverbContext *pContext, uint32_t time){ // //---------------------------------------------------------------------------- -int32_t ReverbGetDecayTime(ReverbContext *pContext){ +uint32_t ReverbGetDecayTime(ReverbContext *pContext){ //LOGV("\tReverbGetDecayTime start"); LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ @@ -1181,7 +1181,7 @@ int32_t ReverbGetDecayTime(ReverbContext *pContext){ } //LOGV("\tReverbGetDecayTime end"); - return ActiveParams.T60; + return (uint32_t)ActiveParams.T60; } //---------------------------------------------------------------------------- @@ -1606,7 +1606,7 @@ int Reverb_getParameter(ReverbContext *pContext, // *(int16_t *)pValue); break; case REVERB_PARAM_DECAY_TIME: - *(int32_t *)pValue = ReverbGetDecayTime(pContext); + *(uint32_t *)pValue = ReverbGetDecayTime(pContext); //LOGV("\tReverb_getParameter() REVERB_PARAM_DECAY_TIME Value is %d", // *(int32_t *)pValue); @@ -1671,6 +1671,7 @@ int Reverb_getParameter(ReverbContext *pContext, int Reverb_setParameter (ReverbContext *pContext, void *pParam, void *pValue){ int status = 0; int16_t level; + int16_t ratio; uint32_t time; t_reverb_settings *pProperties; int32_t *pParamTemp = (int32_t *)pParam; @@ -1688,6 +1689,7 @@ int Reverb_setParameter (ReverbContext *pContext, void *pParam, void *pValue){ return -EINVAL; } pContext->nextPreset = preset; + return 0; } switch (param){ @@ -1724,10 +1726,10 @@ int Reverb_setParameter (ReverbContext *pContext, void *pParam, void *pValue){ //LOGV("\tReverb_setParameter() Called ReverbSetDecayTime"); break; case REVERB_PARAM_DECAY_HF_RATIO: - time = *(int16_t *)pValue; - //LOGV("\tReverb_setParameter() REVERB_PARAM_DECAY_HF_RATIO value is %d", time); + ratio = *(int16_t *)pValue; + //LOGV("\tReverb_setParameter() REVERB_PARAM_DECAY_HF_RATIO value is %d", ratio); //LOGV("\tReverb_setParameter() Calling ReverbSetDecayHfRatio"); - ReverbSetDecayHfRatio(pContext, time); + ReverbSetDecayHfRatio(pContext, ratio); //LOGV("\tReverb_setParameter() Called ReverbSetDecayHfRatio"); break; case REVERB_PARAM_REVERB_LEVEL: @@ -1738,17 +1740,17 @@ int Reverb_setParameter (ReverbContext *pContext, void *pParam, void *pValue){ //LOGV("\tReverb_setParameter() Called ReverbSetReverbLevel"); break; case REVERB_PARAM_DIFFUSION: - time = *(int16_t *)pValue; - //LOGV("\tReverb_setParameter() REVERB_PARAM_DECAY_DIFFUSION value is %d", time); + ratio = *(int16_t *)pValue; + //LOGV("\tReverb_setParameter() REVERB_PARAM_DECAY_DIFFUSION value is %d", ratio); //LOGV("\tReverb_setParameter() Calling ReverbSetDiffusion"); - ReverbSetDiffusion(pContext, time); + ReverbSetDiffusion(pContext, ratio); //LOGV("\tReverb_setParameter() Called ReverbSetDiffusion"); break; case REVERB_PARAM_DENSITY: - time = *(int16_t *)pValue; - //LOGV("\tReverb_setParameter() REVERB_PARAM_DECAY_DENSITY value is %d", time); + ratio = *(int16_t *)pValue; + //LOGV("\tReverb_setParameter() REVERB_PARAM_DECAY_DENSITY value is %d", ratio); //LOGV("\tReverb_setParameter() Calling ReverbSetDensity"); - ReverbSetDensity(pContext, time); + ReverbSetDensity(pContext, ratio); //LOGV("\tReverb_setParameter() Called ReverbSetDensity"); break; break; diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index 3db5dc1..e454c08 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -668,7 +668,7 @@ class BackupManagerService extends IBackupManager.Stub { while (true) { String packageName = in.readUTF(); Slog.i(TAG, " + " + packageName); - dataChanged(packageName); + dataChangedImpl(packageName); } } catch (EOFException e) { // no more data; we're done @@ -740,7 +740,7 @@ class BackupManagerService extends IBackupManager.Stub { int uid = mBackupParticipants.keyAt(i); HashSet<ApplicationInfo> participants = mBackupParticipants.valueAt(i); for (ApplicationInfo app: participants) { - dataChanged(app.packageName); + dataChangedImpl(app.packageName); } } } @@ -896,7 +896,7 @@ class BackupManagerService extends IBackupManager.Stub { if (!mEverStoredApps.contains(pkg.packageName)) { if (DEBUG) Slog.i(TAG, "New app " + pkg.packageName + " never backed up; scheduling"); - dataChanged(pkg.packageName); + dataChangedImpl(pkg.packageName); } } } @@ -1327,7 +1327,7 @@ class BackupManagerService extends IBackupManager.Stub { if (status != BackupConstants.TRANSPORT_OK) { Slog.w(TAG, "Backup pass unsuccessful, restaging"); for (BackupRequest req : mQueue) { - dataChanged(req.appInfo.packageName); + dataChangedImpl(req.appInfo.packageName); } // We also want to reset the backup schedule based on whatever @@ -1997,25 +1997,66 @@ class BackupManagerService extends IBackupManager.Stub { } } + private void dataChangedImpl(String packageName) { + HashSet<ApplicationInfo> targets = dataChangedTargets(packageName); + dataChangedImpl(packageName, targets); + } - // ----- IBackupManager binder interface ----- - - public void dataChanged(String packageName) { + private void dataChangedImpl(String packageName, HashSet<ApplicationInfo> targets) { // Record that we need a backup pass for the caller. Since multiple callers // may share a uid, we need to note all candidates within that uid and schedule // a backup pass for each of them. EventLog.writeEvent(EventLogTags.BACKUP_DATA_CHANGED, packageName); + if (targets == null) { + Slog.w(TAG, "dataChanged but no participant pkg='" + packageName + "'" + + " uid=" + Binder.getCallingUid()); + return; + } + + synchronized (mQueueLock) { + // Note that this client has made data changes that need to be backed up + for (ApplicationInfo app : targets) { + // validate the caller-supplied package name against the known set of + // packages associated with this uid + if (app.packageName.equals(packageName)) { + // Add the caller to the set of pending backups. If there is + // one already there, then overwrite it, but no harm done. + BackupRequest req = new BackupRequest(app, false); + if (mPendingBackups.put(app, req) == null) { + // Journal this request in case of crash. The put() + // operation returned null when this package was not already + // in the set; we want to avoid touching the disk redundantly. + writeToJournalLocked(packageName); + + if (DEBUG) { + int numKeys = mPendingBackups.size(); + Slog.d(TAG, "Now awaiting backup for " + numKeys + " participants:"); + for (BackupRequest b : mPendingBackups.values()) { + Slog.d(TAG, " + " + b + " agent=" + b.appInfo.backupAgentName); + } + } + } + } + } + } + } + + // Note: packageName is currently unused, but may be in the future + private HashSet<ApplicationInfo> dataChangedTargets(String packageName) { // If the caller does not hold the BACKUP permission, it can only request a // backup of its own data. - HashSet<ApplicationInfo> targets; if ((mContext.checkPermission(android.Manifest.permission.BACKUP, Binder.getCallingPid(), Binder.getCallingUid())) == PackageManager.PERMISSION_DENIED) { - targets = mBackupParticipants.get(Binder.getCallingUid()); - } else { - // a caller with full permission can ask to back up any participating app - // !!! TODO: allow backup of ANY app? - targets = new HashSet<ApplicationInfo>(); + synchronized (mBackupParticipants) { + return mBackupParticipants.get(Binder.getCallingUid()); + } + } + + // a caller with full permission can ask to back up any participating app + // !!! TODO: allow backup of ANY app? + HashSet<ApplicationInfo> targets = new HashSet<ApplicationInfo>(); + synchronized (mBackupParticipants) { int N = mBackupParticipants.size(); for (int i = 0; i < N; i++) { HashSet<ApplicationInfo> s = mBackupParticipants.valueAt(i); @@ -2024,37 +2065,7 @@ class BackupManagerService extends IBackupManager.Stub { } } } - if (targets != null) { - synchronized (mQueueLock) { - // Note that this client has made data changes that need to be backed up - for (ApplicationInfo app : targets) { - // validate the caller-supplied package name against the known set of - // packages associated with this uid - if (app.packageName.equals(packageName)) { - // Add the caller to the set of pending backups. If there is - // one already there, then overwrite it, but no harm done. - BackupRequest req = new BackupRequest(app, false); - if (mPendingBackups.put(app, req) == null) { - // Journal this request in case of crash. The put() - // operation returned null when this package was not already - // in the set; we want to avoid touching the disk redundantly. - writeToJournalLocked(packageName); - - if (DEBUG) { - int numKeys = mPendingBackups.size(); - Slog.d(TAG, "Now awaiting backup for " + numKeys + " participants:"); - for (BackupRequest b : mPendingBackups.values()) { - Slog.d(TAG, " + " + b + " agent=" + b.appInfo.backupAgentName); - } - } - } - } - } - } - } else { - Slog.w(TAG, "dataChanged but no participant pkg='" + packageName + "'" - + " uid=" + Binder.getCallingUid()); - } + return targets; } private void writeToJournalLocked(String str) { @@ -2072,6 +2083,23 @@ class BackupManagerService extends IBackupManager.Stub { } } + // ----- IBackupManager binder interface ----- + + public void dataChanged(final String packageName) { + final HashSet<ApplicationInfo> targets = dataChangedTargets(packageName); + if (targets == null) { + Slog.w(TAG, "dataChanged but no participant pkg='" + packageName + "'" + + " uid=" + Binder.getCallingUid()); + return; + } + + mBackupHandler.post(new Runnable() { + public void run() { + dataChangedImpl(packageName, targets); + } + }); + } + // Clear the given package's backup data from the current transport public void clearBackupData(String packageName) { if (DEBUG) Slog.v(TAG, "clearBackupData() of " + packageName); diff --git a/telephony/java/com/android/internal/telephony/CallManager.java b/telephony/java/com/android/internal/telephony/CallManager.java index c1232e8..caec7e1 100644 --- a/telephony/java/com/android/internal/telephony/CallManager.java +++ b/telephony/java/com/android/internal/telephony/CallManager.java @@ -466,6 +466,33 @@ public final class CallManager { } /** + * Hangup foreground call and resume the specific background call + * + * Note: this is noop if there is no foreground call or the heldCall is null + * + * @param heldCall to become foreground + * @throws CallStateException + */ + public void hangupForegroundResumeBackground(Call heldCall) throws CallStateException { + Phone foregroundPhone = null; + Phone backgroundPhone = null; + + if (hasActiveFgCall()) { + foregroundPhone = getFgPhone(); + if (heldCall != null) { + backgroundPhone = heldCall.getPhone(); + if (foregroundPhone == backgroundPhone) { + getActiveFgCall().hangup(); + } else { + // the call to be hangup and resumed belongs to different phones + getActiveFgCall().hangup(); + switchHoldingAndActive(heldCall); + } + } + } + } + + /** * Whether or not the phone can conference in the current phone * state--that is, one call holding and one call active. * @return true if the phone can conference; false otherwise. |
