summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/preference/VolumePreference.java17
-rw-r--r--core/java/android/provider/Settings.java18
-rw-r--r--core/res/res/values-it/strings.xml2
-rw-r--r--services/audioflinger/Android.mk4
-rw-r--r--services/audioflinger/AudioFlinger.cpp37
-rwxr-xr-xservices/camera/libcameraservice/CameraHardwareInterface.h2
-rw-r--r--services/camera/libcameraservice/CameraService.cpp4
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java8
-rw-r--r--services/java/com/android/server/am/ActivityStack.java24
-rw-r--r--telephony/java/com/android/internal/telephony/SamsungCDMAQualcommRIL.java58
-rw-r--r--telephony/java/com/android/internal/telephony/SamsungQualcommD2RIL.java110
-rw-r--r--telephony/java/com/android/internal/telephony/SamsungRIL.java16
-rw-r--r--telephony/java/com/android/internal/telephony/Smdk4210RIL.java16
-rw-r--r--telephony/tests/telephonytests/src/com/android/internal/telephony/gsm/UsimDataDownloadCommands.java9
14 files changed, 311 insertions, 14 deletions
diff --git a/core/java/android/preference/VolumePreference.java b/core/java/android/preference/VolumePreference.java
index fe5e76c..e0491d0 100644
--- a/core/java/android/preference/VolumePreference.java
+++ b/core/java/android/preference/VolumePreference.java
@@ -146,6 +146,11 @@ public class VolumePreference extends SeekBarDialogPreference implements
}
}
+ /** @hide */
+ protected boolean onVolumeChange(SeekBarVolumizer volumizer, int value) {
+ return true;
+ }
+
@Override
protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState();
@@ -307,10 +312,14 @@ public class VolumePreference extends SeekBarDialogPreference implements
}
void postSetVolume(int progress) {
- // Do the volume changing separately to give responsive UI
- mLastProgress = progress;
- mHandler.removeCallbacks(this);
- mHandler.post(this);
+ if (onVolumeChange(this, progress)) {
+ // Do the volume changing separately to give responsive UI
+ mLastProgress = progress;
+ mHandler.removeCallbacks(this);
+ mHandler.post(this);
+ } else {
+ mSeekBar.setProgress(mLastProgress);
+ }
}
public void onStartTrackingTouch(SeekBar seekBar) {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 157acea..4c4a6d5 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -1661,6 +1661,24 @@ public final class Settings {
"notifications_use_ring_volume";
/**
+ * Whether the phone ringtone should be played in an increasing manner
+ * @hide
+ */
+ public static final String INCREASING_RING = "increasing_ring";
+
+ /**
+ * Minimum volume index for increasing ring volume
+ * @hide
+ */
+ public static final String INCREASING_RING_MIN_VOLUME = "increasing_ring_min_vol";
+
+ /**
+ * Time (in ms) between ringtone volume increases
+ * @hide
+ */
+ public static final String INCREASING_RING_INTERVAL = "increasing_ring_interval";
+
+ /**
* Whether silent mode should allow vibration feedback. This is used
* internally in AudioService and the Sound settings activity to
* coordinate decoupling of vibrate and silent modes. This setting
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index e8409ca..5f17cc3 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -601,6 +601,8 @@
<item msgid="2506857312718630823">"ICQ"</item>
<item msgid="1648797903785279353">"Jabber"</item>
</string-array>
+ <string name="toast_rotation_unlocked">Rotazione display sbloccata</string>
+ <string name="toast_rotation_locked">Rotazione display bloccata</string>
<string name="phoneTypeCustom" msgid="1644738059053355820">"Personalizzato"</string>
<string name="phoneTypeHome" msgid="2570923463033985887">"Casa"</string>
<string name="phoneTypeMobile" msgid="6501463557754751037">"Cellulare"</string>
diff --git a/services/audioflinger/Android.mk b/services/audioflinger/Android.mk
index e5c39b1..83d18ac 100644
--- a/services/audioflinger/Android.mk
+++ b/services/audioflinger/Android.mk
@@ -34,6 +34,10 @@ ifeq ($(BOARD_USE_MOTO_DOCK_HACK),true)
LOCAL_CFLAGS += -DMOTO_DOCK_HACK
endif
+ifeq ($(BOARD_HAS_SAMSUNG_VOLUME_BUG),true)
+ LOCAL_CFLAGS += -DHAS_SAMSUNG_VOLUME_BUG
+endif
+
ifeq ($(ARCH_ARM_HAVE_NEON),true)
LOCAL_CFLAGS += -D__ARM_HAVE_NEON
endif
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 0faf367..7c25380 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -95,6 +95,11 @@ static const uint32_t kMinThreadSleepTimeUs = 5000;
// maximum divider applied to the active sleep time in the mixer thread loop
static const uint32_t kMaxThreadSleepTimeShift = 2;
+#ifdef HAS_SAMSUNG_VOLUME_BUG
+float gPrevMusicStreamVolume = 0;
+bool gMusicStreamIsMuted = false;
+bool gMusicStreamNeedsPrevVolume = false;
+#endif
// ----------------------------------------------------------------------------
@@ -2527,9 +2532,41 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track
track->setPaused();
}
} else {
+#ifdef HAS_SAMSUNG_VOLUME_BUG
+ if (track->type() == AUDIO_STREAM_MUSIC && !track->isMuted() && !track->isPausing()) {
+ if(mStreamTypes[AUDIO_STREAM_MUSIC].volume > 0 && !gMusicStreamNeedsPrevVolume) {
+ gPrevMusicStreamVolume = mStreamTypes[AUDIO_STREAM_MUSIC].volume;
+ } else {
+ gMusicStreamIsMuted = true;
+ }
+ } else if (track->type() == AUDIO_STREAM_MUSIC && (track->isMuted() || track->isPausing())) {
+ gMusicStreamIsMuted = true;
+ }
+ if (track->type() == AUDIO_STREAM_NOTIFICATION && gMusicStreamIsMuted) {
+ LOGD("Music stream needs volume restore!");
+ LOGD("gPrevMusicStreamVolume = %f", gPrevMusicStreamVolume);
+ gMusicStreamNeedsPrevVolume = true;
+ }
+#endif
// read original volumes with volume control
float typeVolume = mStreamTypes[track->type()].volume;
+
+#ifdef HAS_SAMSUNG_VOLUME_BUG
+ if (track->type() == AUDIO_STREAM_MUSIC && typeVolume > 0 && !track->isMuted() &&
+ !track->isPausing() && gMusicStreamNeedsPrevVolume) {
+ LOGI("Restoring last known good volume value on music stream!");
+ LOGI("gPrevMusicStreamVolume = %f", gPrevMusicStreamVolume);
+ mStreamTypes[AUDIO_STREAM_MUSIC].volume = gPrevMusicStreamVolume;
+ typeVolume = gPrevMusicStreamVolume;
+ gMusicStreamIsMuted = false;
+ gMusicStreamNeedsPrevVolume = false;
+ } else if (track->type() == AUDIO_STREAM_MUSIC && typeVolume > 0
+ && !track->isMuted() && !track->isPausing()) {
+ gMusicStreamIsMuted = false;
+ }
+#endif
+
float v = masterVolume * typeVolume;
vl = (uint32_t)(v * cblk->volume[0]) << 12;
vr = (uint32_t)(v * cblk->volume[1]) << 12;
diff --git a/services/camera/libcameraservice/CameraHardwareInterface.h b/services/camera/libcameraservice/CameraHardwareInterface.h
index 9a29e8f..f787266 100755
--- a/services/camera/libcameraservice/CameraHardwareInterface.h
+++ b/services/camera/libcameraservice/CameraHardwareInterface.h
@@ -115,10 +115,12 @@ public:
LOGV("%s(%s) buf %p", __FUNCTION__, mName.string(), buf.get());
if (mDevice->ops->set_preview_window) {
+#ifdef QCOM_HARDWARE
LOGV("%s buf %p mPreviewWindow %p", __FUNCTION__, buf.get(), mPreviewWindow.get());
if (mPreviewWindow.get() && (buf.get() != mPreviewWindow.get())) {
mDevice->ops->set_preview_window(mDevice, 0);
}
+#endif
mPreviewWindow = buf;
mHalPreviewWindow.user = this;
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index 8d95d65..e15a1b9 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -528,7 +528,9 @@ void CameraService::Client::disconnect() {
// Release the held ANativeWindow resources.
if (mPreviewWindow != 0) {
+#ifdef QCOM_HARDWARE
mHardware->setPreviewWindow(0);
+#endif
disconnectWindow(mPreviewWindow);
mPreviewWindow = 0;
}
@@ -570,8 +572,10 @@ status_t CameraService::Client::setPreviewWindow(const sp<IBinder>& binder,
native_window_set_buffers_transform(window.get(), mOrientation);
result = mHardware->setPreviewWindow(window);
}
+#ifdef QCOM_HARDWARE
} else {
result = mHardware->setPreviewWindow(window);
+#endif
}
if (result == NO_ERROR) {
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 3bed489..a274891 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -3004,7 +3004,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
- final void logAppTooSlow(ProcessRecord app, long startTime, String msg) {
+ final void logAppTooSlow(int pid, long startTime, String msg) {
if (IS_USER_BUILD) {
return;
}
@@ -3037,7 +3037,7 @@ public final class ActivityManagerService extends ActivityManagerNative
sb.append(msg);
FileOutputStream fos = new FileOutputStream(tracesFile);
fos.write(sb.toString().getBytes());
- if (app == null) {
+ if (pid <= 0) {
fos.write("\n*** No application process!".getBytes());
}
fos.close();
@@ -3047,9 +3047,9 @@ public final class ActivityManagerService extends ActivityManagerNative
return;
}
- if (app != null) {
+ if (pid > 0) {
ArrayList<Integer> firstPids = new ArrayList<Integer>();
- firstPids.add(app.pid);
+ firstPids.add(pid);
dumpStackTraces(tracesPath, firstPids, null, null);
}
diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java
index 86d3a1a..d581d33 100644
--- a/services/java/com/android/server/am/ActivityStack.java
+++ b/services/java/com/android/server/am/ActivityStack.java
@@ -307,11 +307,18 @@ final class ActivityStack {
// We don't at this point know if the activity is fullscreen,
// so we need to be conservative and assume it isn't.
Slog.w(TAG, "Activity pause timeout for " + r);
+ int pid = -1;
+ long pauseTime = 0;
+ String m = null;
synchronized (mService) {
if (r.app != null) {
- mService.logAppTooSlow(r.app, r.pauseTime,
- "pausing " + r);
+ pid = r.app.pid;
}
+ pauseTime = r.pauseTime;
+ m = "pausing " + r;
+ }
+ if (pid > 0) {
+ mService.logAppTooSlow(pid, pauseTime, m);
}
activityPaused(r != null ? r.appToken : null, true);
@@ -332,12 +339,21 @@ final class ActivityStack {
} break;
case LAUNCH_TICK_MSG: {
ActivityRecord r = (ActivityRecord)msg.obj;
+ int pid = -1;
+ long launchTickTime = 0;
+ String m = null;
synchronized (mService) {
if (r.continueLaunchTickingLocked()) {
- mService.logAppTooSlow(r.app, r.launchTickTime,
- "launching " + r);
+ if (r.app != null) {
+ pid = r.app.pid;
+ }
+ launchTickTime = r.launchTickTime;
+ m = "launching " + r;
}
}
+ if (pid > 0) {
+ mService.logAppTooSlow(pid, launchTickTime, m);
+ }
} break;
case DESTROY_TIMEOUT_MSG: {
ActivityRecord r = (ActivityRecord)msg.obj;
diff --git a/telephony/java/com/android/internal/telephony/SamsungCDMAQualcommRIL.java b/telephony/java/com/android/internal/telephony/SamsungCDMAQualcommRIL.java
index ff5bce1..6a5487f 100644
--- a/telephony/java/com/android/internal/telephony/SamsungCDMAQualcommRIL.java
+++ b/telephony/java/com/android/internal/telephony/SamsungCDMAQualcommRIL.java
@@ -34,6 +34,8 @@ import android.telephony.PhoneNumberUtils;
import com.android.internal.telephony.RILConstants;
import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
import com.android.internal.telephony.cdma.CdmaInformationRecords;
+import com.android.internal.telephony.cdma.CdmaInformationRecords.CdmaSignalInfoRec;
+import com.android.internal.telephony.cdma.SignalToneUtil;
import java.util.ArrayList;
import java.util.Collections;
@@ -259,6 +261,62 @@ public class SamsungCDMAQualcommRIL extends QualcommSharedRIL implements Command
return response;
}
+ // Workaround for Samsung CDMA "ring of death" bug:
+ //
+ // Symptom: As soon as the phone receives notice of an incoming call, an
+ // audible "old fashioned ring" is emitted through the earpiece and
+ // persists through the duration of the call, or until reboot if the call
+ // isn't answered.
+ //
+ // Background: The CDMA telephony stack implements a number of "signal info
+ // tones" that are locally generated by ToneGenerator and mixed into the
+ // voice call path in response to radio RIL_UNSOL_CDMA_INFO_REC requests.
+ // One of these tones, IS95_CONST_IR_SIG_IS54B_L, is requested by the
+ // radio just prior to notice of an incoming call when the voice call
+ // path is muted. CallNotifier is responsible for stopping all signal
+ // tones (by "playing" the TONE_CDMA_SIGNAL_OFF tone) upon receipt of a
+ // "new ringing connection", prior to unmuting the voice call path.
+ //
+ // Problem: CallNotifier's incoming call path is designed to minimize
+ // latency to notify users of incoming calls ASAP. Thus,
+ // SignalInfoTonePlayer requests are handled asynchronously by spawning a
+ // one-shot thread for each. Unfortunately the ToneGenerator API does
+ // not provide a mechanism to specify an ordering on requests, and thus,
+ // unexpected thread interleaving may result in ToneGenerator processing
+ // them in the opposite order that CallNotifier intended. In this case,
+ // playing the "signal off" tone first, followed by playing the "old
+ // fashioned ring" indefinitely.
+ //
+ // Solution: An API change to ToneGenerator is required to enable
+ // SignalInfoTonePlayer to impose an ordering on requests (i.e., drop any
+ // request that's older than the most recent observed). Such a change,
+ // or another appropriate fix should be implemented in AOSP first.
+ //
+ // Workaround: Intercept RIL_UNSOL_CDMA_INFO_REC requests from the radio,
+ // check for a signal info record matching IS95_CONST_IR_SIG_IS54B_L, and
+ // drop it so it's never seen by CallNotifier. If other signal tones are
+ // observed to cause this problem, they should be dropped here as well.
+ @Override
+ protected void
+ notifyRegistrantsCdmaInfoRec(CdmaInformationRecords infoRec) {
+ final int response = RIL_UNSOL_CDMA_INFO_REC;
+
+ if (infoRec.record instanceof CdmaSignalInfoRec) {
+ CdmaSignalInfoRec sir = (CdmaSignalInfoRec)infoRec.record;
+ if (sir != null && sir.isPresent &&
+ sir.signalType == SignalToneUtil.IS95_CONST_IR_SIGNAL_IS54B &&
+ sir.alertPitch == SignalToneUtil.IS95_CONST_IR_ALERT_MED &&
+ sir.signal == SignalToneUtil.IS95_CONST_IR_SIG_IS54B_L) {
+
+ Log.d(LOG_TAG, "Dropping \"" + responseToString(response) + " " +
+ retToString(response, sir) + "\" to prevent \"ring of death\" bug.");
+ return;
+ }
+ }
+
+ super.notifyRegistrantsCdmaInfoRec(infoRec);
+ }
+
class IccHandler extends Handler implements Runnable {
private static final int EVENT_RADIO_ON = 1;
private static final int EVENT_ICC_STATUS_CHANGED = 2;
diff --git a/telephony/java/com/android/internal/telephony/SamsungQualcommD2RIL.java b/telephony/java/com/android/internal/telephony/SamsungQualcommD2RIL.java
new file mode 100644
index 0000000..bd7c1d5
--- /dev/null
+++ b/telephony/java/com/android/internal/telephony/SamsungQualcommD2RIL.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2012 The CyanogenMod Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.telephony;
+
+import static com.android.internal.telephony.RILConstants.*;
+
+import android.content.Context;
+import android.os.Parcel;
+import android.os.SystemProperties;
+import android.util.Log;
+import com.android.internal.telephony.RILConstants;
+import java.util.Collections;
+import android.telephony.PhoneNumberUtils;
+
+import java.util.ArrayList;
+
+/**
+ * Custom RIL to handle unique behavior of D2 radio
+ *
+ * {@hide}
+ */
+public class SamsungQualcommD2RIL extends SamsungQualcommUiccRIL implements CommandsInterface {
+ public SamsungQualcommD2RIL(Context context, int networkMode, int cdmaSubscription) {
+ super(context, networkMode, cdmaSubscription);
+ }
+
+ @Override
+ protected Object
+ responseCallList(Parcel p) {
+ int num;
+ int voiceSettings;
+ ArrayList<DriverCall> response;
+ DriverCall dc;
+
+ num = p.readInt();
+ response = new ArrayList<DriverCall>(num);
+
+ for (int i = 0 ; i < num ; i++) {
+ dc = new DriverCall();
+
+ dc.state = DriverCall.stateFromCLCC(p.readInt());
+ dc.index = p.readInt();
+ dc.TOA = p.readInt();
+ dc.isMpty = (0 != p.readInt());
+ dc.isMT = (0 != p.readInt());
+ dc.als = p.readInt();
+ voiceSettings = p.readInt();
+ dc.isVoice = (0 == voiceSettings) ? false : true;
+ dc.isVoicePrivacy = (0 != p.readInt());
+ //Some Samsung magic data for Videocalls
+ // hack taken from smdk4210ril class
+ voiceSettings = p.readInt();
+ //printing it to cosole for later investigation
+ Log.d(LOG_TAG, "Samsung magic = " + voiceSettings);
+ dc.number = p.readString();
+ int np = p.readInt();
+ dc.numberPresentation = DriverCall.presentationFromCLIP(np);
+ dc.name = p.readString();
+ dc.namePresentation = p.readInt();
+ int uusInfoPresent = p.readInt();
+ if (uusInfoPresent == 1) {
+ dc.uusInfo = new UUSInfo();
+ dc.uusInfo.setType(p.readInt());
+ dc.uusInfo.setDcs(p.readInt());
+ byte[] userData = p.createByteArray();
+ dc.uusInfo.setUserData(userData);
+ riljLogv(String.format("Incoming UUS : type=%d, dcs=%d, length=%d",
+ dc.uusInfo.getType(), dc.uusInfo.getDcs(),
+ dc.uusInfo.getUserData().length));
+ riljLogv("Incoming UUS : data (string)="
+ + new String(dc.uusInfo.getUserData()));
+ riljLogv("Incoming UUS : data (hex): "
+ + IccUtils.bytesToHexString(dc.uusInfo.getUserData()));
+ } else {
+ riljLogv("Incoming UUS : NOT present!");
+ }
+
+ // Make sure there's a leading + on addresses with a TOA of 145
+ dc.number = PhoneNumberUtils.stringFromStringAndTOA(dc.number, dc.TOA);
+
+ response.add(dc);
+
+ if (dc.isVoicePrivacy) {
+ mVoicePrivacyOnRegistrants.notifyRegistrants();
+ riljLog("InCall VoicePrivacy is enabled");
+ } else {
+ mVoicePrivacyOffRegistrants.notifyRegistrants();
+ riljLog("InCall VoicePrivacy is disabled");
+ }
+ }
+
+ Collections.sort(response);
+
+ return response;
+ }
+}
diff --git a/telephony/java/com/android/internal/telephony/SamsungRIL.java b/telephony/java/com/android/internal/telephony/SamsungRIL.java
index 6851c52..fca571c 100644
--- a/telephony/java/com/android/internal/telephony/SamsungRIL.java
+++ b/telephony/java/com/android/internal/telephony/SamsungRIL.java
@@ -19,6 +19,8 @@ package com.android.internal.telephony;
import java.util.ArrayList;
import java.util.Collections;
+import java.lang.Runtime;
+import java.io.IOException;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -386,7 +388,7 @@ public class SamsungRIL extends RIL implements CommandsInterface {
case RIL_UNSOL_GPS_NOTI: ret = responseVoid(p); break; // Ignored in TW RIL.
case RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST: ret = responseVoid(p); break;
case RIL_UNSOL_SAMSUNG_UNKNOWN_MAGIC_REQUEST_2: ret = responseVoid(p); break;
- case RIL_UNSOL_AM: ret = responseVoid(p); break;
+ case RIL_UNSOL_AM: ret = responseString(p); break;
default:
throw new RuntimeException("Unrecognized unsol response: " + response);
@@ -720,6 +722,18 @@ public class SamsungRIL extends RIL implements CommandsInterface {
mResendIncallMuteRegistrants.notifyRegistrants(
new AsyncResult (null, ret, null));
}
+ break;
+ case RIL_UNSOL_AM:
+ String amString = (String) ret;
+ Log.d(LOG_TAG, "Executing AM: " + amString);
+
+ try {
+ Runtime.getRuntime().exec("am " + amString);
+ } catch (IOException e) {
+ e.printStackTrace();
+ Log.e(LOG_TAG, "am " + amString + " could not be executed.");
+ }
+ break;
}
}
diff --git a/telephony/java/com/android/internal/telephony/Smdk4210RIL.java b/telephony/java/com/android/internal/telephony/Smdk4210RIL.java
index 4226a7e..fa60598 100644
--- a/telephony/java/com/android/internal/telephony/Smdk4210RIL.java
+++ b/telephony/java/com/android/internal/telephony/Smdk4210RIL.java
@@ -60,6 +60,7 @@ import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.lang.Runtime;
import java.util.ArrayList;
import java.util.Collections;
@@ -500,7 +501,7 @@ public class Smdk4210RIL extends RIL implements CommandsInterface {
case RIL_UNSOL_RESPONSE_NEW_BROADCAST_SMS: ret = responseString(p); break;
case RIL_UNSOL_RIL_CONNECTED: ret = responseInts(p); break;
// SAMSUNG STATES
- case RIL_UNSOL_AM: ret = responseVoid(p); break;
+ case RIL_UNSOL_AM: ret = responseString(p); break;
case RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL: ret = responseVoid(p); break;
case RIL_UNSOL_DATA_SUSPEND_RESUME: ret = responseInts(p); break;
case RIL_UNSOL_STK_CALL_CONTROL_RESULT: ret = responseVoid(p); break;
@@ -536,7 +537,20 @@ public class Smdk4210RIL extends RIL implements CommandsInterface {
break;
// SAMSUNG STATES
case RIL_UNSOL_AM:
+ if (RILJ_LOGD) samsungUnsljLogRet(response, ret);
+ String amString = (String) ret;
+ Log.d(LOG_TAG, "Executing AM: " + amString);
+
+ try {
+ Runtime.getRuntime().exec("am " + amString);
+ } catch (IOException e) {
+ e.printStackTrace();
+ Log.e(LOG_TAG, "am " + amString + " could not be executed.");
+ }
+ break;
case RIL_UNSOL_DUN_PIN_CONTROL_SIGNAL:
+ if (RILJ_LOGD) samsungUnsljLogRet(response, ret);
+ break;
case RIL_UNSOL_DATA_SUSPEND_RESUME:
if (RILJ_LOGD) samsungUnsljLogRet(response, ret);
break;
diff --git a/telephony/tests/telephonytests/src/com/android/internal/telephony/gsm/UsimDataDownloadCommands.java b/telephony/tests/telephonytests/src/com/android/internal/telephony/gsm/UsimDataDownloadCommands.java
index 44aee91..4f77473 100644
--- a/telephony/tests/telephonytests/src/com/android/internal/telephony/gsm/UsimDataDownloadCommands.java
+++ b/telephony/tests/telephonytests/src/com/android/internal/telephony/gsm/UsimDataDownloadCommands.java
@@ -18,6 +18,7 @@ package com.android.internal.telephony.gsm;
import android.content.Context;
import android.os.AsyncResult;
+import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.util.Log;
@@ -611,4 +612,12 @@ class UsimDataDownloadCommands extends BaseCommands {
@Override
public boolean needsOldRilFeature(String feature) { return false; }
+
+ @Override
+ public void setOnCatSendSmsResult(Handler h, int what, Object obj) {
+ }
+
+ @Override
+ public void unSetOnCatSendSmsResult(Handler h) {
+ }
}