diff options
-rw-r--r-- | AndroidManifest.xml | 1 | ||||
-rw-r--r-- | src/com/android/stk/StkAppService.java | 59 |
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. |