Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 52a98d0a authored by Ye Wen's avatar Ye Wen
Browse files

Fix regression that stores data SMS automatically

A previous CL (ag/586092) accidentally auto persists data SMS sent by
non-default SMS app (which should only do that for text SMS).

b/19150134

Change-Id: I2f907b22aea2ce01bae3455a656f0e5a31978328
parent e70972cf
Loading
Loading
Loading
Loading
+16 −63
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ import android.app.Activity;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
@@ -29,21 +28,18 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.content.ServiceConnection;
import android.database.ContentObserver;
import android.database.sqlite.SqliteWrapper;
import android.net.Uri;
import android.os.AsyncResult;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.provider.Settings;
import android.provider.Telephony;
import android.provider.Telephony.Sms;
import android.provider.Telephony.Sms.Intents;
import android.service.carrier.CarrierMessagingService;
import android.service.carrier.ICarrierMessagingCallback;
import android.service.carrier.ICarrierMessagingService;
@@ -71,7 +67,6 @@ import com.android.internal.telephony.uicc.UiccCard;
import com.android.internal.telephony.uicc.UiccController;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
@@ -1291,10 +1286,14 @@ public abstract class SMSDispatcher extends Handler {

        private int mSubId;

        // If this is a text message (instead of data message)
        private boolean mIsText;

        private SmsTracker(HashMap<String, Object> data, PendingIntent sentIntent,
                PendingIntent deliveryIntent, PackageInfo appInfo, String destAddr, String format,
                AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri,
                SmsHeader smsHeader, boolean isExpectMore, String fullMessageText, int subId) {
                SmsHeader smsHeader, boolean isExpectMore, String fullMessageText, int subId,
                boolean isText) {
            mData = data;
            mSentIntent = sentIntent;
            mDeliveryIntent = deliveryIntent;
@@ -1311,6 +1310,7 @@ public abstract class SMSDispatcher extends Handler {
            mSmsHeader = smsHeader;
            mFullMessageText = fullMessageText;
            mSubId = subId;
            mIsText = isText;
        }

        /**
@@ -1360,7 +1360,10 @@ public abstract class SMSDispatcher extends Handler {
        }

        /**
         * Persist a sent SMS if required
         * Persist a sent SMS if required:
         * 1. It is a text message
         * 2. SmsApplication tells us to persist: sent from apps that are not default-SMS app or
         *    bluetooth
         *
         * @param context
         * @param messageType The folder to store (FAILED or SENT)
@@ -1368,7 +1371,8 @@ public abstract class SMSDispatcher extends Handler {
         * @return The telephony provider URI if stored
         */
        private Uri persistSentMessageIfRequired(Context context, int messageType, int errorCode) {
            if (!SmsApplication.shouldWriteMessageForPackage(mAppInfo.packageName, context)) {
            if (!mIsText ||
                    !SmsApplication.shouldWriteMessageForPackage(mAppInfo.packageName, context)) {
                return null;
            }
            Rlog.d(TAG, "Persist SMS into "
@@ -1510,7 +1514,7 @@ public abstract class SMSDispatcher extends Handler {
    protected SmsTracker getSmsTracker(HashMap<String, Object> data, PendingIntent sentIntent,
            PendingIntent deliveryIntent, String format, AtomicInteger unsentPartCount,
            AtomicBoolean anyPartFailed, Uri messageUri, SmsHeader smsHeader,
            boolean isExpectMore, String fullMessageText) {
            boolean isExpectMore, String fullMessageText, boolean isText) {
        // Get calling app package name via UID from Binder call
        PackageManager pm = mContext.getPackageManager();
        String[] packageNames = pm.getPackagesForUid(Binder.getCallingUid());
@@ -1530,15 +1534,15 @@ public abstract class SMSDispatcher extends Handler {
        String destAddr = PhoneNumberUtils.extractNetworkPortion((String) data.get("destAddr"));
        return new SmsTracker(data, sentIntent, deliveryIntent, appInfo, destAddr, format,
                unsentPartCount, anyPartFailed, messageUri, smsHeader, isExpectMore,
                fullMessageText, getSubId());
                fullMessageText, getSubId(), isText);
    }

    protected SmsTracker getSmsTracker(HashMap<String, Object> data, PendingIntent sentIntent,
            PendingIntent deliveryIntent, String format, Uri messageUri, boolean isExpectMore,
            String fullMessageText) {
            String fullMessageText, boolean isText) {
        return getSmsTracker(data, sentIntent, deliveryIntent, format, null/*unsentPartCount*/,
                null/*anyPartFailed*/, messageUri, null/*smsHeader*/, isExpectMore,
                fullMessageText);
                fullMessageText, isText);
    }

    protected HashMap<String, Object> getSmsTrackerMap(String destAddr, String scAddr,
@@ -1667,57 +1671,6 @@ public abstract class SMSDispatcher extends Handler {
        }
    }

    protected Uri writeOutboxMessage(int subId, String address, String text,
            boolean requireDeliveryReport, String creator) {
        final ContentValues values = new ContentValues(8);
        values.put(Telephony.Sms.SUBSCRIPTION_ID, subId);
        values.put(Telephony.Sms.ADDRESS, address);
        values.put(Telephony.Sms.BODY, text);
        values.put(Telephony.Sms.DATE, System.currentTimeMillis()); // milliseconds
        values.put(Telephony.Sms.SEEN, 1);
        values.put(Telephony.Sms.READ, 1);
        if (!TextUtils.isEmpty(creator)) {
            values.put(Telephony.Sms.CREATOR, creator);
        }
        if (requireDeliveryReport) {
            values.put(Telephony.Sms.STATUS, Telephony.Sms.STATUS_PENDING);
        }
        final long identity = Binder.clearCallingIdentity();
        try {
            final Uri uri =  mContext.getContentResolver().insert(
                    Telephony.Sms.Outbox.CONTENT_URI, values);
            return uri;
        } catch (Exception e) {
            Rlog.e(TAG, "writeOutboxMessage: Failed to persist outbox message", e);
            return null;
        } finally {
            Binder.restoreCallingIdentity(identity);
        }
    }

    protected void moveToOutbox(int subId, Uri messageUri, String creator) {
        final ContentValues values = new ContentValues(4);
        values.put(Telephony.Sms.SUBSCRIPTION_ID, subId);
        if (!TextUtils.isEmpty(creator)) {
            // Reset creator/sender
            values.put(Telephony.Sms.CREATOR, creator);
        }
        // Reset the timestamp
        values.put(Telephony.Sms.DATE, System.currentTimeMillis()); // milliseconds
        values.put(Telephony.Sms.TYPE, Telephony.Sms.MESSAGE_TYPE_OUTBOX);
        final long identity = Binder.clearCallingIdentity();
        try {
            if (mContext.getContentResolver().update(messageUri, values,
                    null/*where*/, null/*selectionArgs*/) != 1) {
                Rlog.e(TAG, "moveToOutbox: failed to update message " + messageUri);
            }
        } catch (Exception e) {
            Rlog.e(TAG, "moveToOutbox: Failed to update message", e);
        } finally {
            Binder.restoreCallingIdentity(identity);
        }
    }

    private String getMultipartMessageText(ArrayList<String> parts) {
        final StringBuilder sb = new StringBuilder();
        for (String part : parts) {
+4 −5
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.internal.telephony.cdma;

import android.app.Activity;
import android.app.AppOpsManager;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.content.Intent;
@@ -25,7 +24,6 @@ import android.net.Uri;
import android.os.Message;
import android.os.SystemProperties;
import android.provider.Telephony.Sms;
import android.provider.Telephony.Sms.Intents;
import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.SmsManager;
@@ -113,7 +111,8 @@ public class CdmaSMSDispatcher extends SMSDispatcher {
                scAddr, destAddr, destPort, data, (deliveryIntent != null));
        HashMap map = getSmsTrackerMap(destAddr, scAddr, destPort, data, pdu);
        SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(),
                null /*messageUri*/, false /*isExpectMore*/, null /*fullMessageText*/);
                null /*messageUri*/, false /*isExpectMore*/, null /*fullMessageText*/,
                false /*isText*/);

        String carrierPackage = getCarrierAppPackageName();
        if (carrierPackage != null) {
@@ -135,7 +134,7 @@ public class CdmaSMSDispatcher extends SMSDispatcher {
        if (pdu != null) {
            HashMap map = getSmsTrackerMap(destAddr, scAddr, text, pdu);
            SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(),
                    messageUri, false /*isExpectMore*/, text);
                    messageUri, false /*isExpectMore*/, text, true /*isText*/);

            String carrierPackage = getCarrierAppPackageName();
            if (carrierPackage != null) {
@@ -192,7 +191,7 @@ public class CdmaSMSDispatcher extends SMSDispatcher {
                message, submitPdu);
        return getSmsTracker(map, sentIntent, deliveryIntent,
                getFormat(), unsentPartCount, anyPartFailed, messageUri, smsHeader,
                false /*isExpextMore*/, fullMessageText);
                false /*isExpextMore*/, fullMessageText, true /*isText*/);
    }

    @Override
+4 −4
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.internal.telephony.gsm;

import android.app.Activity;
import android.app.AppOpsManager;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.content.Intent;
@@ -157,7 +156,8 @@ public final class GsmSMSDispatcher extends SMSDispatcher {
        if (pdu != null) {
            HashMap map = getSmsTrackerMap(destAddr, scAddr, destPort, data, pdu);
            SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(),
                    null /*messageUri*/, false /*isExpectMore*/, null /*fullMessageText*/);
                    null /*messageUri*/, false /*isExpectMore*/, null /*fullMessageText*/,
                    false /*isText*/);

            String carrierPackage = getCarrierAppPackageName();
            if (carrierPackage != null) {
@@ -182,7 +182,7 @@ public final class GsmSMSDispatcher extends SMSDispatcher {
        if (pdu != null) {
            HashMap map = getSmsTrackerMap(destAddr, scAddr, text, pdu);
            SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(),
                    messageUri, false /*isExpectMore*/, text /*fullMessageText*/);
                    messageUri, false /*isExpectMore*/, text /*fullMessageText*/, true /*isText*/);

            String carrierPackage = getCarrierAppPackageName();
            if (carrierPackage != null) {
@@ -226,7 +226,7 @@ public final class GsmSMSDispatcher extends SMSDispatcher {
                    message, pdu);
            return getSmsTracker(map, sentIntent,
                    deliveryIntent, getFormat(), unsentPartCount, anyPartFailed, messageUri,
                    smsHeader, !lastPart, fullMessageText);
                    smsHeader, !lastPart, fullMessageText, true /*isText*/);
        } else {
            Rlog.e(TAG, "GsmSMSDispatcher.sendNewSubmitPdu(): getSubmitPdu() returned null");
            return null;