Messaging: Remove compatibility for old android versions

Change-Id: Id9065d60525a509271a0e64c0e349e857cb998e2
This commit is contained in:
Michael W
2024-12-26 14:55:12 +01:00
parent 9bbc7a8f99
commit 7c55a6d56a
104 changed files with 580 additions and 2306 deletions
@@ -42,7 +42,6 @@ import com.android.messaging.util.BuglePrefs;
import com.android.messaging.util.BuglePrefsKeys;
import com.android.messaging.util.DebugUtils;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import com.android.messaging.util.Trace;
@@ -99,9 +98,7 @@ public class BugleApplication extends Application implements UncaughtExceptionHa
// Fixup messages in flight if we crashed and send any pending
dataModel.onApplicationCreated();
// Register carrier config change receiver
if (OsUtil.isAtLeastM()) {
registerCarrierConfigChangeReceiver(context);
}
registerCarrierConfigChangeReceiver(context);
Trace.endSection();
}
+12 -27
View File
@@ -64,9 +64,6 @@ class FactoryImpl extends Factory {
private SparseArray<BugleSubscriptionPrefs> mSubscriptionPrefs;
private BugleCarrierConfigValuesLoader mCarrierConfigValuesLoader;
// Cached instance for Pre-L_MR1
private static final Object PHONEUTILS_INSTANCE_LOCK = new Object();
private static PhoneUtils sPhoneUtilsInstancePreLMR1 = null;
// Cached subId->instance for L_MR1 and beyond
private static final ConcurrentHashMap<Integer, PhoneUtils> sPhoneUtilsInstanceCacheLMR1 =
new ConcurrentHashMap<>();
@@ -197,31 +194,19 @@ class FactoryImpl extends Factory {
@Override
public PhoneUtils getPhoneUtils(int subId) {
if (OsUtil.isAtLeastL_MR1()) {
if (subId == ParticipantData.DEFAULT_SELF_SUB_ID) {
subId = SmsManager.getDefaultSmsSubscriptionId();
}
if (subId < 0) {
LogUtil.w(LogUtil.BUGLE_TAG, "PhoneUtils.getForLMR1(): invalid subId = " + subId);
subId = ParticipantData.DEFAULT_SELF_SUB_ID;
}
PhoneUtils instance = sPhoneUtilsInstanceCacheLMR1.get(subId);
if (instance == null) {
instance = new PhoneUtils.PhoneUtilsLMR1(subId);
sPhoneUtilsInstanceCacheLMR1.putIfAbsent(subId, instance);
}
return instance;
} else {
Assert.isTrue(subId == ParticipantData.DEFAULT_SELF_SUB_ID);
if (sPhoneUtilsInstancePreLMR1 == null) {
synchronized (PHONEUTILS_INSTANCE_LOCK) {
if (sPhoneUtilsInstancePreLMR1 == null) {
sPhoneUtilsInstancePreLMR1 = new PhoneUtils.PhoneUtilsPreLMR1();
}
}
}
return sPhoneUtilsInstancePreLMR1;
if (subId == ParticipantData.DEFAULT_SELF_SUB_ID) {
subId = SmsManager.getDefaultSmsSubscriptionId();
}
if (subId < 0) {
LogUtil.w(LogUtil.BUGLE_TAG, "PhoneUtils.getForLMR1(): invalid subId = " + subId);
subId = ParticipantData.DEFAULT_SELF_SUB_ID;
}
PhoneUtils instance = sPhoneUtilsInstanceCacheLMR1.get(subId);
if (instance == null) {
instance = new PhoneUtils(subId);
sPhoneUtilsInstanceCacheLMR1.putIfAbsent(subId, instance);
}
return instance;
}
@Override
@@ -45,7 +45,6 @@ import com.android.messaging.util.Assert.DoesNotRunOnMainThread;
import com.android.messaging.util.AvatarUriUtil;
import com.android.messaging.util.ContentType;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import com.android.messaging.util.UriUtil;
import com.android.messaging.widget.WidgetConversationProvider;
@@ -567,7 +566,7 @@ public class BugleDatabaseOperations {
// reading and if necessary creating the conversation.
updateConversationRow(dbWrapper, conversationId, values);
if (shouldAutoSwitchSelfId && OsUtil.isAtLeastL_MR1()) {
if (shouldAutoSwitchSelfId) {
// Normally, the draft message compose UI trusts its UI state for providing up-to-date
// conversation self id. Therefore, notify UI through local broadcast receiver about
// this external change so the change can be properly reflected.
@@ -624,7 +623,7 @@ public class BugleDatabaseOperations {
static boolean addSelfIdAutoSwitchInfoToContentValues(final DatabaseWrapper dbWrapper,
final MessageData message, final String conversationId, final ContentValues values) {
// Only auto switch conversation self for incoming messages.
if (!OsUtil.isAtLeastL_MR1() || !message.getIsIncoming()) {
if (!message.getIsIncoming()) {
return false;
}
@@ -77,7 +77,6 @@ import com.android.messaging.util.ImageUtils;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.NotificationPlayer;
import com.android.messaging.util.NotificationsUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PendingIntentConstants;
import com.android.messaging.util.PhoneUtils;
import com.android.messaging.util.ThreadUtil;
@@ -429,7 +428,7 @@ public class BugleNotifications {
if (state.mParticipantAvatarsUris != null) {
final Uri avatarUri = state.mParticipantAvatarsUris.get(0);
final AvatarRequestDescriptor descriptor = new AvatarRequestDescriptor(avatarUri,
sIconWidth, sIconHeight, OsUtil.isAtLeastL());
sIconWidth, sIconHeight, true);
final MediaRequest<ImageResource> imageRequest = descriptor.buildSyncMediaRequest(
context);
@@ -676,7 +675,6 @@ public class BugleNotifications {
MediaRequest<ImageResource> imageRequest;
if (isVideo) {
Assert.isTrue(VideoThumbnailRequest.shouldShowIncomingVideoThumbnails());
final MessagePartVideoThumbnailRequestDescriptor videoDescriptor =
new MessagePartVideoThumbnailRequestDescriptor(attachmentUri);
imageRequest = videoDescriptor.buildSyncMediaRequest(context);
@@ -54,7 +54,6 @@ import com.android.messaging.util.Assert;
import com.android.messaging.util.Assert.DoesNotRunOnMainThread;
import com.android.messaging.util.ConnectivityUtil;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import java.util.concurrent.ConcurrentHashMap;
@@ -66,8 +65,6 @@ public class DataModelImpl extends DataModel {
private final DatabaseHelper mDatabaseHelper;
private final SyncManager mSyncManager;
// Cached ConnectivityUtil instance for Pre-N.
private static ConnectivityUtil sConnectivityUtilInstanceCachePreN = null;
// Cached ConnectivityUtil subId->instance for N and beyond
private static final ConcurrentHashMap<Integer, ConnectivityUtil>
sConnectivityUtilInstanceCacheN = new ConcurrentHashMap<>();
@@ -214,35 +211,27 @@ public class DataModelImpl extends DataModel {
@Override
public void onApplicationCreated() {
if (OsUtil.isAtLeastN()) {
createConnectivityUtilForEachActiveSubscription();
} else {
sConnectivityUtilInstanceCachePreN = new ConnectivityUtil(mContext);
}
createConnectivityUtilForEachActiveSubscription();
FixupMessageStatusOnStartupAction.fixupMessageStatus();
ProcessPendingMessagesAction.processFirstPendingMessage();
SyncManager.immediateSync();
if (OsUtil.isAtLeastL_MR1()) {
// Start listening for subscription change events for refreshing any data associated
// with subscriptions.
PhoneUtils.getDefault().toLMr1().registerOnSubscriptionsChangedListener(
new SubscriptionManager.OnSubscriptionsChangedListener() {
@Override
public void onSubscriptionsChanged() {
// TODO: This dynamically changes the mms config that app is
// currently using. It may cause inconsistency in some cases. We need
// to check the usage of mms config and handle the dynamic change
// gracefully
MmsConfig.loadAsync();
ParticipantRefresh.refreshSelfParticipants();
if (OsUtil.isAtLeastN()) {
createConnectivityUtilForEachActiveSubscription();
}
}
});
}
// Start listening for subscription change events for refreshing any data associated
// with subscriptions.
PhoneUtils.getDefault().registerOnSubscriptionsChangedListener(
new SubscriptionManager.OnSubscriptionsChangedListener() {
@Override
public void onSubscriptionsChanged() {
// TODO: This dynamically changes the mms config that app is
// currently using. It may cause inconsistency in some cases. We need
// to check the usage of mms config and handle the dynamic change
// gracefully
MmsConfig.loadAsync();
ParticipantRefresh.refreshSelfParticipants();
createConnectivityUtilForEachActiveSubscription();
}
});
}
private void createConnectivityUtilForEachActiveSubscription() {
@@ -262,10 +251,6 @@ public class DataModelImpl extends DataModel {
}
public static ConnectivityUtil getConnectivityUtil(final int subId) {
if (OsUtil.isAtLeastN()) {
return sConnectivityUtilInstanceCacheN.get(subId);
} else {
return sConnectivityUtilInstanceCachePreN;
}
return sConnectivityUtilInstanceCacheN.get(subId);
}
}
@@ -25,7 +25,6 @@ import android.provider.ContactsContract.Contacts;
import com.android.messaging.util.FallbackStrategies;
import com.android.messaging.util.FallbackStrategies.Strategy;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
/**
* Helper for querying frequent (and/or starred) contacts.
@@ -90,9 +89,7 @@ public class FrequentContactsCursorQueryData extends CursorQueryData {
// queries. Using strequent_phone_only query as a fallback to display only phone
// contacts. This is the last-ditch effort; if this fails, we will display an
// empty frequent list (b/18354836).
final String strequentQueryParam = OsUtil.isAtLeastL() ?
ContactsContract.STREQUENT_PHONE_ONLY : "strequent_phone_only";
// TODO: Handle enterprise contacts post M once contacts provider supports it
final String strequentQueryParam = ContactsContract.STREQUENT_PHONE_ONLY;
return Contacts.CONTENT_STREQUENT_URI.buildUpon()
.appendQueryParameter(strequentQueryParam, "true").build();
}
@@ -519,8 +519,7 @@ public abstract class MessageNotificationState extends NotificationState {
if (messageCount == 1) {
final boolean shouldShowImage = ContentType.isImageType(mAttachmentType)
|| (ContentType.isVideoType(mAttachmentType)
&& VideoThumbnailRequest.shouldShowIncomingVideoThumbnails());
|| (ContentType.isVideoType(mAttachmentType));
if (mAttachmentUri != null && shouldShowImage) {
// Show "Picture" as the content
final MessageLineInfo messageLineInfo = (MessageLineInfo) lineInfos.get(0);
@@ -36,7 +36,6 @@ import com.android.messaging.datamodel.data.ConversationMessageData;
import com.android.messaging.datamodel.data.MessageData;
import com.android.messaging.datamodel.data.ParticipantData;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import com.android.messaging.widget.BugleWidgetProvider;
import com.android.messaging.widget.WidgetConversationProvider;
@@ -448,11 +447,7 @@ public class MessagingContentProvider extends ContentProvider {
// First dump out the default SMS app package name
String defaultSmsApp = PhoneUtils.getDefault().getDefaultSmsApp();
if (TextUtils.isEmpty(defaultSmsApp)) {
if (OsUtil.isAtLeastKLP()) {
defaultSmsApp = "None";
} else {
defaultSmsApp = "None (pre-Kitkat)";
}
defaultSmsApp = "None";
}
writer.println("Default SMS app: " + defaultSmsApp);
// Now dump logs
@@ -353,14 +353,10 @@ public class ParticipantRefresh {
* that any other older SIM self participants are marked as inactive.
*/
private static void refreshSelfParticipantList() {
if (!OsUtil.isAtLeastL_MR1()) {
return;
}
final DatabaseWrapper db = DataModel.get().getDatabase();
final List<SubscriptionInfo> subInfoRecords =
PhoneUtils.getDefault().toLMr1().getActiveSubscriptionInfoList();
PhoneUtils.getDefault().getActiveSubscriptionInfoList();
final ArrayMap<Integer, SubscriptionInfo> activeSubscriptionIdToRecordMap =
new ArrayMap<Integer, SubscriptionInfo>();
db.beginTransaction();
@@ -445,13 +441,11 @@ public class ParticipantRefresh {
changed = SELF_PHONE_NUMBER_OR_SUBSCRIPTION_CHANGED;
}
if (OsUtil.isAtLeastL_MR1()) {
// Refresh the subscription info based on information from SubscriptionManager.
final SubscriptionInfo subscriptionInfo =
PhoneUtils.get(participantData.getSubId()).toLMr1().getActiveSubscriptionInfo();
if (participantData.updateSubscriptionInfoForSelfIfChanged(subscriptionInfo)) {
changed = SELF_PHONE_NUMBER_OR_SUBSCRIPTION_CHANGED;
}
// Refresh the subscription info based on information from SubscriptionManager.
final SubscriptionInfo subscriptionInfo =
PhoneUtils.get(participantData.getSubId()).getActiveSubscriptionInfo();
if (participantData.updateSubscriptionInfoForSelfIfChanged(subscriptionInfo)) {
changed = SELF_PHONE_NUMBER_OR_SUBSCRIPTION_CHANGED;
}
// For self participant, try getting name/avatar from self profile in CP2 first.
@@ -36,7 +36,6 @@ import com.android.messaging.datamodel.data.ParticipantData;
import com.android.messaging.sms.MmsUtils;
import com.android.messaging.util.Assert;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import java.util.ArrayList;
@@ -225,8 +224,7 @@ public class InsertNewMessageAction extends Action implements Parcelable {
// to bind the message to the system default subscription if it's unbound.
final ParticipantData unboundSelf = BugleDatabaseOperations.getExistingParticipant(
db, selfId);
if (unboundSelf.getSubId() == ParticipantData.DEFAULT_SELF_SUB_ID
&& OsUtil.isAtLeastL_MR1()) {
if (unboundSelf.getSubId() == ParticipantData.DEFAULT_SELF_SUB_ID) {
final int defaultSubId = PhoneUtils.getDefault().getDefaultSmsSubscriptionId();
self = BugleDatabaseOperations.getOrCreateSelf(db, defaultSubId);
} else {
@@ -39,7 +39,6 @@ import com.android.messaging.util.BuglePrefsKeys;
import com.android.messaging.util.ConnectivityUtil;
import com.android.messaging.util.ConnectivityUtil.ConnectivityListener;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import java.util.HashSet;
@@ -356,12 +355,10 @@ public class ProcessPendingMessagesAction extends Action implements Parcelable {
// Prior to L_MR1, isActiveSubscription is true always
boolean isActiveSubscription = true;
if (OsUtil.isAtLeastL_MR1()) {
final ParticipantData messageSelf =
BugleDatabaseOperations.getExistingParticipant(db, selfId);
if (messageSelf == null || !messageSelf.isActiveSubscription()) {
isActiveSubscription = false;
}
final ParticipantData messageSelf =
BugleDatabaseOperations.getExistingParticipant(db, selfId);
if (messageSelf == null || !messageSelf.isActiveSubscription()) {
isActiveSubscription = false;
}
while (cursor.moveToNext()) {
final MessageData message = new MessageData();
@@ -51,7 +51,6 @@ import com.android.messaging.util.Assert;
import com.android.messaging.util.Assert.RunsOnMainThread;
import com.android.messaging.util.ContactUtil;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import com.android.messaging.util.SafeAsyncTask;
import com.android.messaging.widget.WidgetConversationProvider;
@@ -595,7 +594,7 @@ public class ConversationData extends BindableData {
Assert.isTrue(TextUtils.equals(mConversationId, message.getConversationId()));
Assert.isTrue(binding.getData() == this);
if (!OsUtil.isAtLeastL_MR1() || message.getSelfId() == null) {
if (message.getSelfId() == null) {
InsertNewMessageAction.insertNewMessage(message);
} else {
final int systemDefaultSubId = PhoneUtils.getDefault().getDefaultSmsSubscriptionId();
@@ -767,8 +766,7 @@ public class ConversationData extends BindableData {
// 1. Framework has MSIM support AND
// 2. The device has had multiple *active* subscriptions. AND
// 3. The message's subscription is active.
if (OsUtil.isAtLeastL_MR1() &&
selfParticipantsData.getSelfParticipantsCountExcludingDefault(true) > 1) {
if (selfParticipantsData.getSelfParticipantsCountExcludingDefault(true) > 1) {
return subscriptionListData.getActiveSubscriptionEntryBySelfId(selfParticipantId,
excludeDefault);
}
@@ -24,8 +24,6 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.android.messaging.util.OsUtil;
/**
* A class that contains the list of all self participants potentially involved in a conversation.
* This class contains both active/inactive self entries when there is multi-SIM support.
@@ -86,9 +84,6 @@ public class SelfParticipantsData {
* Returns if a given self id represents the default self.
*/
boolean isDefaultSelf(final String selfId) {
if (!OsUtil.isAtLeastL_MR1()) {
return true;
}
final ParticipantData self = getSelfParticipantById(selfId);
return self == null ? false : self.getSubId() == ParticipantData.DEFAULT_SELF_SUB_ID;
}
@@ -31,7 +31,6 @@ import com.android.messaging.datamodel.binding.BindableData;
import com.android.messaging.datamodel.binding.BindingBase;
import com.android.messaging.util.Assert;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import java.util.ArrayList;
import java.util.List;
@@ -200,7 +199,7 @@ public class SettingsData extends BindableData implements
// platorm is at least L-MR1 and there are multiple active SIMs.
final int activeSubCountExcludingDefault =
mSelfParticipantsData.getSelfParticipantsCountExcludingDefault(true);
if (OsUtil.isAtLeastL_MR1() && activeSubCountExcludingDefault > 0) {
if (activeSubCountExcludingDefault > 0) {
for (ParticipantData self : selfs) {
if (!self.isDefaultSelf()) {
if (activeSubCountExcludingDefault > 1) {
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,7 +25,6 @@ import com.android.messaging.util.Assert;
import com.android.messaging.util.Assert.DoesNotRunOnMainThread;
import com.android.messaging.util.ImageUtils;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import java.util.List;
@@ -109,11 +109,7 @@ public class DecodedImageResource extends ImageResource {
acquireLock();
try {
Assert.notNull(mBitmap);
if (OsUtil.isAtLeastKLP()) {
return mBitmap.getAllocationByteCount();
} else {
return mBitmap.getRowBytes() * mBitmap.getHeight();
}
return mBitmap.getAllocationByteCount();
} finally {
releaseLock();
}
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,7 +21,6 @@ import android.content.Context;
import android.graphics.Bitmap;
import com.android.messaging.util.MediaMetadataRetrieverWrapper;
import com.android.messaging.util.MediaUtil;
import java.io.FileNotFoundException;
import java.io.IOException;
@@ -28,7 +28,6 @@ import java.io.InputStream;
/**
* Class to request a video thumbnail.
* Users of this class as responsible for checking {@link #shouldShowIncomingVideoThumbnails}
*/
public class VideoThumbnailRequest extends ImageRequest<UriImageRequestDescriptor> {
@@ -37,10 +36,6 @@ public class VideoThumbnailRequest extends ImageRequest<UriImageRequestDescripto
super(context, descriptor);
}
public static boolean shouldShowIncomingVideoThumbnails() {
return MediaUtil.canAutoAccessIncomingMedia();
}
@Override
protected InputStream getInputStreamForResource() throws FileNotFoundException {
return null;
@@ -39,7 +39,6 @@ import android.util.Log;
import android.util.SparseArray;
import android.util.SparseIntArray;
import com.android.messaging.datamodel.data.ParticipantData;
import com.android.messaging.mmslib.InvalidHeaderValueException;
import com.android.messaging.mmslib.MmsException;
import com.android.messaging.mmslib.SqliteWrapper;
@@ -51,7 +50,6 @@ import com.android.messaging.sms.MmsSmsUtils;
import com.android.messaging.util.Assert;
import com.android.messaging.util.ContentType;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.UriUtil;
import java.io.ByteArrayOutputStream;
@@ -1481,15 +1479,8 @@ public class PduPersister {
}
// Record whether this mms message is a simple plain text or not. This is a hint for the
// UI.
if (OsUtil.isAtLeastJB_MR1()) {
values.put(Mms.TEXT_ONLY, textOnly ? 1 : 0);
}
if (OsUtil.isAtLeastL_MR1()) {
values.put(Mms.SUBSCRIPTION_ID, subId);
} else {
Assert.equals(ParticipantData.DEFAULT_SELF_SUB_ID, subId);
}
values.put(Mms.TEXT_ONLY, textOnly ? 1 : 0);
values.put(Mms.SUBSCRIPTION_ID, subId);
Uri res = null;
if (existingUri) {
@@ -1,43 +0,0 @@
/*
* Copyright (C) 2015 The Android Open Source 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.messaging.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.provider.Telephony;
import com.android.messaging.util.ContentType;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
/**
* This receiver is used to abort MMS WAP broadcasts pre-KLP when SMS is enabled.
*/
public class AbortMmsWapPushReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
if (Telephony.Sms.Intents.WAP_PUSH_RECEIVED_ACTION.equals(intent.getAction())
&& ContentType.MMS_MESSAGE.equals(intent.getType())) {
// If we are enabled, it's our job to stop the broadcast from continuing. This
// receiver is not used on KLP but we do an extra check here just to make sure.
if (!OsUtil.isAtLeastKLP() && PhoneUtils.getDefault().isSmsEnabled()) {
abortBroadcast();
}
}
}
}
@@ -1,41 +0,0 @@
/*
* Copyright (C) 2015 The Android Open Source 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.messaging.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
/**
* This receiver is used to abort SMS broadcasts pre-KLP when SMS is enabled.
*/
public final class AbortSmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
// If we are enabled, it's our job to stop the broadcast from continuing. This
// receiver is not used on KLP but we do an extra check here just to make sure.
if (!OsUtil.isAtLeastKLP() && PhoneUtils.getDefault().isSmsEnabled()) {
if (!SmsReceiver.shouldIgnoreMessage(intent)) {
abortBroadcast();
}
}
}
}
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,6 +22,7 @@ import android.content.Context;
import android.content.Intent;
import android.provider.Telephony;
import com.android.messaging.datamodel.action.ReceiveMmsMessageAction;
import com.android.messaging.util.ContentType;
import com.android.messaging.util.PhoneUtils;
@@ -29,15 +31,27 @@ import com.android.messaging.util.PhoneUtils;
*/
public class MmsWapPushDeliverReceiver extends BroadcastReceiver {
static final String EXTRA_SUBSCRIPTION = "subscription";
static final String EXTRA_DATA = "data";
@Override
public void onReceive(final Context context, final Intent intent) {
if (Telephony.Sms.Intents.WAP_PUSH_DELIVER_ACTION.equals(intent.getAction())
&& ContentType.MMS_MESSAGE.equals(intent.getType())) {
// Always convert negative subIds into -1
int subId = PhoneUtils.getDefault().getEffectiveIncomingSubIdFromSystem(
intent, MmsWapPushReceiver.EXTRA_SUBSCRIPTION);
byte[] data = intent.getByteArrayExtra(MmsWapPushReceiver.EXTRA_DATA);
MmsWapPushReceiver.mmsReceived(subId, data);
intent, EXTRA_SUBSCRIPTION);
byte[] data = intent.getByteArrayExtra(EXTRA_DATA);
mmsReceived(subId, data);
}
}
static void mmsReceived(final int subId, final byte[] data) {
if (!PhoneUtils.getDefault().isSmsEnabled()) {
return;
}
final ReceiveMmsMessageAction action = new ReceiveMmsMessageAction(subId, data);
action.start();
}
}
@@ -1,58 +0,0 @@
/*
* Copyright (C) 2015 The Android Open Source 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.messaging.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.provider.Telephony;
import com.android.messaging.datamodel.action.ReceiveMmsMessageAction;
import com.android.messaging.util.ContentType;
import com.android.messaging.util.PhoneUtils;
/**
* Class that handles MMS WAP push intent from telephony on pre-KLP Devices.
*/
public class MmsWapPushReceiver extends BroadcastReceiver {
static final String EXTRA_SUBSCRIPTION = "subscription";
static final String EXTRA_DATA = "data";
@Override
public void onReceive(final Context context, final Intent intent) {
if (Telephony.Sms.Intents.WAP_PUSH_RECEIVED_ACTION.equals(intent.getAction())
&& ContentType.MMS_MESSAGE.equals(intent.getType())) {
if (PhoneUtils.getDefault().isSmsEnabled()) {
// Always convert negative subIds into -1
final int subId = PhoneUtils.getDefault().getEffectiveIncomingSubIdFromSystem(
intent, MmsWapPushReceiver.EXTRA_SUBSCRIPTION);
final byte[] data = intent.getByteArrayExtra(MmsWapPushReceiver.EXTRA_DATA);
mmsReceived(subId, data);
}
}
}
static void mmsReceived(final int subId, final byte[] data) {
if (!PhoneUtils.getDefault().isSmsEnabled()) {
return;
}
final ReceiveMmsMessageAction action = new ReceiveMmsMessageAction(subId, data);
action.start();
}
}
@@ -73,36 +73,12 @@ public final class SmsReceiver extends BroadcastReceiver {
* notification.
*/
public static void updateSmsReceiveHandler(final Context context) {
boolean smsReceiverEnabled;
boolean mmsWapPushReceiverEnabled;
boolean respondViaMessageEnabled;
boolean broadcastAbortEnabled;
if (OsUtil.isAtLeastKLP()) {
// When we're running as the secondary user, we don't get the new SMS_DELIVER intent,
// only the primary user receives that. As secondary, we need to go old-school and
// listen for the SMS_RECEIVED intent. For the secondary user, use this SmsReceiver
// for both sms and mms notification. For the primary user on KLP (and above), we don't
// use the SmsReceiver.
smsReceiverEnabled = OsUtil.isSecondaryUser();
// On KLP use the new deliver event for mms
mmsWapPushReceiverEnabled = false;
// On KLP we need to always enable this handler to show in the list of sms apps
respondViaMessageEnabled = true;
// On KLP we don't need to abort the broadcast
broadcastAbortEnabled = false;
} else {
// On JB we use the sms receiver for both sms/mms delivery
final boolean carrierSmsEnabled = PhoneUtils.getDefault().isSmsEnabled();
smsReceiverEnabled = carrierSmsEnabled;
// On JB we use the mms receiver when sms/mms is enabled
mmsWapPushReceiverEnabled = carrierSmsEnabled;
// On JB this is dynamic to make sure we don't show in dialer if sms is disabled
respondViaMessageEnabled = carrierSmsEnabled;
// On JB we need to abort broadcasts if SMS is enabled
broadcastAbortEnabled = carrierSmsEnabled;
}
// When we're running as the secondary user, we don't get the new SMS_DELIVER intent,
// only the primary user receives that. As secondary, we need to go old-school and
// listen for the SMS_RECEIVED intent. For the secondary user, use this SmsReceiver
// for both sms and mms notification. For the primary user on KLP (and above), we don't
// use the SmsReceiver.
boolean smsReceiverEnabled = OsUtil.isSecondaryUser();
final PackageManager packageManager = context.getPackageManager();
final boolean logv = LogUtil.isLoggable(TAG, LogUtil.VERBOSE);
@@ -122,57 +98,13 @@ public final class SmsReceiver extends BroadcastReceiver {
new ComponentName(context, SmsReceiver.class),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}
if (mmsWapPushReceiverEnabled) {
if (logv) {
LogUtil.v(TAG, "Enabling MMS message receiving");
}
packageManager.setComponentEnabledSetting(
new ComponentName(context, MmsWapPushReceiver.class),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
} else {
if (logv) {
LogUtil.v(TAG, "Disabling MMS message receiving");
}
packageManager.setComponentEnabledSetting(
new ComponentName(context, MmsWapPushReceiver.class),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}
if (broadcastAbortEnabled) {
if (logv) {
LogUtil.v(TAG, "Enabling SMS/MMS broadcast abort");
}
packageManager.setComponentEnabledSetting(
new ComponentName(context, AbortSmsReceiver.class),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
packageManager.setComponentEnabledSetting(
new ComponentName(context, AbortMmsWapPushReceiver.class),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
} else {
if (logv) {
LogUtil.v(TAG, "Disabling SMS/MMS broadcast abort");
}
packageManager.setComponentEnabledSetting(
new ComponentName(context, AbortSmsReceiver.class),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
packageManager.setComponentEnabledSetting(
new ComponentName(context, AbortMmsWapPushReceiver.class),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
}
if (respondViaMessageEnabled) {
if (logv) {
LogUtil.v(TAG, "Enabling respond via message intent");
}
packageManager.setComponentEnabledSetting(
new ComponentName(context, NoConfirmationSmsSendService.class),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
} else {
if (logv) {
LogUtil.v(TAG, "Disabling respond via message intent");
}
packageManager.setComponentEnabledSetting(
new ComponentName(context, NoConfirmationSmsSendService.class),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
if (logv) {
LogUtil.v(TAG, "Enabling respond via message intent");
}
packageManager.setComponentEnabledSetting(
new ComponentName(context, NoConfirmationSmsSendService.class),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}
private static final String EXTRA_ERROR_CODE = "errorCode";
@@ -214,9 +146,7 @@ public final class SmsReceiver extends BroadcastReceiver {
// seen for the telephony db.
messageValues.put(Sms.Inbox.READ, 0);
messageValues.put(Sms.Inbox.SEEN, 0);
if (OsUtil.isAtLeastL_MR1()) {
messageValues.put(Sms.SUBSCRIPTION_ID, subId);
}
messageValues.put(Sms.SUBSCRIPTION_ID, subId);
if (messages[0].getMessageClass() == android.telephony.SmsMessage.MessageClass.CLASS_0 ||
DebugUtils.debugClassZeroSmsEnabled()) {
@@ -238,8 +168,6 @@ public final class SmsReceiver extends BroadcastReceiver {
// TODO: update this with the actual constant from Telephony
"android.provider.Telephony.MMS_DOWNLOADED".equals(action))) {
postNewMessageSecondaryUserNotification();
} else if (!OsUtil.isAtLeastKLP()) {
deliverSmsIntent(context, intent);
}
}
}
@@ -34,7 +34,6 @@ import com.android.messaging.mmslib.SqliteWrapper;
import com.android.messaging.util.BugleGservices;
import com.android.messaging.util.BugleGservicesKeys;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import java.net.URI;
@@ -384,7 +383,7 @@ public class BugleApnSettingsLoader implements ApnSettingsLoader {
*/
private void loadFromSystem(final int subId, final String apnName, final List<Apn> apns) {
Uri uri;
if (OsUtil.isAtLeastL_MR1() && subId != MmsManager.DEFAULT_SUB_ID) {
if (subId != MmsManager.DEFAULT_SUB_ID) {
uri = Uri.withAppendedPath(Telephony.Carriers.CONTENT_URI, "/subId/" + subId);
} else {
uri = Telephony.Carriers.CONTENT_URI;
@@ -27,7 +27,6 @@ import android.util.SparseArray;
import com.android.messaging.R;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
/**
@@ -93,12 +92,9 @@ public class BugleCarrierConfigValuesLoader implements CarrierConfigValuesLoader
private String loadLocked(final int subId, final Bundle values) {
// Load from resources in earlier platform
loadFromResources(subId, values);
if (OsUtil.isAtLeastL()) {
// Load from system to override if system API exists
loadFromSystem(subId, values);
return "resources+system";
}
return "resources";
// Load from system to override if system API exists
loadFromSystem(subId, values);
return "resources+system";
}
/**
@@ -158,9 +154,6 @@ public class BugleCarrierConfigValuesLoader implements CarrierConfigValuesLoader
* @return the sub-dependent Context
*/
private static Context getSubDepContext(final Context context, final int subId) {
if (!OsUtil.isAtLeastL_MR1()) {
return context;
}
final int[] mccMnc = PhoneUtils.get(subId).getMccMnc();
final int mcc = mccMnc[0];
final int mnc = mccMnc[1];
@@ -25,7 +25,6 @@ import android.text.TextUtils;
import com.android.messaging.util.BugleGservices;
import com.android.messaging.util.BugleGservicesKeys;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.VersionUtil;
/**
@@ -75,13 +74,11 @@ public class BugleUserAgentInfoLoader implements UserAgentInfoLoader {
}
private void loadLocked() {
if (OsUtil.isAtLeastKLP()) {
// load the MMS User agent and UaProfUrl from TelephonyManager APIs
final TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(
Context.TELEPHONY_SERVICE);
mUserAgent = telephonyManager.getMmsUserAgent();
mUAProfUrl = telephonyManager.getMmsUAProfUrl();
}
// load the MMS User agent and UaProfUrl from TelephonyManager APIs
final TelephonyManager telephonyManager = (TelephonyManager) mContext.getSystemService(
Context.TELEPHONY_SERVICE);
mUserAgent = telephonyManager.getMmsUserAgent();
mUAProfUrl = telephonyManager.getMmsUAProfUrl();
// if user agent string isn't set, use the format "Bugle/<app_version>".
if (TextUtils.isEmpty(mUserAgent)) {
final String simpleVersionName = VersionUtil.getInstance(mContext).getSimpleName();
@@ -37,11 +37,9 @@ import com.android.messaging.Factory;
import com.android.messaging.datamodel.data.MessageData;
import com.android.messaging.datamodel.media.VideoThumbnailRequest;
import com.android.messaging.mmslib.pdu.CharacterSets;
import com.android.messaging.util.Assert;
import com.android.messaging.util.ContentType;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.MediaMetadataRetrieverWrapper;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import com.google.common.collect.Lists;
@@ -120,12 +118,6 @@ public class DatabaseMessages {
if (!MmsUtils.hasSmsDateSentColumn()) {
projection[INDEX_DATE_SENT] = Sms.DATE;
}
if (!OsUtil.isAtLeastL_MR1()) {
Assert.equals(INDEX_SUB_ID, projection.length - 1);
String[] withoutSubId = new String[projection.length - 1];
System.arraycopy(projection, 0, withoutSubId, 0, withoutSubId.length);
projection = withoutSubId;
}
sProjection = projection;
}
@@ -307,13 +299,6 @@ public class DatabaseMessages {
Mms.SUBSCRIPTION_ID,
};
if (!OsUtil.isAtLeastL_MR1()) {
Assert.equals(INDEX_SUB_ID, projection.length - 1);
String[] withoutSubId = new String[projection.length - 1];
System.arraycopy(projection, 0, withoutSubId, 0, withoutSubId.length);
projection = withoutSubId;
}
sProjection = projection;
}
@@ -722,11 +707,6 @@ public class DatabaseMessages {
* Load video file of a video part and parse the dimensions and type
*/
private void loadVideo() {
// This is a coarse check, and should not be applied to outgoing messages. However,
// currently, this does not cause any problems.
if (!VideoThumbnailRequest.shouldShowIncomingVideoThumbnails()) {
return;
}
final Uri uri = getDataUri();
final MediaMetadataRetrieverWrapper retriever = new MediaMetadataRetrieverWrapper();
try {
+11 -18
View File
@@ -25,7 +25,6 @@ import com.android.messaging.Factory;
import com.android.messaging.datamodel.data.ParticipantData;
import com.android.messaging.util.Assert;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import com.android.messaging.util.SafeAsyncTask;
import com.google.common.collect.Maps;
@@ -151,27 +150,21 @@ public class MmsConfig {
// Rebuild the entire MmsConfig map.
sSubIdToMmsConfigMap.clear();
loader.reset();
if (OsUtil.isAtLeastL_MR1()) {
final List<SubscriptionInfo> subInfoRecords =
PhoneUtils.getDefault().toLMr1().getActiveSubscriptionInfoList();
if (subInfoRecords == null) {
LogUtil.w(TAG, "Loading mms config failed: no active SIM");
return;
}
for (SubscriptionInfo subInfoRecord : subInfoRecords) {
final int subId = subInfoRecord.getSubscriptionId();
final Bundle values = loader.get(subId);
addMmsConfig(new MmsConfig(subId, values));
}
} else {
final Bundle values = loader.get(ParticipantData.DEFAULT_SELF_SUB_ID);
addMmsConfig(new MmsConfig(ParticipantData.DEFAULT_SELF_SUB_ID, values));
final List<SubscriptionInfo> subInfoRecords =
PhoneUtils.getDefault().getActiveSubscriptionInfoList();
if (subInfoRecords == null) {
LogUtil.w(TAG, "Loading mms config failed: no active SIM");
return;
}
for (SubscriptionInfo subInfoRecord : subInfoRecords) {
final int subId = subInfoRecord.getSubscriptionId();
final Bundle values = loader.get(subId);
addMmsConfig(new MmsConfig(subId, values));
}
}
private static void addMmsConfig(MmsConfig mmsConfig) {
Assert.isTrue(OsUtil.isAtLeastL_MR1() !=
(mmsConfig.mSubId == ParticipantData.DEFAULT_SELF_SUB_ID));
Assert.isTrue(mmsConfig.mSubId != ParticipantData.DEFAULT_SELF_SUB_ID);
sSubIdToMmsConfigMap.put(mmsConfig.mSubId, mmsConfig);
}
+21 -80
View File
@@ -76,7 +76,6 @@ import com.android.messaging.util.ImageUtils;
import com.android.messaging.util.ImageUtils.ImageResizer;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.MediaMetadataRetrieverWrapper;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import com.google.common.base.Joiner;
@@ -869,9 +868,7 @@ public class MmsUtils {
values.put(Telephony.Sms.SEEN, seen ? 1 : 0);
values.put(Telephony.Sms.SUBJECT, subject);
values.put(Telephony.Sms.BODY, body);
if (OsUtil.isAtLeastL_MR1()) {
values.put(Telephony.Sms.SUBSCRIPTION_ID, subId);
}
values.put(Telephony.Sms.SUBSCRIPTION_ID, subId);
if (status != Telephony.Sms.STATUS_NONE) {
values.put(Telephony.Sms.STATUS, status);
}
@@ -1156,9 +1153,7 @@ public class MmsUtils {
public static SmsMessage getSmsMessageFromDeliveryReport(final Intent intent) {
final byte[] pdu = intent.getByteArrayExtra("pdu");
final String format = intent.getStringExtra("format");
return OsUtil.isAtLeastM()
? SmsMessage.createFromPdu(pdu, format)
: SmsMessage.createFromPdu(pdu);
return SmsMessage.createFromPdu(pdu, format);
}
/**
@@ -1520,27 +1515,22 @@ public class MmsUtils {
// For the internal debugger only
public static void setUseSystemApnTable(final boolean turnOn) {
if (!turnOn) {
// We're not turning on to the system table. Instead, we're using our internal table.
final int osVersion = OsUtil.getApiVersion();
if (osVersion != android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
// We're turning on local APNs on a device where we wouldn't normally have the
// local APN table. Build it here.
// We're turning on local APNs on a device where we wouldn't normally have the
// local APN table. Build it here.
final SQLiteDatabase database = ApnDatabase.getApnDatabase().getWritableDatabase();
final SQLiteDatabase database = ApnDatabase.getApnDatabase().getWritableDatabase();
// Do we already have the table?
Cursor cursor = null;
try {
cursor = database.query(ApnDatabase.APN_TABLE,
ApnDatabase.APN_PROJECTION,
null, null, null, null, null, null);
} catch (final Exception e) {
// Apparently there's no table, create it now.
ApnDatabase.forceBuildAndLoadApnTables();
} finally {
if (cursor != null) {
cursor.close();
}
// Do we already have the table?
Cursor cursor = null;
try {
cursor = database.query(ApnDatabase.APN_TABLE,
ApnDatabase.APN_PROJECTION,
null, null, null, null, null, null);
} catch (final Exception e) {
// Apparently there's no table, create it now.
ApnDatabase.forceBuildAndLoadApnTables();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
@@ -1812,14 +1802,6 @@ public class MmsUtils {
return new StatusPlusUri(
MMS_REQUEST_NO_RETRY, MessageData.RAW_TELEPHONY_STATUS_UNDEFINED, null);
}
if (!isMmsDataAvailable(subId)) {
LogUtil.e(TAG,
"MmsUtils: failed to download message, no data available");
return new StatusPlusUri(MMS_REQUEST_MANUAL_RETRY,
MessageData.RAW_TELEPHONY_STATUS_UNDEFINED,
null,
SmsManager.MMS_ERROR_NO_DATA_NETWORK);
}
int status = MMS_REQUEST_MANUAL_RETRY;
try {
RetrieveConf retrieveConf = null;
@@ -1837,14 +1819,10 @@ public class MmsUtils {
LogUtil.d(TAG, "MmsUtils: Downloading MMS via MMS lib API; notification "
+ "message: " + notificationUri);
}
if (OsUtil.isAtLeastL_MR1()) {
if (subId < 0) {
LogUtil.e(TAG, "MmsUtils: Incoming MMS came from unknown SIM");
throw new MmsFailureException(MMS_REQUEST_NO_RETRY,
"Message from unknown SIM");
}
} else {
Assert.isTrue(subId == ParticipantData.DEFAULT_SELF_SUB_ID);
if (subId < 0) {
LogUtil.e(TAG, "MmsUtils: Incoming MMS came from unknown SIM");
throw new MmsFailureException(MMS_REQUEST_NO_RETRY,
"Message from unknown SIM");
}
if (extras == null) {
extras = new Bundle();
@@ -1943,10 +1921,6 @@ public class MmsUtils {
LogUtil.w(TAG, "MmsUtils: Can't send NotifyResp; transaction id is null");
return;
}
if (!isMmsDataAvailable(subId)) {
LogUtil.w(TAG, "MmsUtils: Can't send NotifyResp; no data available");
return;
}
MmsSender.sendNotifyResponseForMmsDownload(
context, subId, transactionId, contentLocation, status);
} catch (final MmsFailureException e) {
@@ -1973,10 +1947,6 @@ public class MmsUtils {
LogUtil.w(TAG, "MmsUtils: Can't send AckInd; transaction id is null");
return;
}
if (!isMmsDataAvailable(subId)) {
LogUtil.w(TAG, "MmsUtils: Can't send AckInd; no data available");
return;
}
MmsSender.sendAcknowledgeForMmsDownload(context, subId, transactionId, contentLocation);
} catch (final MmsFailureException e) {
LogUtil.e(TAG, "sendAcknowledgeForMmsDownload: failed to retrieve message " + e, e);
@@ -2021,35 +1991,10 @@ public class MmsUtils {
return (RetrieveConf) pdu;
}
private static boolean isMmsDataAvailable(final int subId) {
if (OsUtil.isAtLeastL_MR1()) {
// L_MR1 above may support sending mms via wifi
return true;
}
final PhoneUtils phoneUtils = PhoneUtils.get(subId);
return !phoneUtils.isAirplaneModeOn() && phoneUtils.isMobileDataEnabled();
}
private static boolean isSmsDataAvailable(final int subId) {
if (OsUtil.isAtLeastL_MR1()) {
// L_MR1 above may support sending sms via wifi
return true;
}
final PhoneUtils phoneUtils = PhoneUtils.get(subId);
return !phoneUtils.isAirplaneModeOn();
}
public static StatusPlusUri sendMmsMessage(final Context context, final int subId,
final Uri messageUri, final Bundle extras) {
int status = MMS_REQUEST_MANUAL_RETRY;
int rawStatus = MessageData.RAW_TELEPHONY_STATUS_UNDEFINED;
if (!isMmsDataAvailable(subId)) {
LogUtil.w(TAG, "MmsUtils: failed to send message, no data available");
return new StatusPlusUri(MMS_REQUEST_MANUAL_RETRY,
MessageData.RAW_TELEPHONY_STATUS_UNDEFINED,
messageUri,
SmsManager.MMS_ERROR_NO_DATA_NETWORK);
}
final PduPersister persister = PduPersister.getPduPersister(context);
try {
final SendReq sendReq = (SendReq) persister.load(messageUri);
@@ -2460,10 +2405,6 @@ public class MmsUtils {
public static int sendSmsMessage(final String recipient, final String messageText,
final Uri requestUri, final int subId,
final String smsServiceCenter, final boolean requireDeliveryReport) {
if (!isSmsDataAvailable(subId)) {
LogUtil.w(TAG, "MmsUtils: can't send SMS without radio");
return MMS_REQUEST_MANUAL_RETRY;
}
final Context context = Factory.get().getApplicationContext();
int status = MMS_REQUEST_MANUAL_RETRY;
try {
@@ -41,7 +41,6 @@ import com.android.messaging.ui.mediapicker.PausableChronometer;
import com.android.messaging.util.Assert;
import com.android.messaging.util.ContentType;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.MediaUtil;
import com.android.messaging.util.UiUtils;
/**
@@ -79,9 +78,6 @@ public class AudioAttachmentView extends LinearLayout {
private int mThemeColor;
private boolean mStartPlayAfterPrepare;
// should the MediaPlayer be prepared lazily when the user chooses to play the audio (as
// opposed to preparing it early, on bind)
private boolean mPrepareOnPlayback;
private boolean mPrepared;
private boolean mPlaybackFinished; // Was the audio played all the way to the end
private final int mMode;
@@ -148,12 +144,7 @@ public class AudioAttachmentView extends LinearLayout {
return;
}
if (mPrepareOnPlayback) {
// For lazy preparation, the chronometer will only be shown during playback
mChronometer.setVisibility(playing ? View.VISIBLE : View.INVISIBLE);
} else {
mChronometer.setVisibility(View.VISIBLE);
}
mChronometer.setVisibility(View.VISIBLE);
}
/**
@@ -180,7 +171,6 @@ public class AudioAttachmentView extends LinearLayout {
mUseIncomingStyle = useIncomingStyle;
mThemeColor = themeColor;
mPrepareOnPlayback = incoming && !MediaUtil.canAutoAccessIncomingMedia();
if (!TextUtils.equals(currentUriString, newUriString)) {
mDataSourceUri = dataSourceUri;
@@ -216,7 +206,7 @@ public class AudioAttachmentView extends LinearLayout {
}
/**
* Prepare the MediaPlayer, and if mPrepareOnPlayback, start playing the audio
* Prepare the MediaPlayer and start playing the audio
*/
private void setupMediaPlayer() {
Assert.notNull(mDataSourceUri);
@@ -332,7 +322,7 @@ public class AudioAttachmentView extends LinearLayout {
updateVisualStyle();
updateChronometerVisibility(false /* playing */);
if (mDataSourceUri != null && !mPrepareOnPlayback) {
if (mDataSourceUri != null) {
// Prepare the media player, so we can read the duration of the audio.
setupMediaPlayer();
}
@@ -22,9 +22,6 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.UiUtils;
import java.util.ArrayList;
/**
@@ -43,8 +40,8 @@ public class LineWrapLayout extends ViewGroup {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int startPadding = UiUtils.getPaddingStart(this);
final int endPadding = UiUtils.getPaddingEnd(this);
final int startPadding = getPaddingStart();
final int endPadding = getPaddingEnd();
final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
final int widthSize = MeasureSpec.getSize(widthMeasureSpec) - startPadding - endPadding;
final boolean isFixedSize = (widthMode == MeasureSpec.EXACTLY);
@@ -96,8 +93,8 @@ public class LineWrapLayout extends ViewGroup {
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int startPadding = UiUtils.getPaddingStart(this);
final int endPadding = UiUtils.getPaddingEnd(this);
final int startPadding = getPaddingStart();
final int endPadding = getPaddingEnd();
int width = getWidth() - startPadding - endPadding;
int y = getPaddingTop();
int x = startPadding;
@@ -171,7 +168,7 @@ public class LineWrapLayout extends ViewGroup {
}
}
if (OsUtil.isAtLeastJB_MR2() && getResources().getConfiguration()
if (getResources().getConfiguration()
.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
currChild.layout(width - startPositionX - childWidth, startPositionY,
width - startPositionX, startPositionY + childHeight);
@@ -214,19 +211,11 @@ public class LineWrapLayout extends ViewGroup {
}
public int getStartMargin() {
if (OsUtil.isAtLeastJB_MR2()) {
return getMarginStart();
} else {
return leftMargin;
}
return getMarginStart();
}
public int getEndMargin() {
if (OsUtil.isAtLeastJB_MR2()) {
return getMarginEnd();
} else {
return rightMargin;
}
return getMarginEnd();
}
}
}
@@ -42,7 +42,6 @@ import com.android.messaging.ui.SnackBar.SnackBarListener;
import com.android.messaging.util.AccessibilityUtil;
import com.android.messaging.util.Assert;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.TextUtil;
import com.android.messaging.util.UiUtils;
import com.google.common.base.Joiner;
@@ -354,22 +353,15 @@ public class SnackBarManager {
private int getScreenBottomOffset(final SnackBar snackBar) {
final WindowManager windowManager = getWindowManager(snackBar.getContext());
final DisplayMetrics displayMetrics = new DisplayMetrics();
if (OsUtil.isAtLeastL()) {
windowManager.getDefaultDisplay().getRealMetrics(displayMetrics);
} else {
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
}
windowManager.getDefaultDisplay().getRealMetrics(displayMetrics);
final int screenHeight = displayMetrics.heightPixels;
if (OsUtil.isAtLeastL()) {
// In L, the navigation bar is included in the space for the popup window, so we have to
// offset by the size of the navigation bar
final Rect displayRect = new Rect();
snackBar.getParentView().getRootView().getWindowVisibleDisplayFrame(displayRect);
return screenHeight - displayRect.bottom;
}
return 0;
// In L, the navigation bar is included in the space for the popup window, so we have to
// offset by the size of the navigation bar
final Rect displayRect = new Rect();
snackBar.getParentView().getRootView().getWindowVisibleDisplayFrame(displayRect);
return screenHeight - displayRect.bottom;
}
private int getRelativeOffset(final SnackBar snackBar) {
@@ -211,30 +211,19 @@ public class VideoThumbnailView extends FrameLayout {
mVideoView.start();
}
// TODO: The check could be added to MessagePartData itself so that all users of MessagePartData
// get the right behavior, instead of requiring all the users to do similar checks.
private static boolean shouldUseGenericVideoIcon(final boolean incomingMessage) {
return incomingMessage && !VideoThumbnailRequest.shouldShowIncomingVideoThumbnails();
}
public void setSource(final MessagePartData part, final boolean incomingMessage) {
if (part == null) {
clearSource();
} else {
mVideoSource = part.getContentUri();
if (shouldUseGenericVideoIcon(incomingMessage)) {
mThumbnailImage.setImageResource(R.drawable.generic_video_icon);
mVideoWidth = ImageRequest.UNSPECIFIED_SIZE;
mVideoHeight = ImageRequest.UNSPECIFIED_SIZE;
} else {
mThumbnailImage.setImageResourceId(
new MessagePartVideoThumbnailRequestDescriptor(part));
if (mVideoView != null) {
mVideoView.setVideoURI(mVideoSource);
}
mVideoWidth = part.getWidth();
mVideoHeight = part.getHeight();
mThumbnailImage.setImageResourceId(
new MessagePartVideoThumbnailRequestDescriptor(part));
if (mVideoView != null) {
mVideoView.setVideoURI(mVideoSource);
}
mVideoWidth = part.getWidth();
mVideoHeight = part.getHeight();
}
}
@@ -243,16 +232,10 @@ public class VideoThumbnailView extends FrameLayout {
clearSource();
} else {
mVideoSource = videoSource;
if (shouldUseGenericVideoIcon(incomingMessage)) {
mThumbnailImage.setImageResource(R.drawable.generic_video_icon);
mVideoWidth = ImageRequest.UNSPECIFIED_SIZE;
mVideoHeight = ImageRequest.UNSPECIFIED_SIZE;
} else {
mThumbnailImage.setImageResourceId(
new MessagePartVideoThumbnailRequestDescriptor(videoSource));
if (mVideoView != null) {
mVideoView.setVideoURI(videoSource);
}
mThumbnailImage.setImageResourceId(
new MessagePartVideoThumbnailRequestDescriptor(videoSource));
if (mVideoView != null) {
mVideoView.setVideoURI(videoSource);
}
}
}
@@ -25,7 +25,6 @@ import android.view.View;
import android.widget.LinearLayout;
import com.android.messaging.R;
import com.android.messaging.util.OsUtil;
public class ViewPagerTabStrip extends LinearLayout {
private int mSelectedUnderlineThickness;
@@ -97,6 +96,6 @@ public class ViewPagerTabStrip extends LinearLayout {
}
private boolean isRtl() {
return OsUtil.isAtLeastJB_MR2() ? getLayoutDirection() == View.LAYOUT_DIRECTION_RTL : false;
return getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
}
}
@@ -35,7 +35,6 @@ import android.widget.Toast;
import com.android.messaging.Factory;
import com.android.messaging.R;
import com.android.messaging.util.OsUtil;
/**
* Lightweight implementation of ViewPager tabs. This looks similar to traditional actionBar tabs,
@@ -130,14 +129,12 @@ public class ViewPagerTabs extends HorizontalScrollView implements ViewPager.OnP
a.recycle();
// enable shadow casting from view bounds
if (OsUtil.isAtLeastL()) {
setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
outline.setRect(0, 0, view.getWidth(), view.getHeight());
}
});
}
setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View view, Outline outline) {
outline.setRect(0, 0, view.getWidth(), view.getHeight());
}
});
}
public void setViewPager(ViewPager viewPager) {
@@ -223,7 +220,7 @@ public class ViewPagerTabs extends HorizontalScrollView implements ViewPager.OnP
}
private int getRtlPosition(int position) {
if (OsUtil.isAtLeastJB_MR2() && Factory.get().getApplicationContext().getResources()
if (Factory.get().getApplicationContext().getResources()
.getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
return mTabStrip.getChildCount() - 1 - position;
}
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,19 +20,12 @@ import android.animation.RectEvaluator;
import android.animation.TypeEvaluator;
import android.graphics.Rect;
import com.android.messaging.util.OsUtil;
/**
* This evaluator can be used to perform type interpolation between <code>Rect</code> values.
* It's backward compatible to Api Level 11.
*/
public class RectEvaluatorCompat implements TypeEvaluator<Rect> {
public static TypeEvaluator<Rect> create() {
if (OsUtil.isAtLeastJB_MR2()) {
return new RectEvaluator();
} else {
return new RectEvaluatorCompat();
}
return new RectEvaluator();
}
@Override
@@ -15,7 +15,6 @@
*/
package com.android.messaging.ui.animation;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
@@ -34,7 +33,6 @@ import android.widget.FrameLayout;
import com.android.messaging.R;
import com.android.messaging.util.ImageUtils;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.UiUtils;
/**
@@ -69,20 +67,15 @@ public class ViewGroupItemVerticalExplodeAnimation {
*/
public static void startAnimationForView(final ViewGroup container, final View viewToAnimate,
final View animationStagingView, final boolean snapshotView, final int duration) {
if (OsUtil.isAtLeastJB_MR2() && (viewToAnimate.getContext() instanceof Activity)) {
if ((viewToAnimate.getContext() instanceof Activity)) {
new ViewExplodeAnimationJellyBeanMR2(viewToAnimate, container, snapshotView, duration)
.startAnimation();
} else {
// Pre JB_MR2, this animation can cause rendering failures which causes the framework
// to fall back to software rendering where camera preview isn't supported (b/18264647)
// just skip the animation to avoid this case.
}
}
/**
* Implementation class for API level >= 18.
*/
@TargetApi(18)
private static class ViewExplodeAnimationJellyBeanMR2 {
private final View mViewToAnimate;
private final ViewGroup mContainer;
@@ -49,7 +49,6 @@ import com.android.messaging.sms.ApnDatabase;
import com.android.messaging.sms.BugleApnSettingsLoader;
import com.android.messaging.ui.BugleActionBarActivity;
import com.android.messaging.ui.UIIntents;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
public class ApnSettingsActivity extends BugleActionBarActivity {
@@ -150,13 +149,8 @@ public class ApnSettingsActivity extends BugleActionBarActivity {
super.onCreate(icicle);
mDatabase = ApnDatabase.getApnDatabase().getWritableDatabase();
if (OsUtil.isAtLeastL()) {
mUm = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
if (!mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
setHasOptionsMenu(true);
}
} else {
mUm = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
if (!mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
setHasOptionsMenu(true);
}
}
@@ -172,8 +166,7 @@ public class ApnSettingsActivity extends BugleActionBarActivity {
lv.setEmptyView(empty);
}
if (OsUtil.isAtLeastL() &&
mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
if (mUm.hasUserRestriction(UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS)) {
mUnavailable = true;
setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getActivity()));
return;
@@ -36,7 +36,6 @@ import com.android.messaging.ui.LicenseActivity;
import com.android.messaging.ui.UIIntents;
import com.android.messaging.util.BuglePrefs;
import com.android.messaging.util.DebugUtils;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
public class ApplicationSettingsActivity extends BugleActionBarActivity {
@@ -151,35 +150,14 @@ public class ApplicationSettingsActivity extends BugleActionBarActivity {
}
private void updateSmsEnabledPreferences() {
if (!OsUtil.isAtLeastKLP()) {
final String defaultSmsAppLabel = getString(R.string.default_sms_app,
PhoneUtils.getDefault().getDefaultSmsAppLabel());
if (PhoneUtils.getDefault().isDefaultSmsApp()) {
getPreferenceScreen().removePreference(mSmsDisabledPreference);
getPreferenceScreen().removePreference(mSmsEnabledPreference);
mSmsEnabledPreference.setSummary(defaultSmsAppLabel);
} else {
final String defaultSmsAppLabel = getString(R.string.default_sms_app,
PhoneUtils.getDefault().getDefaultSmsAppLabel());
boolean isSmsEnabledBeforeState;
boolean isSmsEnabledCurrentState;
if (PhoneUtils.getDefault().isDefaultSmsApp()) {
if (getPreferenceScreen().findPreference(mSmsEnabledPrefKey) == null) {
getPreferenceScreen().addPreference(mSmsEnabledPreference);
isSmsEnabledBeforeState = false;
} else {
isSmsEnabledBeforeState = true;
}
isSmsEnabledCurrentState = true;
getPreferenceScreen().removePreference(mSmsDisabledPreference);
mSmsEnabledPreference.setSummary(defaultSmsAppLabel);
} else {
if (getPreferenceScreen().findPreference(mSmsDisabledPrefKey) == null) {
getPreferenceScreen().addPreference(mSmsDisabledPreference);
isSmsEnabledBeforeState = true;
} else {
isSmsEnabledBeforeState = false;
}
isSmsEnabledCurrentState = false;
getPreferenceScreen().removePreference(mSmsEnabledPreference);
mSmsDisabledPreference.setSummary(defaultSmsAppLabel);
}
getPreferenceScreen().removePreference(mSmsEnabledPreference);
mSmsDisabledPreference.setSummary(defaultSmsAppLabel);
}
mIsSmsPreferenceClicked = false;
}
@@ -60,7 +60,6 @@ import com.android.messaging.util.Assert.RunsOnMainThread;
import com.android.messaging.util.ContactUtil;
import com.android.messaging.util.ImeUtil;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import com.android.messaging.util.UiUtils;
import com.google.common.annotations.VisibleForTesting;
@@ -503,10 +502,6 @@ public class ContactPickerFragment extends Fragment implements ContactPickerData
* @param show whether the contact lists are to be shown or hidden.
*/
private void startExplodeTransitionForContactLists(final boolean show) {
if (!OsUtil.isAtLeastL()) {
// Explode animation is not supported pre-L.
return;
}
final Explode transition = new Explode();
final Rect epicenter = mPendingExplodeView == null ? null :
UiUtils.getMeasuredBoundsOnScreen(mPendingExplodeView);
@@ -533,10 +528,6 @@ public class ContactPickerFragment extends Fragment implements ContactPickerData
* the transition manager for pending explode transition.
*/
private void toggleContactListItemsVisibilityForPendingTransition(final boolean show) {
if (!OsUtil.isAtLeastL()) {
// Explode animation is not supported pre-L.
return;
}
mAllContactsListViewHolder.toggleVisibilityForPendingTransition(show, mPendingExplodeView);
mFrequentContactsListViewHolder.toggleVisibilityForPendingTransition(show,
mPendingExplodeView);
@@ -39,7 +39,6 @@ import com.android.messaging.util.BugleGservices;
import com.android.messaging.util.BugleGservicesKeys;
import com.android.messaging.util.ContactRecipientEntryUtils;
import com.android.messaging.util.ContactUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import java.text.Collator;
@@ -129,30 +128,26 @@ public final class ContactRecipientAdapter extends BaseRecipientAdapter {
new Cursor[]{personalFilterEmailsCursor, personalFilterPhonesCursor});
final CursorResult cursorResult =
new CursorResult(personalCursor, false /* sorted */);
if (OsUtil.isAtLeastN()) {
// Including enterprise result starting from N.
final Cursor enterpriseFilterPhonesCursor = ContactUtil.filterPhonesEnterprise(
getContext(), searchText).performSynchronousQuery();
final Cursor enterpriseFilterEmailsCursor = ContactUtil.filterEmailsEnterprise(
getContext(), searchText).performSynchronousQuery();
final Cursor enterpriseCursor = new MergeCursor(
new Cursor[]{enterpriseFilterEmailsCursor,
enterpriseFilterPhonesCursor});
cursorResult.enterpriseCursor = enterpriseCursor;
}
// Including enterprise result starting from N.
final Cursor enterpriseFilterPhonesCursor = ContactUtil.filterPhonesEnterprise(
getContext(), searchText).performSynchronousQuery();
final Cursor enterpriseFilterEmailsCursor = ContactUtil.filterEmailsEnterprise(
getContext(), searchText).performSynchronousQuery();
final Cursor enterpriseCursor = new MergeCursor(
new Cursor[]{enterpriseFilterEmailsCursor,
enterpriseFilterPhonesCursor});
cursorResult.enterpriseCursor = enterpriseCursor;
return cursorResult;
} else {
final Cursor personalFilterDestinationCursor = ContactUtil
.filterDestination(getContext(), searchText).performSynchronousQuery();
final CursorResult cursorResult = new CursorResult(personalFilterDestinationCursor,
true);
if (OsUtil.isAtLeastN()) {
// Including enterprise result starting from N.
final Cursor enterpriseFilterDestinationCursor = ContactUtil
.filterDestinationEnterprise(getContext(), searchText)
.performSynchronousQuery();
cursorResult.enterpriseCursor = enterpriseFilterDestinationCursor;
}
// Including enterprise result starting from N.
final Cursor enterpriseFilterDestinationCursor = ContactUtil
.filterDestinationEnterprise(getContext(), searchText)
.performSynchronousQuery();
cursorResult.enterpriseCursor = enterpriseFilterDestinationCursor;
return cursorResult;
}
}
@@ -67,7 +67,6 @@ import com.android.messaging.util.BuglePrefs;
import com.android.messaging.util.ContentType;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.MediaUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import com.android.messaging.util.SafeAsyncTask;
import com.android.messaging.util.UiUtils;
@@ -867,18 +866,16 @@ public class ComposeMessageView extends LinearLayout
// Set accessibility traversal order of the components in the send widget.
private void setSendWidgetAccessibilityTraversalOrder(final int mode) {
if (OsUtil.isAtLeastL_MR1()) {
mAttachMediaButton.setAccessibilityTraversalBefore(R.id.compose_message_text);
switch (mode) {
case SEND_WIDGET_MODE_SIM_SELECTOR:
mComposeEditText.setAccessibilityTraversalBefore(R.id.self_send_icon);
break;
case SEND_WIDGET_MODE_SEND_BUTTON:
mComposeEditText.setAccessibilityTraversalBefore(R.id.send_message_button);
break;
default:
break;
}
mAttachMediaButton.setAccessibilityTraversalBefore(R.id.compose_message_text);
switch (mode) {
case SEND_WIDGET_MODE_SIM_SELECTOR:
mComposeEditText.setAccessibilityTraversalBefore(R.id.self_send_icon);
break;
case SEND_WIDGET_MODE_SEND_BUTTON:
mComposeEditText.setAccessibilityTraversalBefore(R.id.send_message_button);
break;
default:
break;
}
}
@@ -979,8 +976,7 @@ public class ComposeMessageView extends LinearLayout
}
public static boolean shouldShowSimSelector(final ConversationData convData) {
return OsUtil.isAtLeastL_MR1() &&
convData.getSelfParticipantsCountExcludingDefault(true /* activeOnly */) > 1;
return convData.getSelfParticipantsCountExcludingDefault(true /* activeOnly */) > 1;
}
public void sendMessageIgnoreMessageSizeLimit() {
@@ -39,7 +39,6 @@ import com.android.messaging.ui.conversationlist.ConversationListActivity;
import com.android.messaging.util.Assert;
import com.android.messaging.util.ContentType;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.UiUtils;
public class ConversationActivity extends BugleActionBarActivity
@@ -348,11 +347,7 @@ public class ConversationActivity extends BugleActionBarActivity
public void onFinishCurrentConversation() {
// Simply finish the current activity. The current design is to leave any empty
// conversations as is.
if (OsUtil.isAtLeastL()) {
finishAfterTransition();
} else {
finish();
}
finishAfterTransition();
}
@Override
@@ -41,7 +41,6 @@ import com.android.messaging.R;
import com.android.messaging.datamodel.data.ConversationMessageData;
import com.android.messaging.ui.ConversationDrawables;
import com.android.messaging.util.Dates;
import com.android.messaging.util.OsUtil;
/**
* Adds a "fast-scroll" bar to the conversation RecyclerView that shows the current position within
@@ -63,10 +62,7 @@ public class ConversationFastScroller extends RecyclerView.OnScrollListener impl
* (the feature requires Jellybean MR2 or newer)
*/
public static ConversationFastScroller addTo(RecyclerView rv, int position) {
if (OsUtil.isAtLeastJB_MR2()) {
return new ConversationFastScroller(rv, position);
}
return null;
return new ConversationFastScroller(rv, position);
}
public static final int POSITION_RIGHT_SIDE = 0;
@@ -164,20 +160,12 @@ public class ConversationFastScroller extends RecyclerView.OnScrollListener impl
public void refreshConversationThemeColor() {
mPreviewTextView.setBackground(
ConversationDrawables.get().getFastScrollPreviewDrawable(mPosRight));
if (OsUtil.isAtLeastL()) {
final StateListDrawable drawable = new StateListDrawable();
drawable.addState(new int[]{ android.R.attr.state_pressed },
ConversationDrawables.get().getFastScrollThumbDrawable(true /* pressed */));
drawable.addState(StateSet.WILD_CARD,
ConversationDrawables.get().getFastScrollThumbDrawable(false /* pressed */));
mThumbImageView.setImageDrawable(drawable);
} else {
// Android pre-L doesn't seem to handle a StateListDrawable containing a tinted
// drawable (it's rendered in the filter base color, which is red), so fall back to
// just the regular (non-pressed) drawable.
mThumbImageView.setImageDrawable(
ConversationDrawables.get().getFastScrollThumbDrawable(false /* pressed */));
}
final StateListDrawable drawable = new StateListDrawable();
drawable.addState(new int[]{ android.R.attr.state_pressed },
ConversationDrawables.get().getFastScrollThumbDrawable(true /* pressed */));
drawable.addState(StateSet.WILD_CARD,
ConversationDrawables.get().getFastScrollThumbDrawable(false /* pressed */));
mThumbImageView.setImageDrawable(drawable);
}
@Override
@@ -1012,7 +1012,7 @@ public class ConversationFragment extends Fragment implements ConversationDataLi
}
private FragmentManager getFragmentManagerToUse() {
return OsUtil.isAtLeastJB_MR1() ? getChildFragmentManager() : getFragmentManager();
return getChildFragmentManager();
}
public MediaPicker getMediaPicker() {
@@ -1158,21 +1158,7 @@ public class ConversationFragment extends Fragment implements ConversationDataLi
}
})
.setNegativeButton(android.R.string.cancel, null);
if (OsUtil.isAtLeastJB_MR1()) {
builder.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(final DialogInterface dialog) {
mHost.dismissActionMode();
}
});
} else {
builder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(final DialogInterface dialog) {
mHost.dismissActionMode();
}
});
}
builder.setOnDismissListener(dialog -> mHost.dismissActionMode());
builder.create().show();
} else {
warnOfMissingActionConditions(false /*sending*/,
@@ -26,7 +26,6 @@ import com.android.messaging.datamodel.data.SubscriptionListData.SubscriptionLis
import com.android.messaging.ui.conversation.SimSelectorView.SimSelectorViewListener;
import com.android.messaging.util.AccessibilityUtil;
import com.android.messaging.util.Assert;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.ThreadUtil;
/**
@@ -47,7 +46,6 @@ abstract class ConversationSimSelector extends ConversationInput {
mSimSelectorView.bind(subscriptionListData);
mDataReady = subscriptionListData != null && subscriptionListData.hasData();
if (mPendingShow != null && mDataReady) {
Assert.isTrue(OsUtil.isAtLeastL_MR1());
final boolean show = mPendingShow.first;
final boolean animate = mPendingShow.second;
ThreadUtil.getMainThreadHandler().post(new Runnable() {
@@ -88,10 +86,6 @@ abstract class ConversationSimSelector extends ConversationInput {
}
private boolean showHide(final boolean show, final boolean animate) {
if (!OsUtil.isAtLeastL_MR1()) {
return false;
}
if (mDataReady) {
mSimSelectorView.showOrHide(show, animate);
return mSimSelectorView.isOpen() == show;
@@ -37,7 +37,6 @@ import com.android.messaging.util.Assert;
import com.android.messaging.util.Assert.DoesNotRunOnMainThread;
import com.android.messaging.util.Dates;
import com.android.messaging.util.DebugUtils;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import com.android.messaging.util.SafeAsyncTask;
@@ -356,9 +355,7 @@ public class MessageDetailsDialog {
private static void appendSimInfo(final Resources res,
final ParticipantData self, final StringBuilder outString) {
if (!OsUtil.isAtLeastL_MR1()
|| self == null
|| PhoneUtils.getDefault().getActiveSubscriptionCount() < 2) {
if (self == null || PhoneUtils.getDefault().getActiveSubscriptionCount() < 2) {
return;
}
// The appended SIM info would look like:
@@ -26,7 +26,6 @@ import android.view.ViewOutlineProvider;
import com.android.messaging.ui.ContactIconView;
import com.android.messaging.util.Assert;
import com.android.messaging.util.AvatarUriUtil;
import com.android.messaging.util.OsUtil;
/**
* Shows SIM avatar icon in the SIM switcher / Self-send button.
@@ -34,14 +33,12 @@ import com.android.messaging.util.OsUtil;
public class SimIconView extends ContactIconView {
public SimIconView(Context context, AttributeSet attrs) {
super(context, attrs);
if (OsUtil.isAtLeastL()) {
setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View v, Outline outline) {
outline.setOval(0, 0, v.getWidth(), v.getHeight());
}
});
}
setOutlineProvider(new ViewOutlineProvider() {
@Override
public void getOutline(View v, Outline outline) {
outline.setOval(0, 0, v.getWidth(), v.getHeight());
}
});
}
@Override
@@ -53,7 +53,6 @@ import com.android.messaging.ui.SnackBarInteraction;
import com.android.messaging.util.Assert;
import com.android.messaging.util.ContentType;
import com.android.messaging.util.ImageUtils;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import com.android.messaging.util.Typefaces;
import com.android.messaging.util.UiUtils;
@@ -168,9 +167,7 @@ public class ConversationListItemView extends FrameLayout implements OnClickList
mListItemReadTypeface = Typefaces.getRobotoNormal();
mListItemUnreadTypeface = Typefaces.getRobotoBold();
if (OsUtil.isAtLeastL()) {
setTransitionGroup(true);
}
setTransitionGroup(true);
}
@Override
@@ -31,10 +31,8 @@ import android.widget.Spinner;
import android.widget.TextView;
import com.android.messaging.R;
import com.android.messaging.datamodel.data.ParticipantData;
import com.android.messaging.sms.MmsConfig;
import com.android.messaging.ui.debug.DebugMmsConfigItemView.MmsConfigItemListener;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
import java.util.ArrayList;
@@ -79,11 +77,8 @@ public class DebugMmsConfigFragment extends Fragment {
}
public static Integer[] getActiveSubIds() {
if (!OsUtil.isAtLeastL_MR1()) {
return new Integer[] { ParticipantData.DEFAULT_SELF_SUB_ID };
}
final List<SubscriptionInfo> subRecords =
PhoneUtils.getDefault().toLMr1().getActiveSubscriptionInfoList();
PhoneUtils.getDefault().getActiveSubscriptionInfoList();
if (subRecords == null) {
return new Integer[0];
}
@@ -34,7 +34,6 @@ import com.android.messaging.datamodel.data.MediaPickerData;
import com.android.messaging.datamodel.data.DraftMessageData.DraftMessageSubscriptionDataProvider;
import com.android.messaging.ui.BasePagerViewHolder;
import com.android.messaging.util.Assert;
import com.android.messaging.util.OsUtil;
abstract class MediaChooser extends BasePagerViewHolder
implements DraftMessageSubscriptionDataProvider {
@@ -107,8 +106,7 @@ abstract class MediaChooser extends BasePagerViewHolder
}
protected FragmentManager getFragmentManager() {
return OsUtil.isAtLeastJB_MR1() ? mMediaPicker.getChildFragmentManager() :
mMediaPicker.getFragmentManager();
return mMediaPicker.getChildFragmentManager();
}
protected LayoutInflater getLayoutInflater() {
return LayoutInflater.from(getContext());
@@ -31,7 +31,6 @@ import android.widget.LinearLayout;
import com.android.messaging.R;
import com.android.messaging.ui.PagingAwareViewPager;
import com.android.messaging.util.Assert;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.UiUtils;
/**
@@ -202,7 +201,7 @@ public class MediaPickerPanel extends ViewGroup {
private int getDesiredHeight() {
if (mFullScreen) {
int fullHeight = getContext().getResources().getDisplayMetrics().heightPixels;
if (OsUtil.isAtLeastKLP() && isAttachedToWindow()) {
if (isAttachedToWindow()) {
// When we're attached to the window, we can get an accurate height, not necessary
// on older API level devices because they don't include the action bar height
View composeContainer =
@@ -73,8 +73,7 @@ public class AccessibilityUtil {
}
// Jelly Bean added support for speaking text verbatim
final int eventType = OsUtil.isAtLeastJB() ? AccessibilityEvent.TYPE_ANNOUNCEMENT
: AccessibilityEvent.TYPE_VIEW_FOCUSED;
final int eventType = AccessibilityEvent.TYPE_ANNOUNCEMENT;
// Construct an accessibility event with the minimum recommended
// attributes. An event without a class name or package may be dropped.
@@ -101,11 +100,7 @@ public class AccessibilityUtil {
* @return boolean Boolean indicating whether the currently locale is RTL.
*/
public static boolean isLayoutRtl(final View view) {
if (OsUtil.isAtLeastJB_MR1()) {
return View.LAYOUT_DIRECTION_RTL == view.getLayoutDirection();
} else {
return false;
}
return View.LAYOUT_DIRECTION_RTL == view.getLayoutDirection();
}
public static String getVocalizedPhoneNumber(final Resources res, final String phoneNumber) {
@@ -62,10 +62,6 @@ public class BugleActivityUtil {
* @return true if the user has SMS permissions, otherwise false.
*/
private static boolean checkHasSmsPermissionsForUser(Context context, Activity activity) {
if (!OsUtil.isAtLeastL()) {
// UserManager.DISALLOW_SMS added in L. No multiuser phones before this
return true;
}
UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
if (userManager.hasUserRestriction(UserManager.DISALLOW_SMS)) {
new AlertDialog.Builder(activity)
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -25,13 +26,6 @@ import com.android.messaging.datamodel.data.ParticipantData;
/**
* ConnectivityUtil listens to the network service state changes.
*
* On N and beyond, This class instance can be created via ConnectivityUtil(context, subId), use
* ConnectivityUtil(context) for others.
*
* Note that TelephonyManager has createForSubscriptionId() for a specific subId from N but listen()
* does not use the subId on the manager, and uses the default subId on PhoneStateListener. From O,
* the manager uses its' own subId in listen().
*/
public class ConnectivityUtil {
// Assume not connected until informed differently
@@ -45,12 +39,7 @@ public class ConnectivityUtil {
public void onPhoneStateChanged(int serviceState);
}
public ConnectivityUtil(final Context context) {
mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
}
public ConnectivityUtil(final Context context, final int subId) {
Assert.isTrue(OsUtil.isAtLeastN());
mTelephonyManager =
((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE))
.createForSubscriptionId(subId);
@@ -519,27 +519,21 @@ public class ContactUtil {
* Returns if a given contact id belongs to managed profile.
*/
public static boolean isEnterpriseContactId(final long contactId) {
return OsUtil.isAtLeastL() && ContactsContract.Contacts.isEnterpriseContactId(contactId);
return ContactsContract.Contacts.isEnterpriseContactId(contactId);
}
/**
* Returns Email lookup uri that will query both primary and corp profile
*/
private static Uri getEmailContentLookupUri() {
if (OsUtil.isAtLeastM()) {
return Email.ENTERPRISE_CONTENT_LOOKUP_URI;
}
return Email.CONTENT_LOOKUP_URI;
return Email.ENTERPRISE_CONTENT_LOOKUP_URI;
}
/**
* Returns PhoneLookup URI.
*/
public static Uri getPhoneLookupUri() {
if (OsUtil.isAtLeastM()) {
return PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI;
}
return PhoneLookup.CONTENT_FILTER_URI;
return PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI;
}
public static boolean hasReadContactsPermission() {
@@ -302,10 +302,7 @@ public class DebugUtils {
final int length = dis.readInt();
final byte[] pdu = new byte[length];
dis.read(pdu, 0, length);
messagesTemp[i] =
OsUtil.isAtLeastM()
? SmsMessage.createFromPdu(pdu, format)
: SmsMessage.createFromPdu(pdu);
messagesTemp[i] = SmsMessage.createFromPdu(pdu, format);
}
messages = messagesTemp;
} catch (final FileNotFoundException e) {
@@ -174,11 +174,7 @@ public class ImageUtils {
*/
@SuppressWarnings("deprecation")
public static void setBackgroundDrawableOnView(final View view, final Drawable drawable) {
if (OsUtil.isAtLeastJB()) {
view.setBackground(drawable);
} else {
view.setBackgroundDrawable(drawable);
}
view.setBackground(drawable);
}
/**
@@ -33,8 +33,4 @@ public abstract class MediaUtil {
*/
public abstract void playSound(final Context context, final int resId,
final OnCompletionListener completionListener);
public static boolean canAutoAccessIncomingMedia() {
return OsUtil.isAtLeastM();
}
}
@@ -20,7 +20,6 @@ import android.app.NotificationChannel;
import android.app.NotificationChannelGroup;
import android.app.NotificationManager;
import android.content.Context;
import android.os.Build;
public final class NotificationsUtil {
public static final String DEFAULT_CHANNEL_ID = "messaging_channel";
@@ -37,10 +36,6 @@ public final class NotificationsUtil {
public static void createNotificationChannel(Context context, String id,
String title, int priority, String groupId) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
return;
}
NotificationManager manager = context.getSystemService(NotificationManager.class);
NotificationChannel existing = manager.getNotificationChannel(id);
if (existing != null) {
@@ -56,20 +51,12 @@ public final class NotificationsUtil {
}
public static void deleteNotificationChannel(Context context, String id) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
return;
}
NotificationManager manager = context.getSystemService(NotificationManager.class);
manager.deleteNotificationChannel(id);
}
public static void createNotificationChannelGroup(Context context, String id,
int titleResId) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
return;
}
NotificationManager manager = context.getSystemService(NotificationManager.class);
NotificationChannelGroup existing = manager.getNotificationChannelGroup(id);
if (existing != null) {
@@ -82,19 +69,11 @@ public final class NotificationsUtil {
}
public static NotificationChannel getNotificationChannel(Context context, String id) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
return null;
}
NotificationManager manager = context.getSystemService(NotificationManager.class);
return manager.getNotificationChannel(id);
}
public static NotificationChannelGroup getNotificationChannelGroup(Context context, String id) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
return null;
}
NotificationManager manager = context.getSystemService(NotificationManager.class);
return manager.getNotificationChannelGroup(id);
}
+15 -125
View File
@@ -19,10 +19,8 @@ package com.android.messaging.util;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.UserHandle;
import android.os.UserManager;
import androidx.core.os.BuildCompat;
import com.android.messaging.Factory;
@@ -34,124 +32,20 @@ import java.util.Set;
* Android OS version utilities
*/
public class OsUtil {
private static boolean sIsAtLeastICS_MR1;
private static boolean sIsAtLeastJB;
private static boolean sIsAtLeastJB_MR1;
private static boolean sIsAtLeastJB_MR2;
private static boolean sIsAtLeastKLP;
private static boolean sIsAtLeastL;
private static boolean sIsAtLeastL_MR1;
private static boolean sIsAtLeastM;
private static boolean sIsAtLeastN;
private static Boolean sIsSecondaryUser = null;
static {
final int v = getApiVersion();
sIsAtLeastICS_MR1 = v >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1;
sIsAtLeastJB = v >= android.os.Build.VERSION_CODES.JELLY_BEAN;
sIsAtLeastJB_MR1 = v >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
sIsAtLeastJB_MR2 = v >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;
sIsAtLeastKLP = v >= android.os.Build.VERSION_CODES.KITKAT;
sIsAtLeastL = v >= android.os.Build.VERSION_CODES.LOLLIPOP;
sIsAtLeastL_MR1 = v >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1;
sIsAtLeastM = v >= android.os.Build.VERSION_CODES.M;
sIsAtLeastN = BuildCompat.isAtLeastN();
}
/**
* @return True if the version of Android that we're running on is at least Ice Cream Sandwich
* MR1 (API level 15).
*/
public static boolean isAtLeastICS_MR1() {
return sIsAtLeastICS_MR1;
}
/**
* @return True if the version of Android that we're running on is at least Jelly Bean
* (API level 16).
*/
public static boolean isAtLeastJB() {
return sIsAtLeastJB;
}
/**
* @return True if the version of Android that we're running on is at least Jelly Bean MR1
* (API level 17).
*/
public static boolean isAtLeastJB_MR1() {
return sIsAtLeastJB_MR1;
}
/**
* @return True if the version of Android that we're running on is at least Jelly Bean MR2
* (API level 18).
*/
public static boolean isAtLeastJB_MR2() {
return sIsAtLeastJB_MR2;
}
/**
* @return True if the version of Android that we're running on is at least KLP
* (API level 19).
*/
public static boolean isAtLeastKLP() {
return sIsAtLeastKLP;
}
/**
* @return True if the version of Android that we're running on is at least L
* (API level 21).
*/
public static boolean isAtLeastL() {
return sIsAtLeastL;
}
/**
* @return True if the version of Android that we're running on is at least L MR1
* (API level 22).
*/
public static boolean isAtLeastL_MR1() {
return sIsAtLeastL_MR1;
}
/**
* @return True if the version of Android that we're running on is at least M
* (API level 23).
*/
public static boolean isAtLeastM() {
return sIsAtLeastM;
}
/**
* @return True if the version of Android that we're running on is at least N
* (API level 24).
*/
public static boolean isAtLeastN() {
return sIsAtLeastN;
}
/**
* @return The Android API version of the OS that we're currently running on.
*/
public static int getApiVersion() {
return android.os.Build.VERSION.SDK_INT;
}
public static boolean isSecondaryUser() {
if (sIsSecondaryUser == null) {
final Context context = Factory.get().getApplicationContext();
boolean isSecondaryUser = false;
// Only check for newer devices (but not the nexus 10)
if (OsUtil.sIsAtLeastJB_MR1 && !"Nexus 10".equals(Build.MODEL)) {
final UserHandle uh = android.os.Process.myUserHandle();
final UserManager userManager =
(UserManager) context.getSystemService(Context.USER_SERVICE);
if (userManager != null) {
final long userSerialNumber = userManager.getSerialNumberForUser(uh);
isSecondaryUser = (0 != userSerialNumber);
}
final UserHandle uh = android.os.Process.myUserHandle();
final UserManager userManager =
(UserManager) context.getSystemService(Context.USER_SERVICE);
if (userManager != null) {
final long userSerialNumber = userManager.getSerialNumberForUser(uh);
isSecondaryUser = (0 != userSerialNumber);
}
sIsSecondaryUser = isSecondaryUser;
}
@@ -192,20 +86,16 @@ public class OsUtil {
* @param permission A permission from {@link android.Manifest.permission}
*/
public static boolean hasPermission(final String permission) {
if (OsUtil.isAtLeastM()) {
// It is safe to cache the PERMISSION_GRANTED result as the process gets killed if the
// user revokes the permission setting. However, PERMISSION_DENIED should not be
// cached as the process does not get killed if the user enables the permission setting.
if (!sPermissions.containsKey(permission)
|| sPermissions.get(permission) == PackageManager.PERMISSION_DENIED) {
final Context context = Factory.get().getApplicationContext();
final int permissionState = context.checkSelfPermission(permission);
sPermissions.put(permission, permissionState);
}
return sPermissions.get(permission) == PackageManager.PERMISSION_GRANTED;
} else {
return true;
// It is safe to cache the PERMISSION_GRANTED result as the process gets killed if the
// user revokes the permission setting. However, PERMISSION_DENIED should not be
// cached as the process does not get killed if the user enables the permission setting.
if (!sPermissions.containsKey(permission)
|| sPermissions.get(permission) == PackageManager.PERMISSION_DENIED) {
final Context context = Factory.get().getApplicationContext();
final int permissionState = context.checkSelfPermission(permission);
sPermissions.put(permission, permissionState);
}
return sPermissions.get(permission) == PackageManager.PERMISSION_GRANTED;
}
/** Does the app have all the specified permissions */
+202 -466
View File
@@ -17,14 +17,13 @@
package com.android.messaging.util;
import android.app.role.RoleManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.ApplicationInfoFlags;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.Cursor;
import android.net.ConnectivityManager;
import android.provider.Settings;
import android.provider.Telephony;
import android.telephony.PhoneNumberUtils;
@@ -35,7 +34,6 @@ import android.telephony.TelephonyManager;
import android.text.TextUtils;
import androidx.collection.ArrayMap;
import androidx.core.os.BuildCompat;
import com.android.messaging.Factory;
import com.android.messaging.R;
@@ -64,7 +62,7 @@ import java.util.Locale;
*
* A convenient getDefault() method is provided for default subId (-1) on any platform
*/
public abstract class PhoneUtils {
public class PhoneUtils {
private static final String TAG = LogUtil.BUGLE_TAG;
private static final int MINIMUM_PHONE_NUMBER_LENGTH_TO_FORMAT = 6;
@@ -79,6 +77,7 @@ public abstract class PhoneUtils {
protected final Context mContext;
protected final TelephonyManager mTelephonyManager;
private final SubscriptionManager mSubscriptionManager;
protected final int mSubId;
public PhoneUtils(int subId) {
@@ -86,6 +85,7 @@ public abstract class PhoneUtils {
mContext = Factory.get().getApplicationContext();
mTelephonyManager =
(TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
mSubscriptionManager = SubscriptionManager.from(Factory.get().getApplicationContext());
}
/**
@@ -93,49 +93,90 @@ public abstract class PhoneUtils {
*
* @return the country code on the SIM
*/
public abstract String getSimCountry();
public String getSimCountry() {
final SubscriptionInfo subInfo = getActiveSubscriptionInfo();
if (subInfo != null) {
final String country = subInfo.getCountryIso();
if (TextUtils.isEmpty(country)) {
return null;
}
return country.toUpperCase();
}
return null;
}
/**
* Get number of SIM slots
*
* @return the SIM slot count
*/
public abstract int getSimSlotCount();
public int getSimSlotCount() {
return mSubscriptionManager.getActiveSubscriptionInfoCountMax();
}
/**
* Get SIM's carrier name
*
* @return the carrier name of the SIM
*/
public abstract String getCarrierName();
public String getCarrierName() {
final SubscriptionInfo subInfo = getActiveSubscriptionInfo();
if (subInfo != null) {
final CharSequence displayName = subInfo.getDisplayName();
if (!TextUtils.isEmpty(displayName)) {
return displayName.toString();
}
final CharSequence carrierName = subInfo.getCarrierName();
if (carrierName != null) {
return carrierName.toString();
}
}
return null;
}
/**
* Check if there is SIM inserted on the device
*
* @return true if there is SIM inserted, false otherwise
*/
public abstract boolean hasSim();
public boolean hasSim() {
return mSubscriptionManager.getActiveSubscriptionInfoCount() > 0;
}
/**
* Check if the SIM is roaming
*
* @return true if the SIM is in romaing state, false otherwise
*/
public abstract boolean isRoaming();
public boolean isRoaming() {
return mSubscriptionManager.isNetworkRoaming(mSubId);
}
/**
* Get the MCC and MNC in integer of the SIM's provider
*
* @return an array of two ints, [0] is the MCC code and [1] is the MNC code
*/
public abstract int[] getMccMnc();
public int[] getMccMnc() {
int mcc = 0;
int mnc = 0;
final SubscriptionInfo subInfo = getActiveSubscriptionInfo();
if (subInfo != null) {
mcc = subInfo.getMcc();
mnc = subInfo.getMnc();
}
return new int[]{mcc, mnc};
}
/**
* Get the mcc/mnc string
*
* @return the text of mccmnc string
*/
public abstract String getSimOperatorNumeric();
public String getSimOperatorNumeric() {
// For L_MR1 we return the canonicalized (xxxxxx) string
return getMccMncString(getMccMnc());
}
/**
* Get the SIM's self raw number, i.e. not canonicalized
@@ -144,7 +185,25 @@ public abstract class PhoneUtils {
* @return the original self number
* @throws IllegalStateException if no active subscription on L-MR1+
*/
public abstract String getSelfRawNumber(final boolean allowOverride);
public String getSelfRawNumber(final boolean allowOverride) {
if (allowOverride) {
final String userDefinedNumber = getNumberFromPrefs(mContext, mSubId);
if (!TextUtils.isEmpty(userDefinedNumber)) {
return userDefinedNumber;
}
}
final SubscriptionInfo subInfo = getActiveSubscriptionInfo();
if (subInfo != null) {
String phoneNumber = subInfo.getNumber();
if (TextUtils.isEmpty(phoneNumber) && LogUtil.isLoggable(TAG, LogUtil.DEBUG)) {
LogUtil.d(TAG, "SubscriptionInfo phone number for self is empty!");
}
return phoneNumber;
}
LogUtil.w(TAG, "PhoneUtils.getSelfRawNumber: subInfo is null for " + mSubId);
throw new IllegalStateException("No active subscription");
}
/**
* Returns the "effective" subId, or the subId used in the context of actual messages,
@@ -159,31 +218,49 @@ public abstract class PhoneUtils {
* @param subId The input subId
* @return the real subId if we can convert
*/
public abstract int getEffectiveSubId(int subId);
public int getEffectiveSubId(int subId) {
if (subId == ParticipantData.DEFAULT_SELF_SUB_ID) {
return getDefaultSmsSubscriptionId();
}
return subId;
}
/**
* Returns the number of active subscriptions in the device.
*/
public abstract int getActiveSubscriptionCount();
public int getActiveSubscriptionCount() {
return mSubscriptionManager.getActiveSubscriptionInfoCount();
}
/**
* Get {@link SmsManager} instance
*
* @return the relevant SmsManager instance based on OS version and subId
*/
public abstract SmsManager getSmsManager();
public SmsManager getSmsManager() {
return SmsManager.getSmsManagerForSubscriptionId(mSubId);
}
/**
* Get the default SMS subscription id
*
* @return the default sub ID
*/
public abstract int getDefaultSmsSubscriptionId();
public int getDefaultSmsSubscriptionId() {
final int systemDefaultSubId = SmsManager.getDefaultSmsSubscriptionId();
if (systemDefaultSubId < 0) {
// Always use -1 for any negative subId from system
return ParticipantData.DEFAULT_SELF_SUB_ID;
}
return systemDefaultSubId;
}
/**
* Returns if there's currently a system default SIM selected for sending SMS.
*/
public abstract boolean getHasPreferredSmsSim();
public boolean getHasPreferredSmsSim() {
return getDefaultSmsSubscriptionId() != ParticipantData.DEFAULT_SELF_SUB_ID;
}
/**
* For L_MR1, system may return a negative subId. Convert this into our own
@@ -195,7 +272,23 @@ public abstract class PhoneUtils {
* @param extraName The name of the sub id extra
* @return the subId that is valid and meaningful for the app
*/
public abstract int getEffectiveIncomingSubIdFromSystem(Intent intent, String extraName);
public int getEffectiveIncomingSubIdFromSystem(Intent intent, String extraName) {
return getEffectiveIncomingSubIdFromSystem(intent.getIntExtra(extraName,
ParticipantData.DEFAULT_SELF_SUB_ID));
}
private int getEffectiveIncomingSubIdFromSystem(int subId) {
if (subId < 0) {
if (mSubscriptionManager.getActiveSubscriptionInfoCount() > 1) {
// For multi-SIM device, we can not decide which SIM to use if system
// does not know either. So just make it the invalid sub id.
return ParticipantData.DEFAULT_SELF_SUB_ID;
}
// For single-SIM device, it must come from the only SIM we have
return getDefaultSmsSubscriptionId();
}
return subId;
}
/**
* Get the subscription_id column value from a telephony provider cursor
@@ -204,438 +297,107 @@ public abstract class PhoneUtils {
* @param subIdIndex The index of the subId column in the cursor
* @return the subscription_id column value from the cursor
*/
public abstract int getSubIdFromTelephony(Cursor cursor, int subIdIndex);
public int getSubIdFromTelephony(Cursor cursor, int subIdIndex) {
return getEffectiveIncomingSubIdFromSystem(cursor.getInt(subIdIndex));
}
/**
* Check if data roaming is enabled
*
* @return true if data roaming is enabled, false otherwise
*/
public abstract boolean isDataRoamingEnabled();
public boolean isDataRoamingEnabled() {
final SubscriptionInfo subInfo = getActiveSubscriptionInfo();
if (subInfo == null) {
// There is nothing we can do if system give us empty sub info
LogUtil.e(TAG, "PhoneUtils.isDataRoamingEnabled: system return empty sub info for "
+ mSubId);
return false;
}
return subInfo.getDataRoaming() != SubscriptionManager.DATA_ROAMING_DISABLE;
}
/**
* Check if mobile data is enabled
*
* @return true if mobile data is enabled, false otherwise
*/
public abstract boolean isMobileDataEnabled();
public boolean isMobileDataEnabled() {
boolean mobileDataEnabled = false;
try {
final Class cmClass = mTelephonyManager.getClass();
final Method method = cmClass.getDeclaredMethod("getDataEnabled", Integer.TYPE);
method.setAccessible(true); // Make the method callable
// get the setting for "mobile data"
mobileDataEnabled = (Boolean) method.invoke(
mTelephonyManager, Integer.valueOf(mSubId));
} catch (final Exception e) {
LogUtil.e(TAG, "PhoneUtil.isMobileDataEnabled: system api not found", e);
}
return mobileDataEnabled;
}
/**
* Get the set of self phone numbers, all normalized
*
* @return the set of normalized self phone numbers
*/
public abstract HashSet<String> getNormalizedSelfNumbers();
/**
* This interface packages methods should only compile on L_MR1.
* This is needed to make unit tests happy when mockito tries to
* mock these methods. Calling on these methods on L_MR1 requires
* an extra invocation of toMr1().
*/
public interface LMr1 {
/**
* Get this SIM's information. Only applies to L_MR1 above
*
* @return the subscription info of the SIM
*/
public abstract SubscriptionInfo getActiveSubscriptionInfo();
/**
* Get the list of active SIMs in system. Only applies to L_MR1 above
*
* @return the list of subscription info for all inserted SIMs
*/
public abstract List<SubscriptionInfo> getActiveSubscriptionInfoList();
/**
* Register subscription change listener. Only applies to L_MR1 above
*
* @param listener The listener to register
*/
public abstract void registerOnSubscriptionsChangedListener(
SubscriptionManager.OnSubscriptionsChangedListener listener);
public HashSet<String> getNormalizedSelfNumbers() {
final HashSet<String> numbers = new HashSet<>();
for (SubscriptionInfo info : getActiveSubscriptionInfoList()) {
numbers.add(PhoneUtils.get(info.getSubscriptionId()).getCanonicalForSelf(
true/*allowOverride*/));
}
return numbers;
}
/**
* The PhoneUtils class for pre L_MR1
* Get this SIM's information. Only applies to L_MR1 above
*
* @return the subscription info of the SIM
*/
public static class PhoneUtilsPreLMR1 extends PhoneUtils {
private final ConnectivityManager mConnectivityManager;
public PhoneUtilsPreLMR1() {
super(ParticipantData.DEFAULT_SELF_SUB_ID);
mConnectivityManager =
(ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
}
@Override
public String getSimCountry() {
final String country = mTelephonyManager.getSimCountryIso();
if (TextUtils.isEmpty(country)) {
return null;
}
return country.toUpperCase();
}
@Override
public int getSimSlotCount() {
// Don't support MSIM pre-L_MR1
return 1;
}
@Override
public String getCarrierName() {
return mTelephonyManager.getNetworkOperatorName();
}
@Override
public boolean hasSim() {
return mTelephonyManager.getSimState() != TelephonyManager.SIM_STATE_ABSENT;
}
@Override
public boolean isRoaming() {
return mTelephonyManager.isNetworkRoaming();
}
@Override
public int[] getMccMnc() {
final String mccmnc = mTelephonyManager.getSimOperator();
int mcc = 0;
int mnc = 0;
try {
mcc = Integer.parseInt(mccmnc.substring(0, 3));
mnc = Integer.parseInt(mccmnc.substring(3));
} catch (Exception e) {
LogUtil.w(TAG, "PhoneUtils.getMccMnc: invalid string " + mccmnc, e);
}
return new int[]{mcc, mnc};
}
@Override
public String getSimOperatorNumeric() {
return mTelephonyManager.getSimOperator();
}
@Override
public String getSelfRawNumber(final boolean allowOverride) {
if (allowOverride) {
final String userDefinedNumber = getNumberFromPrefs(mContext,
ParticipantData.DEFAULT_SELF_SUB_ID);
if (!TextUtils.isEmpty(userDefinedNumber)) {
return userDefinedNumber;
}
}
return mTelephonyManager.getLine1Number();
}
@Override
public int getEffectiveSubId(int subId) {
Assert.equals(ParticipantData.DEFAULT_SELF_SUB_ID, subId);
return ParticipantData.DEFAULT_SELF_SUB_ID;
}
@Override
public SmsManager getSmsManager() {
return SmsManager.getDefault();
}
@Override
public int getDefaultSmsSubscriptionId() {
Assert.fail("PhoneUtils.getDefaultSmsSubscriptionId(): not supported before L MR1");
return ParticipantData.DEFAULT_SELF_SUB_ID;
}
@Override
public boolean getHasPreferredSmsSim() {
// SIM selection is not supported pre-L_MR1.
return true;
}
@Override
public int getActiveSubscriptionCount() {
return hasSim() ? 1 : 0;
}
@Override
public int getEffectiveIncomingSubIdFromSystem(Intent intent, String extraName) {
// Pre-L_MR1 always returns the default id
return ParticipantData.DEFAULT_SELF_SUB_ID;
}
@Override
public int getSubIdFromTelephony(Cursor cursor, int subIdIndex) {
// No subscription_id column before L_MR1
return ParticipantData.DEFAULT_SELF_SUB_ID;
}
@Override
@SuppressWarnings("deprecation")
public boolean isDataRoamingEnabled() {
if (BuildCompat.isAtLeastT()) {
return mTelephonyManager.isDataRoamingEnabled();
}
boolean dataRoamingEnabled = false;
final ContentResolver cr = mContext.getContentResolver();
if (OsUtil.isAtLeastJB_MR1()) {
dataRoamingEnabled =
(Settings.Global.getInt(cr, Settings.Global.DATA_ROAMING, 0) != 0);
} else {
dataRoamingEnabled =
(Settings.System.getInt(cr, Settings.System.DATA_ROAMING, 0) != 0);
}
return dataRoamingEnabled;
}
@Override
public boolean isMobileDataEnabled() {
boolean mobileDataEnabled = false;
try {
final Class cmClass = mConnectivityManager.getClass();
final Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
method.setAccessible(true); // Make the method callable
// get the setting for "mobile data"
mobileDataEnabled = (Boolean) method.invoke(mConnectivityManager);
} catch (final Exception e) {
LogUtil.e(TAG, "PhoneUtil.isMobileDataEnabled: system api not found", e);
}
return mobileDataEnabled;
}
@Override
public HashSet<String> getNormalizedSelfNumbers() {
final HashSet<String> numbers = new HashSet<>();
numbers.add(getCanonicalForSelf(true/*allowOverride*/));
return numbers;
}
}
/**
* The PhoneUtils class for L_MR1
*/
public static class PhoneUtilsLMR1 extends PhoneUtils implements LMr1 {
private final SubscriptionManager mSubscriptionManager;
public PhoneUtilsLMR1(final int subId) {
super(subId);
mSubscriptionManager = SubscriptionManager.from(Factory.get().getApplicationContext());
}
@Override
public String getSimCountry() {
final SubscriptionInfo subInfo = getActiveSubscriptionInfo();
if (subInfo != null) {
final String country = subInfo.getCountryIso();
if (TextUtils.isEmpty(country)) {
return null;
}
return country.toUpperCase();
}
return null;
}
@Override
public int getSimSlotCount() {
return mSubscriptionManager.getActiveSubscriptionInfoCountMax();
}
@Override
public String getCarrierName() {
final SubscriptionInfo subInfo = getActiveSubscriptionInfo();
if (subInfo != null) {
final CharSequence displayName = subInfo.getDisplayName();
if (!TextUtils.isEmpty(displayName)) {
return displayName.toString();
}
final CharSequence carrierName = subInfo.getCarrierName();
if (carrierName != null) {
return carrierName.toString();
}
}
return null;
}
@Override
public boolean hasSim() {
return mSubscriptionManager.getActiveSubscriptionInfoCount() > 0;
}
@Override
public boolean isRoaming() {
return mSubscriptionManager.isNetworkRoaming(mSubId);
}
@Override
public int[] getMccMnc() {
int mcc = 0;
int mnc = 0;
final SubscriptionInfo subInfo = getActiveSubscriptionInfo();
if (subInfo != null) {
mcc = subInfo.getMcc();
mnc = subInfo.getMnc();
}
return new int[]{mcc, mnc};
}
@Override
public String getSimOperatorNumeric() {
// For L_MR1 we return the canonicalized (xxxxxx) string
return getMccMncString(getMccMnc());
}
@Override
public String getSelfRawNumber(final boolean allowOverride) {
if (allowOverride) {
final String userDefinedNumber = getNumberFromPrefs(mContext, mSubId);
if (!TextUtils.isEmpty(userDefinedNumber)) {
return userDefinedNumber;
}
}
final SubscriptionInfo subInfo = getActiveSubscriptionInfo();
if (subInfo != null) {
String phoneNumber = subInfo.getNumber();
if (TextUtils.isEmpty(phoneNumber) && LogUtil.isLoggable(TAG, LogUtil.DEBUG)) {
LogUtil.d(TAG, "SubscriptionInfo phone number for self is empty!");
}
return phoneNumber;
}
LogUtil.w(TAG, "PhoneUtils.getSelfRawNumber: subInfo is null for " + mSubId);
throw new IllegalStateException("No active subscription");
}
@Override
public SubscriptionInfo getActiveSubscriptionInfo() {
try {
final SubscriptionInfo subInfo =
mSubscriptionManager.getActiveSubscriptionInfo(mSubId);
if (subInfo == null) {
if (LogUtil.isLoggable(TAG, LogUtil.DEBUG)) {
// This is possible if the sub id is no longer available.
LogUtil.d(TAG, "PhoneUtils.getActiveSubscriptionInfo(): empty sub info for "
+ mSubId);
}
}
return subInfo;
} catch (Exception e) {
LogUtil.e(TAG, "PhoneUtils.getActiveSubscriptionInfo: system exception for "
+ mSubId, e);
}
return null;
}
@Override
public List<SubscriptionInfo> getActiveSubscriptionInfoList() {
final List<SubscriptionInfo> subscriptionInfos =
mSubscriptionManager.getActiveSubscriptionInfoList();
if (subscriptionInfos != null) {
return subscriptionInfos;
}
return EMPTY_SUBSCRIPTION_LIST;
}
@Override
public int getEffectiveSubId(int subId) {
if (subId == ParticipantData.DEFAULT_SELF_SUB_ID) {
return getDefaultSmsSubscriptionId();
}
return subId;
}
@Override
public void registerOnSubscriptionsChangedListener(
SubscriptionManager.OnSubscriptionsChangedListener listener) {
mSubscriptionManager.addOnSubscriptionsChangedListener(listener);
}
@Override
public SmsManager getSmsManager() {
return SmsManager.getSmsManagerForSubscriptionId(mSubId);
}
@Override
public int getDefaultSmsSubscriptionId() {
final int systemDefaultSubId = SmsManager.getDefaultSmsSubscriptionId();
if (systemDefaultSubId < 0) {
// Always use -1 for any negative subId from system
return ParticipantData.DEFAULT_SELF_SUB_ID;
}
return systemDefaultSubId;
}
@Override
public boolean getHasPreferredSmsSim() {
return getDefaultSmsSubscriptionId() != ParticipantData.DEFAULT_SELF_SUB_ID;
}
@Override
public int getActiveSubscriptionCount() {
return mSubscriptionManager.getActiveSubscriptionInfoCount();
}
@Override
public int getEffectiveIncomingSubIdFromSystem(Intent intent, String extraName) {
return getEffectiveIncomingSubIdFromSystem(intent.getIntExtra(extraName,
ParticipantData.DEFAULT_SELF_SUB_ID));
}
private int getEffectiveIncomingSubIdFromSystem(int subId) {
if (subId < 0) {
if (mSubscriptionManager.getActiveSubscriptionInfoCount() > 1) {
// For multi-SIM device, we can not decide which SIM to use if system
// does not know either. So just make it the invalid sub id.
return ParticipantData.DEFAULT_SELF_SUB_ID;
}
// For single-SIM device, it must come from the only SIM we have
return getDefaultSmsSubscriptionId();
}
return subId;
}
@Override
public int getSubIdFromTelephony(Cursor cursor, int subIdIndex) {
return getEffectiveIncomingSubIdFromSystem(cursor.getInt(subIdIndex));
}
@Override
public boolean isDataRoamingEnabled() {
final SubscriptionInfo subInfo = getActiveSubscriptionInfo();
public SubscriptionInfo getActiveSubscriptionInfo() {
try {
final SubscriptionInfo subInfo =
mSubscriptionManager.getActiveSubscriptionInfo(mSubId);
if (subInfo == null) {
// There is nothing we can do if system give us empty sub info
LogUtil.e(TAG, "PhoneUtils.isDataRoamingEnabled: system return empty sub info for "
+ mSubId);
return false;
if (LogUtil.isLoggable(TAG, LogUtil.DEBUG)) {
// This is possible if the sub id is no longer available.
LogUtil.d(TAG, "PhoneUtils.getActiveSubscriptionInfo(): empty sub info for "
+ mSubId);
}
}
return subInfo.getDataRoaming() != SubscriptionManager.DATA_ROAMING_DISABLE;
return subInfo;
} catch (Exception e) {
LogUtil.e(TAG, "PhoneUtils.getActiveSubscriptionInfo: system exception for "
+ mSubId, e);
}
return null;
}
@Override
public boolean isMobileDataEnabled() {
boolean mobileDataEnabled = false;
try {
final Class cmClass = mTelephonyManager.getClass();
final Method method = cmClass.getDeclaredMethod("getDataEnabled", Integer.TYPE);
method.setAccessible(true); // Make the method callable
// get the setting for "mobile data"
mobileDataEnabled = (Boolean) method.invoke(
mTelephonyManager, Integer.valueOf(mSubId));
} catch (final Exception e) {
LogUtil.e(TAG, "PhoneUtil.isMobileDataEnabled: system api not found", e);
}
return mobileDataEnabled;
/**
* Get the list of active SIMs in system. Only applies to L_MR1 above
*
* @return the list of subscription info for all inserted SIMs
*/
public List<SubscriptionInfo> getActiveSubscriptionInfoList() {
final List<SubscriptionInfo> subscriptionInfos =
mSubscriptionManager.getActiveSubscriptionInfoList();
if (subscriptionInfos != null) {
return subscriptionInfos;
}
return EMPTY_SUBSCRIPTION_LIST;
}
@Override
public HashSet<String> getNormalizedSelfNumbers() {
final HashSet<String> numbers = new HashSet<>();
for (SubscriptionInfo info : getActiveSubscriptionInfoList()) {
numbers.add(PhoneUtils.get(info.getSubscriptionId()).getCanonicalForSelf(
true/*allowOverride*/));
}
return numbers;
}
/**
* Register subscription change listener. Only applies to L_MR1 above
*
* @param listener The listener to register
*/
public void registerOnSubscriptionsChangedListener(
SubscriptionManager.OnSubscriptionsChangedListener listener) {
mSubscriptionManager.addOnSubscriptionsChangedListener(listener);
}
/**
@@ -659,15 +421,6 @@ public abstract class PhoneUtils {
return Factory.get().getPhoneUtils(subId);
}
public LMr1 toLMr1() {
if (OsUtil.isAtLeastL_MR1()) {
return (LMr1) this;
} else {
Assert.fail("PhoneUtils.toLMr1(): invalid OS version");
return null;
}
}
/**
* Check if this device supports SMS
*
@@ -897,12 +650,9 @@ public abstract class PhoneUtils {
* - On JB (and below) this always returns true, since the setting was added in KLP.
*/
public boolean isDefaultSmsApp() {
if (OsUtil.isAtLeastKLP()) {
RoleManager roleManager = mContext.getSystemService(RoleManager.class);
return roleManager.isRoleAvailable(RoleManager.ROLE_SMS)
&& roleManager.isRoleHeld(RoleManager.ROLE_SMS);
}
return true;
RoleManager roleManager = mContext.getSystemService(RoleManager.class);
return roleManager.isRoleAvailable(RoleManager.ROLE_SMS)
&& roleManager.isRoleHeld(RoleManager.ROLE_SMS);
}
/**
@@ -911,10 +661,7 @@ public abstract class PhoneUtils {
* @return the package name of default SMS app
*/
public String getDefaultSmsApp() {
if (OsUtil.isAtLeastKLP()) {
return Telephony.Sms.getDefaultSmsPackage(mContext);
}
return null;
return Telephony.Sms.getDefaultSmsPackage(mContext);
}
/**
@@ -931,15 +678,14 @@ public abstract class PhoneUtils {
* an error or there is no default app (e.g. JB and below).
*/
public String getDefaultSmsAppLabel() {
if (OsUtil.isAtLeastKLP()) {
final String packageName = Telephony.Sms.getDefaultSmsPackage(mContext);
final PackageManager pm = mContext.getPackageManager();
try {
final ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0);
return pm.getApplicationLabel(appInfo).toString();
} catch (NameNotFoundException e) {
// Fall through and return empty string
}
final String packageName = Telephony.Sms.getDefaultSmsPackage(mContext);
final PackageManager pm = mContext.getPackageManager();
try {
final ApplicationInfo appInfo = pm.getApplicationInfo(packageName,
ApplicationInfoFlags.of(0));
return pm.getApplicationLabel(appInfo).toString();
} catch (NameNotFoundException e) {
// Fall through and return empty string
}
return "";
}
@@ -949,15 +695,9 @@ public abstract class PhoneUtils {
*
* @return true if enabled.
*/
@SuppressWarnings("deprecation")
public boolean isAirplaneModeOn() {
if (OsUtil.isAtLeastJB_MR1()) {
return Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
} else {
return Settings.System.getInt(mContext.getContentResolver(),
Settings.System.AIRPLANE_MODE_ON, 0) != 0;
}
return Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
}
public static String getMccMncString(int[] mccmnc) {
@@ -995,14 +735,10 @@ public abstract class PhoneUtils {
* @param runnable a {@link SubscriptionRunnable} for performing work on each subscription.
*/
public static void forEachActiveSubscription(final SubscriptionRunnable runnable) {
if (OsUtil.isAtLeastL_MR1()) {
final List<SubscriptionInfo> subscriptionList =
getDefault().toLMr1().getActiveSubscriptionInfoList();
for (final SubscriptionInfo subscriptionInfo : subscriptionList) {
runnable.runForSubscription(subscriptionInfo.getSubscriptionId());
}
} else {
runnable.runForSubscription(ParticipantData.DEFAULT_SELF_SUB_ID);
final List<SubscriptionInfo> subscriptionList =
getDefault().getActiveSubscriptionInfoList();
for (final SubscriptionInfo subscriptionInfo : subscriptionList) {
runnable.runForSubscription(subscriptionInfo.getSubscriptionId());
}
}
+2 -13
View File
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,20 +17,10 @@
package com.android.messaging.util;
import android.annotation.TargetApi;
import android.os.Build;
/**
* Helper class for systrace (see http://developer.android.com/tools/help/systrace.html).<p>
* To enable, set log.tag.Bugle_Trace (defined by {@link #TAG} to VERBOSE before
* the process starts.<p>
* Note that this will run only on JBMR2 or later; on earlier platforms or if the log
* tag isn't set, calls to {@link #beginSection(String)} or {@link #endSection()} are no-ops. <p>
* Internally, calls dispatch to either a class that actually does work or a class that doesn't.
* This avoids Dalvik complaining when it loads the class on earlier platforms that the
* opcodes aren't available, and, according to the Dalvik team, using vtable dispatching for
* something like this should be faster than if (OsUtil.isAtLeast...()) on each call.
*/
public final class Trace {
private static final String TAG = "Bugle_Trace";
@@ -44,8 +35,7 @@ public final class Trace {
static {
// Use android.util.Log instead of LogUtil here to avoid pulling in Gservices
// too early in app startup.
if (OsUtil.isAtLeastJB_MR2() &&
android.util.Log.isLoggable(TAG, android.util.Log.VERBOSE)) {
if (android.util.Log.isLoggable(TAG, android.util.Log.VERBOSE)) {
sTrace = new TraceJBMR2();
} else {
sTrace = new TraceShim();
@@ -87,7 +77,6 @@ public final class Trace {
/**
* Internal class that we use if we really did enable tracing.
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
private static final class TraceJBMR2 extends AbstractTrace {
@Override
void beginSection(String sectionName) {
+9 -18
View File
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -261,16 +262,14 @@ public class UiUtils {
}
public static void setStatusBarColor(final Activity activity, final int color) {
if (OsUtil.isAtLeastL()) {
// To achieve the appearance of an 80% opacity blend against a black background,
// each color channel is reduced in value by 20%.
final int blendedRed = (int) Math.floor(0.8 * Color.red(color));
final int blendedGreen = (int) Math.floor(0.8 * Color.green(color));
final int blendedBlue = (int) Math.floor(0.8 * Color.blue(color));
// To achieve the appearance of an 80% opacity blend against a black background,
// each color channel is reduced in value by 20%.
final int blendedRed = (int) Math.floor(0.8 * Color.red(color));
final int blendedGreen = (int) Math.floor(0.8 * Color.green(color));
final int blendedBlue = (int) Math.floor(0.8 * Color.blue(color));
activity.getWindow().setStatusBarColor(
Color.rgb(blendedRed, blendedGreen, blendedBlue));
}
activity.getWindow().setStatusBarColor(
Color.rgb(blendedRed, blendedGreen, blendedBlue));
}
public static void lockOrientation(final Activity activity) {
@@ -301,16 +300,8 @@ public class UiUtils {
activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}
public static int getPaddingStart(final View view) {
return OsUtil.isAtLeastJB_MR1() ? view.getPaddingStart() : view.getPaddingLeft();
}
public static int getPaddingEnd(final View view) {
return OsUtil.isAtLeastJB_MR1() ? view.getPaddingEnd() : view.getPaddingRight();
}
public static boolean isRtlMode() {
return OsUtil.isAtLeastJB_MR2() && Factory.get().getApplicationContext().getResources()
return Factory.get().getApplicationContext().getResources()
.getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
}
@@ -36,7 +36,6 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider {
public static final int SIZE_LARGE = 0; // undefined == 0, which is the default, large
public static final int SIZE_SMALL = 1;
public static final int SIZE_MEDIUM = 2;
public static final int SIZE_PRE_JB = 3;
/**
* Update all widgets in the list
@@ -43,7 +43,6 @@ import com.android.messaging.ui.conversationlist.ConversationListItemView;
import com.android.messaging.util.ContentType;
import com.android.messaging.util.Dates;
import com.android.messaging.util.LogUtil;
import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PhoneUtils;
public class WidgetConversationListService extends RemoteViewsService {
@@ -128,19 +127,15 @@ public class WidgetConversationListService extends RemoteViewsService {
// Avatar
boolean includeAvatar;
if (OsUtil.isAtLeastJB()) {
final Bundle options = mAppWidgetManager.getAppWidgetOptions(mAppWidgetId);
if (LogUtil.isLoggable(TAG, LogUtil.VERBOSE)) {
LogUtil.v(TAG, "getViewAt BugleWidgetProvider.WIDGET_SIZE_KEY: " +
options.getInt(BugleWidgetProvider.WIDGET_SIZE_KEY));
}
includeAvatar = options.getInt(BugleWidgetProvider.WIDGET_SIZE_KEY) ==
BugleWidgetProvider.SIZE_LARGE;
} else {
includeAvatar = true;;
final Bundle options = mAppWidgetManager.getAppWidgetOptions(mAppWidgetId);
if (LogUtil.isLoggable(TAG, LogUtil.VERBOSE)) {
LogUtil.v(TAG, "getViewAt BugleWidgetProvider.WIDGET_SIZE_KEY: " +
options.getInt(BugleWidgetProvider.WIDGET_SIZE_KEY));
}
includeAvatar = options.getInt(BugleWidgetProvider.WIDGET_SIZE_KEY) ==
BugleWidgetProvider.SIZE_LARGE;
// Show the avatar when grande size, otherwise hide it.
remoteViews.setViewVisibility(R.id.avatarView, includeAvatar ?
View.VISIBLE : View.GONE);
@@ -179,9 +179,7 @@ public class WidgetConversationService extends RemoteViewsService {
if (message.hasAttachments()) {
final List<MessagePartData> attachments = message.getAttachments();
for (MessagePartData part : attachments) {
final boolean videoWithThumbnail = part.isVideo()
&& (VideoThumbnailRequest.shouldShowIncomingVideoThumbnails()
|| !message.getIsIncoming());
final boolean videoWithThumbnail = part.isVideo();
if (part.isImage() || videoWithThumbnail) {
final Uri uri = part.getContentUri();
remoteViews.setViewVisibility(R.id.attachmentFrame, View.VISIBLE);
@@ -215,20 +213,15 @@ public class WidgetConversationService extends RemoteViewsService {
intent);
// Avatar
boolean includeAvatar;
if (OsUtil.isAtLeastJB()) {
final Bundle options = mAppWidgetManager.getAppWidgetOptions(mAppWidgetId);
if (LogUtil.isLoggable(TAG, LogUtil.VERBOSE)) {
LogUtil.v(TAG, "getViewAt BugleWidgetProvider.WIDGET_SIZE_KEY: " +
options.getInt(BugleWidgetProvider.WIDGET_SIZE_KEY));
}
includeAvatar = options.getInt(BugleWidgetProvider.WIDGET_SIZE_KEY)
== BugleWidgetProvider.SIZE_LARGE;
} else {
includeAvatar = true;
final Bundle options = mAppWidgetManager.getAppWidgetOptions(mAppWidgetId);
if (LogUtil.isLoggable(TAG, LogUtil.VERBOSE)) {
LogUtil.v(TAG, "getViewAt BugleWidgetProvider.WIDGET_SIZE_KEY: " +
options.getInt(BugleWidgetProvider.WIDGET_SIZE_KEY));
}
boolean includeAvatar = options.getInt(BugleWidgetProvider.WIDGET_SIZE_KEY)
== BugleWidgetProvider.SIZE_LARGE;
// Show the avatar (and shadow) when grande size, otherwise hide it.
remoteViews.setViewVisibility(R.id.avatarView, includeAvatar ?
View.VISIBLE : View.GONE);