summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AndroidManifest.xml1
-rw-r--r--src/com/android/stk/StkAppService.java59
2 files changed, 60 insertions, 0 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 935c920..ee434c0 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -28,6 +28,7 @@
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.RECEIVE_STK_COMMANDS" />
<uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER" />
+ <uses-permission android:name="android.permission.USER_ACTIVITY" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
diff --git a/src/com/android/stk/StkAppService.java b/src/com/android/stk/StkAppService.java
index fded0f3..a5a0517 100644
--- a/src/com/android/stk/StkAppService.java
+++ b/src/com/android/stk/StkAppService.java
@@ -50,6 +50,7 @@ import android.os.Parcel;
import android.os.PersistableBundle;
import android.os.PowerManager;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.SystemProperties;
import android.os.Vibrator;
import android.provider.Settings;
@@ -59,9 +60,11 @@ import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.view.Gravity;
+import android.view.IWindowManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
+import android.view.WindowManagerPolicy;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
@@ -94,6 +97,8 @@ import static com.android.internal.telephony.cat.CatCmdMessage.
SetupEventListConstants.IDLE_SCREEN_AVAILABLE_EVENT;
import static com.android.internal.telephony.cat.CatCmdMessage.
SetupEventListConstants.LANGUAGE_SELECTION_EVENT;
+import static com.android.internal.telephony.cat.CatCmdMessage.
+ SetupEventListConstants.USER_ACTIVITY_EVENT;
/**
* SIM toolkit application level service. Interacts with Telephopny messages,
@@ -174,6 +179,7 @@ public class StkAppService extends Service implements Runnable {
private BroadcastReceiver mLocaleChangeReceiver = null;
private TonePlayer mTonePlayer = null;
private Vibrator mVibrator = null;
+ private BroadcastReceiver mUserActivityReceiver = null;
// Used for setting FLAG_ACTIVITY_NO_USER_ACTION when
// creating an intent.
@@ -231,6 +237,9 @@ public class StkAppService extends Service implements Runnable {
// Message id to remove stop tone message from queue.
private static final int STOP_TONE_WHAT = 100;
+ // Message id to send user activity event to card.
+ private static final int OP_USER_ACTIVITY = 20;
+
// Response ids
static final int RES_ID_MENU_SELECTION = 11;
static final int RES_ID_INPUT = 12;
@@ -390,6 +399,7 @@ public class StkAppService extends Service implements Runnable {
@Override
public void onDestroy() {
CatLog.d(LOG_TAG, "onDestroy()");
+ unregisterUserActivityReceiver();
unregisterProcessObserver();
unregisterLocaleChangeReceiver();
sInstance = null;
@@ -667,6 +677,11 @@ public class StkAppService extends Service implements Runnable {
CatLog.d(this, "Stop tone");
handleStopTone(msg, slotId);
break;
+ case OP_USER_ACTIVITY:
+ for (int slot = PhoneConstants.SIM_ID_1; slot < mSimCount; slot++) {
+ checkForSetupEvent(USER_ACTIVITY_EVENT, null, slot);
+ }
+ break;
}
}
@@ -1662,6 +1677,9 @@ public class StkAppService extends Service implements Runnable {
}
switch (event) {
+ case USER_ACTIVITY_EVENT:
+ unregisterUserActivityReceiver();
+ break;
case IDLE_SCREEN_AVAILABLE_EVENT:
unregisterProcessObserver(AppInterface.CommandType.SET_UP_EVENT_LIST, slotId);
break;
@@ -1679,6 +1697,9 @@ public class StkAppService extends Service implements Runnable {
}
for (int event : mStkContext[slotId].mSetupEventListSettings.eventList) {
switch (event) {
+ case USER_ACTIVITY_EVENT:
+ registerUserActivityReceiver();
+ break;
case IDLE_SCREEN_AVAILABLE_EVENT:
registerProcessObserver();
break;
@@ -1691,6 +1712,38 @@ public class StkAppService extends Service implements Runnable {
}
}
+ private synchronized void registerUserActivityReceiver() {
+ if (mUserActivityReceiver == null) {
+ mUserActivityReceiver = new BroadcastReceiver() {
+ @Override public void onReceive(Context context, Intent intent) {
+ if (WindowManagerPolicy.ACTION_USER_ACTIVITY_NOTIFICATION.equals(
+ intent.getAction())) {
+ Message message = mServiceHandler.obtainMessage();
+ message.arg1 = OP_USER_ACTIVITY;
+ mServiceHandler.sendMessage(message);
+ unregisterUserActivityReceiver();
+ }
+ }
+ };
+ registerReceiver(mUserActivityReceiver, new IntentFilter(
+ WindowManagerPolicy.ACTION_USER_ACTIVITY_NOTIFICATION));
+ try {
+ IWindowManager wm = IWindowManager.Stub.asInterface(
+ ServiceManager.getService(Context.WINDOW_SERVICE));
+ wm.requestUserActivityNotification();
+ } catch (RemoteException e) {
+ CatLog.e(this, "failed to init WindowManager:" + e);
+ }
+ }
+ }
+
+ private synchronized void unregisterUserActivityReceiver() {
+ if (mUserActivityReceiver != null) {
+ unregisterReceiver(mUserActivityReceiver);
+ mUserActivityReceiver = null;
+ }
+ }
+
private synchronized void registerProcessObserver() {
if (mProcessObserver == null) {
try {
@@ -1812,6 +1865,7 @@ public class StkAppService extends Service implements Runnable {
CatLog.d(this, " Event " + event + "exists in the EventList");
switch (event) {
+ case USER_ACTIVITY_EVENT:
case IDLE_SCREEN_AVAILABLE_EVENT:
sendSetUpEventResponse(event, addedInfo, slotId);
removeSetUpEvent(event, slotId);
@@ -1849,6 +1903,11 @@ public class StkAppService extends Service implements Runnable {
mStkContext[slotId].mSetupEventListSettings.eventList[i] = INVALID_SETUP_EVENT;
switch (event) {
+ case USER_ACTIVITY_EVENT:
+ // The broadcast receiver can be unregistered
+ // as the event has already been sent to the card.
+ unregisterUserActivityReceiver();
+ break;
case IDLE_SCREEN_AVAILABLE_EVENT:
// The process observer can be unregistered
// as the idle screen has already been available.