10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2008 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony; 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.app.Activity; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.ComponentName; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Intent; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.ServiceConnection; 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.provider.Telephony; 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.provider.Telephony.Sms.Intents; 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log; 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.IBinder; 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.RemoteException; 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WAP push handler class. 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @hide 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class WapPushOverSms { 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String LOG_TAG = "WAP PUSH"; 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private final Context mContext; 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private WspTypeDecoder pduDecoder; 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private SMSDispatcher mSmsDispatcher; 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Hold the wake lock for 5 seconds, which should be enough time for 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * any receiver(s) to grab its own wake lock. 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private final int WAKE_LOCK_TIMEOUT = 5000; 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private final int BIND_RETRY_INTERVAL = 1000; 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * A handle to WapPushManager interface 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private WapPushConnection mWapConn = null; 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private class WapPushConnection implements ServiceConnection { 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private IWapPushManager mWapPushMan; 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private Context mOwner; 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public WapPushConnection(Context ownerContext) { 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mOwner = ownerContext; 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void onServiceConnected(ComponentName name, IBinder service) { 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mWapPushMan = IWapPushManager.Stub.asInterface(service); 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (false) Log.v(LOG_TAG, "wappush manager connected to " + 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mOwner.hashCode()); 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void onServiceDisconnected(ComponentName name) { 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mWapPushMan = null; 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (false) Log.v(LOG_TAG, "wappush manager disconnected."); 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // WapPushManager must be always attached. 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville rebindWapPushManager(); 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * bind WapPushManager 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void bindWapPushManager() { 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mWapPushMan != null) return; 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final ServiceConnection wapPushConnection = this; 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mOwner.bindService(new Intent(IWapPushManager.class.getName()), 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville wapPushConnection, Context.BIND_AUTO_CREATE); 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * rebind WapPushManager 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * This method is called when WapPushManager is disconnected unexpectedly. 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void rebindWapPushManager() { 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mWapPushMan != null) return; 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville final ServiceConnection wapPushConnection = this; 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville new Thread() { 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void run() { 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville while (mWapPushMan == null) { 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mOwner.bindService(new Intent(IWapPushManager.class.getName()), 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville wapPushConnection, Context.BIND_AUTO_CREATE); 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Thread.sleep(BIND_RETRY_INTERVAL); 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (InterruptedException e) { 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (false) Log.v(LOG_TAG, "sleep interrupted."); 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville }.start(); 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Returns interface to WapPushManager 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public IWapPushManager getWapPushManager() { 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mWapPushMan; 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public WapPushOverSms(Phone phone, SMSDispatcher smsDispatcher) { 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSmsDispatcher = smsDispatcher; 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mContext = phone.getContext(); 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mWapConn = new WapPushConnection(mContext); 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mWapConn.bindWapPushManager(); 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Dispatches inbound messages that are in the WAP PDU format. See 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * wap-230-wsp-20010705-a section 8 for details on the WAP PDU format. 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @param pdu The WAP PDU, made up of one or more SMS PDUs 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * @return a result code from {@link Telephony.Sms.Intents}, or 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * {@link Activity#RESULT_OK} if the message has been broadcast 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * to applications 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public int dispatchWapPdu(byte[] pdu) { 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (false) Log.d(LOG_TAG, "Rx: " + IccUtils.bytesToHexString(pdu)); 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int index = 0; 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int transactionId = pdu[index++] & 0xFF; 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int pduType = pdu[index++] & 0xFF; 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int headerLength = 0; 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((pduType != WspTypeDecoder.PDU_TYPE_PUSH) && 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (pduType != WspTypeDecoder.PDU_TYPE_CONFIRMED_PUSH)) { 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (false) Log.w(LOG_TAG, "Received non-PUSH WAP PDU. Type = " + pduType); 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return Intents.RESULT_SMS_HANDLED; 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pduDecoder = new WspTypeDecoder(pdu); 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Parse HeaderLen(unsigned integer). 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * From wap-230-wsp-20010705-a section 8.1.2 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * The maximum size of a uintvar is 32 bits. 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * So it will be encoded in no more than 5 octets. 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (pduDecoder.decodeUintvarInteger(index) == false) { 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (false) Log.w(LOG_TAG, "Received PDU. Header Length error."); 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return Intents.RESULT_SMS_GENERIC_ERROR; 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville headerLength = (int)pduDecoder.getValue32(); 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville index += pduDecoder.getDecodedDataLength(); 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int headerStartIndex = index; 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Parse Content-Type. 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * From wap-230-wsp-20010705-a section 8.4.2.24 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Content-type-value = Constrained-media | Content-general-form 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Content-general-form = Value-length Media-type 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Media-type = (Well-known-media | Extension-Media) *(Parameter) 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Value-length = Short-length | (Length-quote Length) 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Short-length = <Any octet 0-30> (octet <= WAP_PDU_SHORT_LENGTH_MAX) 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Length-quote = <Octet 31> (WAP_PDU_LENGTH_QUOTE) 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Length = Uintvar-integer 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (pduDecoder.decodeContentType(index) == false) { 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (false) Log.w(LOG_TAG, "Received PDU. Header Content-Type error."); 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return Intents.RESULT_SMS_GENERIC_ERROR; 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String mimeType = pduDecoder.getValueString(); 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville long binaryContentType = pduDecoder.getValue32(); 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville index += pduDecoder.getDecodedDataLength(); 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] header = new byte[headerLength]; 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville System.arraycopy(pdu, headerStartIndex, header, 0, header.length); 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville byte[] intentData; 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mimeType != null && mimeType.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO)) { 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville intentData = pdu; 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int dataIndex = headerStartIndex + headerLength; 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville intentData = new byte[pdu.length - dataIndex]; 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville System.arraycopy(pdu, dataIndex, intentData, 0, intentData.length); 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Seek for application ID field in WSP header. 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * If application ID is found, WapPushManager substitute the message 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * processing. Since WapPushManager is optional module, if WapPushManager 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * is not found, legacy message processing will be continued. 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (pduDecoder.seekXWapApplicationId(index, index + headerLength - 1)) { 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville index = (int) pduDecoder.getValue32(); 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pduDecoder.decodeXWapApplicationId(index); 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String wapAppId = pduDecoder.getValueString(); 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (wapAppId == null) { 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville wapAppId = Integer.toString((int) pduDecoder.getValue32()); 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String contentType = ((mimeType == null) ? 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Long.toString(binaryContentType) : mimeType); 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (false) Log.v(LOG_TAG, "appid found: " + wapAppId + ":" + contentType); 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville boolean processFurther = true; 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville IWapPushManager wapPushMan = mWapConn.getWapPushManager(); 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (wapPushMan == null) { 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (false) Log.w(LOG_TAG, "wap push manager not found!"); 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Intent intent = new Intent(); 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville intent.putExtra("transactionId", transactionId); 2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville intent.putExtra("pduType", pduType); 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville intent.putExtra("header", header); 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville intent.putExtra("data", intentData); 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville intent.putExtra("contentTypeParameters", 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville pduDecoder.getContentParameters()); 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int procRet = wapPushMan.processMessage(wapAppId, contentType, intent); 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (false) Log.v(LOG_TAG, "procRet:" + procRet); 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if ((procRet & WapPushManagerParams.MESSAGE_HANDLED) > 0 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville && (procRet & WapPushManagerParams.FURTHER_PROCESSING) == 0) { 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville processFurther = false; 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!processFurther) { 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return Intents.RESULT_SMS_HANDLED; 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (RemoteException e) { 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (false) Log.w(LOG_TAG, "remote func failed..."); 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (false) Log.v(LOG_TAG, "fall back to existing handler"); 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mimeType == null) { 2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (false) Log.w(LOG_TAG, "Header Content-Type error."); 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return Intents.RESULT_SMS_GENERIC_ERROR; 2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String permission; 2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mimeType.equals(WspTypeDecoder.CONTENT_TYPE_B_MMS)) { 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville permission = "android.permission.RECEIVE_MMS"; 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } else { 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville permission = "android.permission.RECEIVE_WAP_PUSH"; 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Intent intent = new Intent(Intents.WAP_PUSH_RECEIVED_ACTION); 2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville intent.setType(mimeType); 2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville intent.putExtra("transactionId", transactionId); 2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville intent.putExtra("pduType", pduType); 2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville intent.putExtra("header", header); 2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville intent.putExtra("data", intentData); 2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville intent.putExtra("contentTypeParameters", pduDecoder.getContentParameters()); 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSmsDispatcher.dispatch(intent, permission); 2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return Activity.RESULT_OK; 2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 276