Messaging: Language cleanup

No unnecessary boxing, enhanced for loops, redundant checks and throws,
imports (removal, reordering), possible void returns

Change-Id: I7a8e1b2007e3b0906e01b41785c518d02c2f3fab
This commit is contained in:
Michael W
2024-12-26 15:54:37 +01:00
parent e335f6bec8
commit e128bff457
77 changed files with 202 additions and 334 deletions
+3 -3
View File
@@ -153,9 +153,9 @@ public class Base64 {
byte[] groomedData = new byte[data.length]; byte[] groomedData = new byte[data.length];
int bytesCopied = 0; int bytesCopied = 0;
for (int i = 0; i < data.length; i++) { for (byte datum : data) {
if (isBase64(data[i])) { if (isBase64(datum)) {
groomedData[bytesCopied++] = data[i]; groomedData[bytesCopied++] = datum;
} }
} }
@@ -628,8 +628,8 @@ public class PduHeaders {
} }
ArrayList<EncodedStringValue> list = new ArrayList<>(); ArrayList<EncodedStringValue> list = new ArrayList<>();
for (int i = 0; i < value.length; i++) { for (EncodedStringValue encodedStringValue : value) {
list.add(value[i]); list.add(encodedStringValue);
} }
mHeaderMap.put(field, list); mHeaderMap.put(field, list);
} }
@@ -165,16 +165,14 @@ public class BugleApplication extends Application implements UncaughtExceptionHa
// Start method tracing with a big enough buffer and let it run for 30s. // Start method tracing with a big enough buffer and let it run for 30s.
// Note we use a logging tag as we don't want to wait for gservices to start up. // Note we use a logging tag as we don't want to wait for gservices to start up.
final File file = DebugUtils.getDebugFile("startup.trace", true); final File file = DebugUtils.getDebugFile("startup.trace", true);
if (file != null) { android.os.Debug.startMethodTracing(file.getAbsolutePath(), 160 * 1024 * 1024);
android.os.Debug.startMethodTracing(file.getAbsolutePath(), 160 * 1024 * 1024); new Handler(Looper.getMainLooper()).postDelayed(() -> {
new Handler(Looper.getMainLooper()).postDelayed(() -> { android.os.Debug.stopMethodTracing();
android.os.Debug.stopMethodTracing(); // Allow world to see trace file
// Allow world to see trace file DebugUtils.ensureReadable(file);
DebugUtils.ensureReadable(file); LogUtil.d(LogUtil.PROFILE_TAG, "Tracing complete - "
LogUtil.d(LogUtil.PROFILE_TAG, "Tracing complete - " + file.getAbsolutePath());
+ file.getAbsolutePath());
}, 30000); }, 30000);
}
} }
} }
@@ -24,9 +24,10 @@ import android.database.sqlite.SQLiteDoneException;
import android.database.sqlite.SQLiteStatement; import android.database.sqlite.SQLiteStatement;
import android.net.Uri; import android.net.Uri;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.text.TextUtils;
import androidx.collection.ArrayMap; import androidx.collection.ArrayMap;
import androidx.collection.SimpleArrayMap; import androidx.collection.SimpleArrayMap;
import android.text.TextUtils;
import com.android.messaging.Factory; import com.android.messaging.Factory;
import com.android.messaging.datamodel.DatabaseHelper.ConversationColumns; import com.android.messaging.datamodel.DatabaseHelper.ConversationColumns;
@@ -55,6 +56,7 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -35,17 +35,18 @@ import android.os.Bundle;
import android.os.SystemClock; import android.os.SystemClock;
import android.provider.ContactsContract; import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Contacts;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationCompat.WearableExtender;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.app.RemoteInput;
import androidx.collection.SimpleArrayMap;
import android.text.Spannable; import android.text.Spannable;
import android.text.SpannableStringBuilder; import android.text.SpannableStringBuilder;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.style.StyleSpan; import android.text.style.StyleSpan;
import android.text.style.TextAppearanceSpan; import android.text.style.TextAppearanceSpan;
import androidx.collection.SimpleArrayMap;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationCompat.WearableExtender;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.app.RemoteInput;
import com.android.messaging.Factory; import com.android.messaging.Factory;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.datamodel.MessageNotificationState.BundledMessageNotificationState; import com.android.messaging.datamodel.MessageNotificationState.BundledMessageNotificationState;
@@ -55,14 +56,12 @@ import com.android.messaging.datamodel.MessageNotificationState.MultiMessageNoti
import com.android.messaging.datamodel.action.MarkAsReadAction; import com.android.messaging.datamodel.action.MarkAsReadAction;
import com.android.messaging.datamodel.action.MarkAsSeenAction; import com.android.messaging.datamodel.action.MarkAsSeenAction;
import com.android.messaging.datamodel.action.RedownloadMmsAction; import com.android.messaging.datamodel.action.RedownloadMmsAction;
import com.android.messaging.datamodel.data.ConversationListItemData;
import com.android.messaging.datamodel.media.AvatarRequestDescriptor; import com.android.messaging.datamodel.media.AvatarRequestDescriptor;
import com.android.messaging.datamodel.media.ImageResource; import com.android.messaging.datamodel.media.ImageResource;
import com.android.messaging.datamodel.media.MediaRequest; import com.android.messaging.datamodel.media.MediaRequest;
import com.android.messaging.datamodel.media.MediaResourceManager; import com.android.messaging.datamodel.media.MediaResourceManager;
import com.android.messaging.datamodel.media.MessagePartVideoThumbnailRequestDescriptor; import com.android.messaging.datamodel.media.MessagePartVideoThumbnailRequestDescriptor;
import com.android.messaging.datamodel.media.UriImageRequestDescriptor; import com.android.messaging.datamodel.media.UriImageRequestDescriptor;
import com.android.messaging.datamodel.media.VideoThumbnailRequest;
import com.android.messaging.sms.MmsSmsUtils; import com.android.messaging.sms.MmsSmsUtils;
import com.android.messaging.sms.MmsUtils; import com.android.messaging.sms.MmsUtils;
import com.android.messaging.ui.UIIntents; import com.android.messaging.ui.UIIntents;
@@ -78,7 +77,6 @@ import com.android.messaging.util.LogUtil;
import com.android.messaging.util.NotificationPlayer; import com.android.messaging.util.NotificationPlayer;
import com.android.messaging.util.NotificationsUtil; import com.android.messaging.util.NotificationsUtil;
import com.android.messaging.util.PendingIntentConstants; import com.android.messaging.util.PendingIntentConstants;
import com.android.messaging.util.PhoneUtils;
import com.android.messaging.util.ThreadUtil; import com.android.messaging.util.ThreadUtil;
import com.android.messaging.util.UriUtil; import com.android.messaging.util.UriUtil;
@@ -632,9 +630,7 @@ public class BugleNotifications {
} }
synchronized (sPendingNotifications) { synchronized (sPendingNotifications) {
if (sPendingNotifications.contains(notificationState)) { sPendingNotifications.remove(notificationState);
sPendingNotifications.remove(notificationState);
}
} }
notificationState.mNotificationBuilder notificationState.mNotificationBuilder
@@ -662,11 +658,10 @@ public class BugleNotifications {
Bitmap attachmentBitmap = null; Bitmap attachmentBitmap = null;
// For messages with photo/video attachment, request an image to show in the notification. // For messages with photo/video attachment, request an image to show in the notification.
if (attachmentUri != null && notificationState.mNotificationStyle != null && if (attachmentUri != null && (notificationState.mNotificationStyle instanceof
(notificationState.mNotificationStyle instanceof NotificationCompat.BigPictureStyle) &&
NotificationCompat.BigPictureStyle) && (ContentType.isImageType(attachmentType) ||
(ContentType.isImageType(attachmentType) || ContentType.isVideoType(attachmentType))) {
ContentType.isVideoType(attachmentType))) {
final boolean isVideo = ContentType.isVideoType(attachmentType); final boolean isVideo = ContentType.isVideoType(attachmentType);
MediaRequest<ImageResource> imageRequest; MediaRequest<ImageResource> imageRequest;
@@ -32,12 +32,6 @@ import com.android.messaging.util.Assert;
import com.android.messaging.util.Assert.DoesNotRunOnMainThread; import com.android.messaging.util.Assert.DoesNotRunOnMainThread;
import com.android.messaging.util.LogUtil; import com.android.messaging.util.LogUtil;
/**
* TODO: Open Issues:
* - Should we be storing the draft messages in the regular messages table or should we have a
* separate table for drafts to keep the normal messages query as simple as possible?
*/
/** /**
* Allows access to the SQL database. This is package private. * Allows access to the SQL database. This is package private.
*/ */
@@ -57,7 +57,7 @@ public class DatabaseWrapper {
// track transaction on a per thread basis // track transaction on a per thread basis
private static final ThreadLocal<Stack<TransactionData>> sTransactionDepth = private static final ThreadLocal<Stack<TransactionData>> sTransactionDepth =
ThreadLocal.withInitial(() -> new Stack<>()); ThreadLocal.withInitial(Stack::new);
private static final String[] sFormatStrings = new String[] { private static final String[] sFormatStrings = new String[] {
"took %d ms to %s", "took %d ms to %s",
@@ -25,7 +25,6 @@ import com.android.messaging.util.Assert;
import com.android.messaging.util.ContactUtil; import com.android.messaging.util.ContactUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
/** /**
* A cursor builder that takes the frequent contacts cursor and aggregate it with the all contacts * A cursor builder that takes the frequent contacts cursor and aggregate it with the all contacts
@@ -45,20 +44,16 @@ public class FrequentContactsCursorBuilder {
/** /**
* Sets the frequent contacts cursor as soon as it is loaded, or null if it's reset. * Sets the frequent contacts cursor as soon as it is loaded, or null if it's reset.
* @return this builder instance for chained operations
*/ */
public FrequentContactsCursorBuilder setFrequents(final Cursor frequentContactsCursor) { public void setFrequents(final Cursor frequentContactsCursor) {
mFrequentContactsCursor = frequentContactsCursor; mFrequentContactsCursor = frequentContactsCursor;
return this;
} }
/** /**
* Sets the all contacts cursor as soon as it is loaded, or null if it's reset. * Sets the all contacts cursor as soon as it is loaded, or null if it's reset.
* @return this builder instance for chained operations
*/ */
public FrequentContactsCursorBuilder setAllContacts(final Cursor allContactsCursor) { public void setAllContacts(final Cursor allContactsCursor) {
mAllContactsCursor = allContactsCursor; mAllContactsCursor = allContactsCursor;
return this;
} }
/** /**
@@ -153,7 +148,7 @@ public class FrequentContactsCursorBuilder {
// Now we have a list of rows containing frequent contacts in alphabetical order. // Now we have a list of rows containing frequent contacts in alphabetical order.
// Therefore, sort all the rows according to their actual ranks in the frequents list. // Therefore, sort all the rows according to their actual ranks in the frequents list.
Collections.sort(rows, (lhs, rhs) -> { rows.sort((lhs, rhs) -> {
final String lookupKeyLhs = (String) lhs[ContactUtil.INDEX_LOOKUP_KEY]; final String lookupKeyLhs = (String) lhs[ContactUtil.INDEX_LOOKUP_KEY];
final String lookupKeyRhs = (String) rhs[ContactUtil.INDEX_LOOKUP_KEY]; final String lookupKeyRhs = (String) rhs[ContactUtil.INDEX_LOOKUP_KEY];
Assert.isTrue(lookupKeyToRankMap.containsKey(lookupKeyLhs) && Assert.isTrue(lookupKeyToRankMap.containsKey(lookupKeyLhs) &&
@@ -179,8 +174,7 @@ public class FrequentContactsCursorBuilder {
return 1; return 1;
} else { } else {
// Use the default sort order, i.e. sort by phoneType value. // Use the default sort order, i.e. sort by phoneType value.
return phoneTypeLhs < phoneTypeRhs ? -1 : return Integer.compare(phoneTypeLhs, phoneTypeRhs);
(phoneTypeLhs == phoneTypeRhs ? 0 : 1);
} }
} }
}); });
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -52,7 +53,7 @@ public class FrequentContactsCursorQueryData extends CursorQueryData {
private abstract class StrequentContactsQueryStrategy implements Strategy<Void, Cursor> { private abstract class StrequentContactsQueryStrategy implements Strategy<Void, Cursor> {
@Override @Override
public Cursor execute(Void params) throws Exception { public Cursor execute(Void params) {
final Uri uri = getUri(); final Uri uri = getUri();
if (uri != null) { if (uri != null) {
setUri(uri); setUri(uri);
@@ -23,10 +23,6 @@ import android.content.res.Resources;
import android.database.Cursor; import android.database.Cursor;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.net.Uri; import android.net.Uri;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationCompat.Builder;
import androidx.core.app.NotificationCompat.WearableExtender;
import androidx.core.app.NotificationManagerCompat;
import android.text.Html; import android.text.Html;
import android.text.Spannable; import android.text.Spannable;
import android.text.SpannableString; import android.text.SpannableString;
@@ -38,6 +34,11 @@ import android.text.style.StyleSpan;
import android.text.style.TextAppearanceSpan; import android.text.style.TextAppearanceSpan;
import android.text.style.URLSpan; import android.text.style.URLSpan;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationCompat.Builder;
import androidx.core.app.NotificationCompat.WearableExtender;
import androidx.core.app.NotificationManagerCompat;
import com.android.messaging.Factory; import com.android.messaging.Factory;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.datamodel.data.ConversationListItemData; import com.android.messaging.datamodel.data.ConversationListItemData;
@@ -46,7 +47,6 @@ import com.android.messaging.datamodel.data.ConversationParticipantsData;
import com.android.messaging.datamodel.data.MessageData; import com.android.messaging.datamodel.data.MessageData;
import com.android.messaging.datamodel.data.MessagePartData; import com.android.messaging.datamodel.data.MessagePartData;
import com.android.messaging.datamodel.data.ParticipantData; import com.android.messaging.datamodel.data.ParticipantData;
import com.android.messaging.datamodel.media.VideoThumbnailRequest;
import com.android.messaging.sms.MmsUtils; import com.android.messaging.sms.MmsUtils;
import com.android.messaging.ui.UIIntents; import com.android.messaging.ui.UIIntents;
import com.android.messaging.util.Assert; import com.android.messaging.util.Assert;
@@ -635,9 +635,7 @@ public abstract class MessageNotificationState extends NotificationState {
continue; continue;
} }
final int currentCount = firstNames.containsKey(firstName) final int currentCount = firstNames.getOrDefault(firstName, 0);
? firstNames.get(firstName)
: 0;
firstNames.put(firstName, currentCount + 1); firstNames.put(firstName, currentCount + 1);
} }
return firstNames; return firstNames;
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -18,7 +19,6 @@ package com.android.messaging.datamodel;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.text.TextUtils;
import com.android.messaging.Factory; import com.android.messaging.Factory;
import com.android.messaging.util.LogUtil; import com.android.messaging.util.LogUtil;
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -18,7 +19,6 @@ package com.android.messaging.datamodel;
import android.app.IntentService; import android.app.IntentService;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import androidx.core.app.RemoteInput; import androidx.core.app.RemoteInput;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
@@ -106,17 +106,13 @@ public class BackgroundWorkerService extends JobIntentService {
protected void onHandleWork(@NonNull final Intent intent) { protected void onHandleWork(@NonNull final Intent intent) {
final int opcode = intent.getIntExtra(EXTRA_OP_CODE, 0); final int opcode = intent.getIntExtra(EXTRA_OP_CODE, 0);
switch(opcode) { if (opcode == OP_PROCESS_REQUEST) {
case OP_PROCESS_REQUEST: { final Action action = intent.getParcelableExtra(EXTRA_ACTION);
final Action action = intent.getParcelableExtra(EXTRA_ACTION); final int attempt = intent.getIntExtra(EXTRA_ATTEMPT, -1);
final int attempt = intent.getIntExtra(EXTRA_ATTEMPT, -1); doBackgroundWork(action, attempt);
doBackgroundWork(action, attempt); } else {
break; LogUtil.w(TAG, "Unrecognized opcode in BackgroundWorkerService " + opcode);
} throw new RuntimeException("Unrecognized opcode in BackgroundWorkerService");
default:
LogUtil.w(TAG, "Unrecognized opcode in BackgroundWorkerService " + opcode);
throw new RuntimeException("Unrecognized opcode in BackgroundWorkerService");
} }
} }
@@ -30,7 +30,6 @@ import com.android.messaging.datamodel.BugleDatabaseOperations;
import com.android.messaging.datamodel.DataModel; import com.android.messaging.datamodel.DataModel;
import com.android.messaging.datamodel.DataModelImpl; import com.android.messaging.datamodel.DataModelImpl;
import com.android.messaging.datamodel.DatabaseHelper; import com.android.messaging.datamodel.DatabaseHelper;
import com.android.messaging.datamodel.DatabaseHelper.MessageColumns;
import com.android.messaging.datamodel.DatabaseWrapper; import com.android.messaging.datamodel.DatabaseWrapper;
import com.android.messaging.datamodel.MessagingContentProvider; import com.android.messaging.datamodel.MessagingContentProvider;
import com.android.messaging.datamodel.data.MessageData; import com.android.messaging.datamodel.data.MessageData;
@@ -43,9 +42,6 @@ import com.android.messaging.util.ConnectivityUtil.ConnectivityListener;
import com.android.messaging.util.LogUtil; import com.android.messaging.util.LogUtil;
import com.android.messaging.util.PhoneUtils; import com.android.messaging.util.PhoneUtils;
import java.util.HashSet;
import java.util.Set;
/** /**
* Action used to lookup any messages in the pending send/download state and either fail them or * Action used to lookup any messages in the pending send/download state and either fail them or
* retry their action based on subscriptions. This action only initiates one retry at a time for * retry their action based on subscriptions. This action only initiates one retry at a time for
@@ -106,11 +106,7 @@ public class SyncMessagesAction extends Action implements Parcelable {
* sending/receiving). * sending/receiving).
*/ */
public static void immediateSync() { public static void immediateSync() {
final long now = System.currentTimeMillis(); sync(System.currentTimeMillis());
// TODO: Could base this off most recent message in db but now should be okay...
final long startTimestamp = now;
sync(startTimestamp);
} }
private static void sync(final long startTimestamp) { private static void sync(final long startTimestamp) {
@@ -47,7 +47,6 @@ import com.android.messaging.util.SafeAsyncTask;
import com.android.messaging.util.UriUtil; import com.android.messaging.util.UriUtil;
import java.util.Arrays; import java.util.Arrays;
import java.util.concurrent.TimeUnit;
/** /**
* Represents a single message part. Messages consist of one or more parts which may contain * Represents a single message part. Messages consist of one or more parts which may contain
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -17,10 +18,8 @@ package com.android.messaging.datamodel.data;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.datamodel.data.ConversationListItemData.ConversationListViewColumns;
import com.android.messaging.util.Assert; import com.android.messaging.util.Assert;
public class PeopleOptionsItemData { public class PeopleOptionsItemData {
@@ -18,6 +18,7 @@
package com.android.messaging.datamodel.data; package com.android.messaging.datamodel.data;
import android.database.Cursor; import android.database.Cursor;
import androidx.collection.ArrayMap; import androidx.collection.ArrayMap;
import java.util.ArrayList; import java.util.ArrayList;
@@ -20,7 +20,6 @@ import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF; import android.graphics.RectF;
import com.android.messaging.datamodel.data.MessagePartData; import com.android.messaging.datamodel.data.MessagePartData;
@@ -224,7 +223,7 @@ public abstract class ImageRequest<D extends ImageRequestDescriptor>
final int backgroundColor = mDescriptor.circleBackgroundColor; final int backgroundColor = mDescriptor.circleBackgroundColor;
final int strokeColor = mDescriptor.circleStrokeColor; final int strokeColor = mDescriptor.circleStrokeColor;
ImageUtils.drawBitmapWithCircleOnCanvas(sourceBitmap, new Canvas(targetBitmap), source, ImageUtils.drawBitmapWithCircleOnCanvas(sourceBitmap, new Canvas(targetBitmap), source,
dest, null, backgroundColor == 0 ? false : true /* fillBackground */, dest, null, backgroundColor != 0 /* fillBackground */,
backgroundColor, strokeColor); backgroundColor, strokeColor);
return new DecodedImageResource(getKey(), targetBitmap, return new DecodedImageResource(getKey(), targetBitmap,
loadedResource.getOrientation()); loadedResource.getOrientation());
@@ -188,10 +188,7 @@ public class MediaResourceManager {
} }
final MediaCache<T> mediaCache = mediaRequest.getMediaCache(); final MediaCache<T> mediaCache = mediaRequest.getMediaCache();
if (mediaCache != null) { if (mediaCache != null) {
final T mediaResource = mediaCache.fetchResourceFromCache(mediaRequest.getKey()); return mediaCache.fetchResourceFromCache(mediaRequest.getKey());
if (mediaResource != null) {
return mediaResource;
}
} }
return null; return null;
} }
@@ -1,6 +1,7 @@
/* /*
* Copyright (C) 2008 Esmertec AG. * Copyright (C) 2008 Esmertec AG.
* Copyright (C) 2008 The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -38,10 +39,7 @@ public final class SqliteWrapper {
String[] projection, String selection, String[] selectionArgs, String sortOrder) { String[] projection, String selection, String[] selectionArgs, String sortOrder) {
try { try {
return resolver.query(uri, projection, selection, selectionArgs, sortOrder); return resolver.query(uri, projection, selection, selectionArgs, sortOrder);
} catch (SQLiteException e) { } catch (SQLiteException | IllegalArgumentException e) {
LogUtil.e(TAG, "SqliteWrapper: catch an exception when query", e);
return null;
} catch (IllegalArgumentException e) {
LogUtil.e(TAG, "SqliteWrapper: catch an exception when query", e); LogUtil.e(TAG, "SqliteWrapper: catch an exception when query", e);
return null; return null;
} }
@@ -51,10 +49,7 @@ public final class SqliteWrapper {
ContentValues values, String where, String[] selectionArgs) { ContentValues values, String where, String[] selectionArgs) {
try { try {
return resolver.update(uri, values, where, selectionArgs); return resolver.update(uri, values, where, selectionArgs);
} catch (SQLiteException e) { } catch (SQLiteException | IllegalArgumentException e) {
LogUtil.e(TAG, "SqliteWrapper: catch an exception when update", e);
return -1;
} catch (IllegalArgumentException e) {
LogUtil.e(TAG, "SqliteWrapper: catch an exception when update", e); LogUtil.e(TAG, "SqliteWrapper: catch an exception when update", e);
return -1; return -1;
} }
@@ -64,10 +59,7 @@ public final class SqliteWrapper {
String where, String[] selectionArgs) { String where, String[] selectionArgs) {
try { try {
return resolver.delete(uri, where, selectionArgs); return resolver.delete(uri, where, selectionArgs);
} catch (SQLiteException e) { } catch (SQLiteException | IllegalArgumentException e) {
LogUtil.e(TAG, "SqliteWrapper: catch an exception when delete", e);
return -1;
} catch (IllegalArgumentException e) {
LogUtil.e(TAG, "SqliteWrapper: catch an exception when delete", e); LogUtil.e(TAG, "SqliteWrapper: catch an exception when delete", e);
return -1; return -1;
} }
@@ -77,10 +69,7 @@ public final class SqliteWrapper {
Uri uri, ContentValues values) { Uri uri, ContentValues values) {
try { try {
return resolver.insert(uri, values); return resolver.insert(uri, values);
} catch (SQLiteException e) { } catch (SQLiteException | IllegalArgumentException e) {
LogUtil.e(TAG, "SqliteWrapper: catch an exception when insert", e);
return null;
} catch (IllegalArgumentException e) {
LogUtil.e(TAG, "SqliteWrapper: catch an exception when insert", e); LogUtil.e(TAG, "SqliteWrapper: catch an exception when insert", e);
return null; return null;
} }
@@ -522,8 +522,8 @@ public class PduComposer {
} }
EncodedStringValue temp; EncodedStringValue temp;
for (int i = 0; i < addr.length; i++) { for (EncodedStringValue encodedStringValue : addr) {
temp = appendAddressType(addr[i]); temp = appendAddressType(encodedStringValue);
if (temp == null) { if (temp == null) {
return PDU_COMPOSE_CONTENT_ERROR; return PDU_COMPOSE_CONTENT_ERROR;
} }
@@ -23,6 +23,7 @@ import android.util.SparseArray;
import com.android.messaging.mmslib.InvalidHeaderValueException; import com.android.messaging.mmslib.InvalidHeaderValueException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
public class PduHeaders { public class PduHeaders {
/** /**
@@ -648,9 +649,7 @@ public class PduHeaders {
} }
ArrayList<EncodedStringValue> list = new ArrayList<>(); ArrayList<EncodedStringValue> list = new ArrayList<>();
for (int i = 0; i < value.length; i++) { Collections.addAll(list, value);
list.add(value[i]);
}
mHeaderMap.put(field, list); mHeaderMap.put(field, list);
} }
@@ -31,7 +31,6 @@ import android.provider.Telephony.Mms.Addr;
import android.provider.Telephony.Mms.Part; import android.provider.Telephony.Mms.Part;
import android.provider.Telephony.MmsSms; import android.provider.Telephony.MmsSms;
import android.provider.Telephony.MmsSms.PendingMessages; import android.provider.Telephony.MmsSms.PendingMessages;
import androidx.collection.ArrayMap;
import androidx.collection.SimpleArrayMap; import androidx.collection.SimpleArrayMap;
import android.telephony.PhoneNumberUtils; import android.telephony.PhoneNumberUtils;
import android.text.TextUtils; import android.text.TextUtils;
@@ -694,9 +693,8 @@ public class PduPersister {
|| (msgType == PduHeaders.MESSAGE_TYPE_SEND_REQ)) { || (msgType == PduHeaders.MESSAGE_TYPE_SEND_REQ)) {
final PduPart[] parts = loadParts(msgId); final PduPart[] parts = loadParts(msgId);
if (parts != null) { if (parts != null) {
final int partsNum = parts.length; for (PduPart part : parts) {
for (int i = 0; i < partsNum; i++) { body.addPart(part);
body.addPart(parts[i]);
} }
} }
} }
@@ -1223,7 +1221,7 @@ public class PduPersister {
values.put(Mms.TEXT_ONLY, textOnly ? 1 : 0); values.put(Mms.TEXT_ONLY, textOnly ? 1 : 0);
values.put(Mms.SUBSCRIPTION_ID, subId); values.put(Mms.SUBSCRIPTION_ID, subId);
Uri res = null; Uri res;
if (existingUri) { if (existingUri) {
res = uri; res = uri;
SqliteWrapper.update(mContext, mContentResolver, res, values, null, null); SqliteWrapper.update(mContext, mContentResolver, res, values, null, null);
@@ -1279,10 +1277,7 @@ public class PduPersister {
for (final EncodedStringValue v : array) { for (final EncodedStringValue v : array) {
if (v != null) { if (v != null) {
final String number = v.getString(); final String number = v.getString();
if (!recipients.contains(number)) { recipients.add(number);
// Only add numbers which aren't already included.
recipients.add(number);
}
} }
} }
} }
@@ -1325,10 +1320,7 @@ public class PduPersister {
for (final String number : numbers) { for (final String number : numbers) {
// Only add numbers which aren't my own number. // Only add numbers which aren't my own number.
if (isSelfNumberUnavailable || !PhoneNumberUtils.compare(number, selfNumber)) { if (isSelfNumberUnavailable || !PhoneNumberUtils.compare(number, selfNumber)) {
if (!recipients.contains(number)) { recipients.add(number);
// Only add numbers which aren't already included.
recipients.add(number);
}
} }
} }
} }
@@ -28,17 +28,12 @@ import android.content.pm.PackageManager;
import android.content.res.Resources; import android.content.res.Resources;
import android.provider.Telephony; import android.provider.Telephony;
import android.provider.Telephony.Sms; import android.provider.Telephony.Sms;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationCompat.Builder;
import androidx.core.app.NotificationCompat.Style;
import androidx.core.app.NotificationManagerCompat;
import java.util.ArrayList; import androidx.core.app.NotificationCompat;
import java.util.regex.Pattern; import androidx.core.app.NotificationManagerCompat;
import com.android.messaging.Factory; import com.android.messaging.Factory;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.datamodel.BugleNotifications;
import com.android.messaging.datamodel.NoConfirmationSmsSendService; import com.android.messaging.datamodel.NoConfirmationSmsSendService;
import com.android.messaging.datamodel.action.ReceiveSmsMessageAction; import com.android.messaging.datamodel.action.ReceiveSmsMessageAction;
import com.android.messaging.sms.MmsUtils; import com.android.messaging.sms.MmsUtils;
@@ -49,6 +44,9 @@ import com.android.messaging.util.OsUtil;
import com.android.messaging.util.PendingIntentConstants; import com.android.messaging.util.PendingIntentConstants;
import com.android.messaging.util.PhoneUtils; import com.android.messaging.util.PhoneUtils;
import java.util.ArrayList;
import java.util.regex.Pattern;
/** /**
* Class that receives incoming SMS messages through android.provider.Telephony.SMS_RECEIVED * Class that receives incoming SMS messages through android.provider.Telephony.SMS_RECEIVED
* *
@@ -359,7 +359,7 @@ public class BugleApnSettingsLoader implements ApnSettingsLoader {
} else { } else {
uri = Telephony.Carriers.CONTENT_URI; uri = Telephony.Carriers.CONTENT_URI;
} }
Cursor cursor = null; Cursor cursor;
try { try {
for (; ; ) { for (; ; ) {
// Try different combinations of queries. Some would work on some platforms. // Try different combinations of queries. Some would work on some platforms.
@@ -556,7 +556,7 @@ public class BugleApnSettingsLoader implements ApnSettingsLoader {
return addr; return addr;
} }
final StringBuilder builder = new StringBuilder(16); final StringBuilder builder = new StringBuilder(16);
String result = null; String result;
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
try { try {
if (octets[i].length() > 3) { if (octets[i].length() > 3) {
@@ -107,9 +107,7 @@ public class BugleCarrierConfigValuesLoader implements CarrierConfigValuesLoader
try { try {
final Bundle systemValues = final Bundle systemValues =
PhoneUtils.get(subId).getSmsManager().getCarrierConfigValues(); PhoneUtils.get(subId).getSmsManager().getCarrierConfigValues();
if (systemValues != null) { values.putAll(systemValues);
values.putAll(systemValues);
}
} catch (final Exception e) { } catch (final Exception e) {
LogUtil.w(LogUtil.BUGLE_TAG, "Calling system getCarrierConfigValues exception", e); LogUtil.w(LogUtil.BUGLE_TAG, "Calling system getCarrierConfigValues exception", e);
} }
@@ -35,7 +35,6 @@ import android.webkit.MimeTypeMap;
import com.android.messaging.Factory; import com.android.messaging.Factory;
import com.android.messaging.datamodel.data.MessageData; 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.mmslib.pdu.CharacterSets;
import com.android.messaging.util.ContentType; import com.android.messaging.util.ContentType;
import com.android.messaging.util.LogUtil; import com.android.messaging.util.LogUtil;
@@ -65,7 +64,7 @@ public class DatabaseMessages {
@Override @Override
public boolean equals(final Object other) { public boolean equals(final Object other) {
if (other == null || !(other instanceof DatabaseMessage)) { if (!(other instanceof DatabaseMessage)) {
return false; return false;
} }
final DatabaseMessage otherDbMsg = (DatabaseMessage) other; final DatabaseMessage otherDbMsg = (DatabaseMessage) other;
@@ -155,8 +154,8 @@ public class DatabaseMessages {
mType = cursor.getInt(INDEX_TYPE); mType = cursor.getInt(INDEX_TYPE);
mThreadId = cursor.getLong(INDEX_THREAD_ID); mThreadId = cursor.getLong(INDEX_THREAD_ID);
mStatus = cursor.getInt(INDEX_STATUS); mStatus = cursor.getInt(INDEX_STATUS);
mRead = cursor.getInt(INDEX_READ) == 0 ? false : true; mRead = cursor.getInt(INDEX_READ) != 0;
mSeen = cursor.getInt(INDEX_SEEN) == 0 ? false : true; mSeen = cursor.getInt(INDEX_SEEN) != 0;
mUri = ContentUris.withAppendedId(Sms.CONTENT_URI, mRowId).toString(); mUri = ContentUris.withAppendedId(Sms.CONTENT_URI, mRowId).toString();
mSubId = PhoneUtils.getDefault().getSubIdFromTelephony(cursor, INDEX_SUB_ID); mSubId = PhoneUtils.getDefault().getSubIdFromTelephony(cursor, INDEX_SUB_ID);
} }
@@ -351,8 +350,8 @@ public class DatabaseMessages {
mThreadId = cursor.getLong(INDEX_THREAD_ID); mThreadId = cursor.getLong(INDEX_THREAD_ID);
mPriority = cursor.getInt(INDEX_PRIORITY); mPriority = cursor.getInt(INDEX_PRIORITY);
mStatus = cursor.getInt(INDEX_STATUS); mStatus = cursor.getInt(INDEX_STATUS);
mRead = cursor.getInt(INDEX_READ) == 0 ? false : true; mRead = cursor.getInt(INDEX_READ) != 0;
mSeen = cursor.getInt(INDEX_SEEN) == 0 ? false : true; mSeen = cursor.getInt(INDEX_SEEN) != 0;
mContentLocation = cursor.getString(INDEX_CONTENT_LOCATION); mContentLocation = cursor.getString(INDEX_CONTENT_LOCATION);
mTransactionId = cursor.getString(INDEX_TRANSACTION_ID); mTransactionId = cursor.getString(INDEX_TRANSACTION_ID);
mMmsMessageType = cursor.getInt(INDEX_MESSAGE_TYPE); mMmsMessageType = cursor.getInt(INDEX_MESSAGE_TYPE);
@@ -731,6 +730,7 @@ public class DatabaseMessages {
/** /**
* Get an instance of the MMS part from the part table cursor * Get an instance of the MMS part from the part table cursor
* *
* @param loadMedia Whether to load the media file of the part
*/ */
public static MmsPart get(final Cursor cursor, final boolean loadMedia) { public static MmsPart get(final Cursor cursor, final boolean loadMedia) {
final MmsPart part = new MmsPart(); final MmsPart part = new MmsPart();
+19 -42
View File
@@ -29,12 +29,10 @@ import android.database.sqlite.SQLiteException;
import android.media.MediaMetadataRetriever; import android.media.MediaMetadataRetriever;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings;
import android.provider.Telephony; import android.provider.Telephony;
import android.provider.Telephony.Mms; import android.provider.Telephony.Mms;
import android.provider.Telephony.Sms; import android.provider.Telephony.Sms;
import android.provider.Telephony.Threads; import android.provider.Telephony.Threads;
import android.telephony.SmsManager;
import android.telephony.SmsMessage; import android.telephony.SmsMessage;
import android.text.TextUtils; import android.text.TextUtils;
@@ -45,7 +43,6 @@ import com.android.messaging.datamodel.action.DownloadMmsAction;
import com.android.messaging.datamodel.action.SendMessageAction; import com.android.messaging.datamodel.action.SendMessageAction;
import com.android.messaging.datamodel.data.MessageData; import com.android.messaging.datamodel.data.MessageData;
import com.android.messaging.datamodel.data.MessagePartData; import com.android.messaging.datamodel.data.MessagePartData;
import com.android.messaging.datamodel.data.ParticipantData;
import com.android.messaging.mmslib.InvalidHeaderValueException; import com.android.messaging.mmslib.InvalidHeaderValueException;
import com.android.messaging.mmslib.MmsException; import com.android.messaging.mmslib.MmsException;
import com.android.messaging.mmslib.SqliteWrapper; import com.android.messaging.mmslib.SqliteWrapper;
@@ -122,7 +119,7 @@ public class MmsUtils {
*/ */
public static final int MMS_REQUEST_NO_RETRY = 3; public static final int MMS_REQUEST_NO_RETRY = 3;
public static final String getRequestStatusDescription(final int status) { public static String getRequestStatusDescription(final int status) {
switch (status) { switch (status) {
case MMS_REQUEST_SUCCEEDED: case MMS_REQUEST_SUCCEEDED:
return "SUCCEEDED"; return "SUCCEEDED";
@@ -889,9 +886,7 @@ public class MmsUtils {
LogUtil.d(TAG, "Mmsutils: Inserted SMS message into telephony (type = " + type + ")" LogUtil.d(TAG, "Mmsutils: Inserted SMS message into telephony (type = " + type + ")"
+ ", uri: " + response); + ", uri: " + response);
} }
} catch (final SQLiteException e) { } catch (final SQLiteException | IllegalArgumentException e) {
LogUtil.e(TAG, "MmsUtils: persist sms message failure " + e, e);
} catch (final IllegalArgumentException e) {
LogUtil.e(TAG, "MmsUtils: persist sms message failure " + e, e); LogUtil.e(TAG, "MmsUtils: persist sms message failure " + e, e);
} }
return response; return response;
@@ -914,9 +909,7 @@ public class MmsUtils {
} }
return true; return true;
} }
} catch (final SQLiteException e) { } catch (final SQLiteException | IllegalArgumentException e) {
LogUtil.e(TAG, "MmsUtils: update sms message failure " + e, e);
} catch (final IllegalArgumentException e) {
LogUtil.e(TAG, "MmsUtils: update sms message failure " + e, e); LogUtil.e(TAG, "MmsUtils: update sms message failure " + e, e);
} }
return false; return false;
@@ -999,9 +992,7 @@ public class MmsUtils {
} }
return true; return true;
} }
} catch (final SQLiteException e) { } catch (final SQLiteException | IllegalArgumentException e) {
LogUtil.e(TAG, "MmsUtils: update mms message failure " + e, e);
} catch (final IllegalArgumentException e) {
LogUtil.e(TAG, "MmsUtils: update mms message failure " + e, e); LogUtil.e(TAG, "MmsUtils: update mms message failure " + e, e);
} }
return false; return false;
@@ -1135,9 +1126,7 @@ public class MmsUtils {
if (messageUri != null) { if (messageUri != null) {
return ContentUris.parseId(messageUri); return ContentUris.parseId(messageUri);
} }
} catch (final UnsupportedOperationException e) { } catch (final UnsupportedOperationException | NumberFormatException e) {
// Nothing to do
} catch (final NumberFormatException e) {
// Nothing to do // Nothing to do
} }
return -1; return -1;
@@ -1785,9 +1774,7 @@ public class MmsUtils {
} }
MmsSender.sendNotifyResponseForMmsDownload( MmsSender.sendNotifyResponseForMmsDownload(
context, subId, transactionId, contentLocation, status); context, subId, transactionId, contentLocation, status);
} catch (final MmsFailureException e) { } catch (final MmsFailureException | InvalidHeaderValueException e) {
LogUtil.e(TAG, "sendNotifyResponseForMmsDownload: failed to retrieve message " + e, e);
} catch (final InvalidHeaderValueException e) {
LogUtil.e(TAG, "sendNotifyResponseForMmsDownload: failed to retrieve message " + e, e); LogUtil.e(TAG, "sendNotifyResponseForMmsDownload: failed to retrieve message " + e, e);
} }
} }
@@ -1810,9 +1797,7 @@ public class MmsUtils {
return; return;
} }
MmsSender.sendAcknowledgeForMmsDownload(context, subId, transactionId, contentLocation); MmsSender.sendAcknowledgeForMmsDownload(context, subId, transactionId, contentLocation);
} catch (final MmsFailureException e) { } catch (final MmsFailureException | InvalidHeaderValueException e) {
LogUtil.e(TAG, "sendAcknowledgeForMmsDownload: failed to retrieve message " + e, e);
} catch (final InvalidHeaderValueException e) {
LogUtil.e(TAG, "sendAcknowledgeForMmsDownload: failed to retrieve message " + e, e); LogUtil.e(TAG, "sendAcknowledgeForMmsDownload: failed to retrieve message " + e, e);
} }
} }
@@ -1875,12 +1860,10 @@ public class MmsUtils {
status = e.retryHint; status = e.retryHint;
rawStatus = e.rawStatus; rawStatus = e.rawStatus;
LogUtil.e(TAG, "MmsUtils: failed to send message " + e, e); LogUtil.e(TAG, "MmsUtils: failed to send message " + e, e);
} catch (final InvalidHeaderValueException e) { } catch (final MmsException e) {
LogUtil.e(TAG, "MmsUtils: failed to send message " + e, e); LogUtil.e(TAG, "MmsUtils: failed to send message " + e, e);
} catch (final IllegalArgumentException e) { } catch (final IllegalArgumentException e) {
LogUtil.e(TAG, "MmsUtils: invalid message to send " + e, e); LogUtil.e(TAG, "MmsUtils: invalid message to send " + e, e);
} catch (final MmsException e) {
LogUtil.e(TAG, "MmsUtils: failed to send message " + e, e);
} }
// If we get here, some exception occurred // If we get here, some exception occurred
return new StatusPlusUri(status, rawStatus, messageUri); return new StatusPlusUri(status, rawStatus, messageUri);
@@ -1939,8 +1922,6 @@ public class MmsUtils {
private static String[] getDupNotifications(final Context context, final NotificationInd nInd) { private static String[] getDupNotifications(final Context context, final NotificationInd nInd) {
final byte[] rawTransactionId = nInd.getTransactionId(); final byte[] rawTransactionId = nInd.getTransactionId();
if (rawTransactionId != null) { if (rawTransactionId != null) {
// dedup algorithm
String selection = DUP_NOTIFICATION_QUERY_SELECTION;
final long nowSecs = System.currentTimeMillis() / 1000; final long nowSecs = System.currentTimeMillis() / 1000;
String[] selectionArgs = new String[] { String[] selectionArgs = new String[] {
Integer.toString(PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND), Integer.toString(PduHeaders.MESSAGE_TYPE_NOTIFICATION_IND),
@@ -1952,7 +1933,7 @@ public class MmsUtils {
try (Cursor cursor = SqliteWrapper.query( try (Cursor cursor = SqliteWrapper.query(
context, context.getContentResolver(), context, context.getContentResolver(),
Mms.CONTENT_URI, new String[]{Mms._ID}, Mms.CONTENT_URI, new String[]{Mms._ID},
selection, selectionArgs, null)) { DUP_NOTIFICATION_QUERY_SELECTION, selectionArgs, null)) {
final int dupCount = cursor.getCount(); final int dupCount = cursor.getCount();
if (dupCount > 0) { if (dupCount > 0) {
// We already received the same notification before. // We already received the same notification before.
@@ -2015,7 +1996,7 @@ public class MmsUtils {
} }
final String[] dups = getDupNotifications(context, nInd); final String[] dups = getDupNotifications(context, nInd);
if (dups == null) { if (dups == null) {
Uri inboxUri = null; Uri inboxUri;
try { try {
inboxUri = p.persist(pdu, Mms.Inbox.CONTENT_URI, subId, subPhoneNumber, inboxUri = p.persist(pdu, Mms.Inbox.CONTENT_URI, subId, subPhoneNumber,
null); null);
@@ -2299,9 +2280,7 @@ public class MmsUtils {
if (pduData == null || pduData.length < 1) { if (pduData == null || pduData.length < 1) {
throw new IllegalArgumentException("Empty or zero length PDU data"); throw new IllegalArgumentException("Empty or zero length PDU data");
} }
} catch (final MmsFailureException e) { } catch (final MmsFailureException | InvalidHeaderValueException e) {
// Nothing to do
} catch (final InvalidHeaderValueException e) {
// Nothing to do // Nothing to do
} }
return pduData; return pduData;
@@ -2349,17 +2328,15 @@ public class MmsUtils {
} }
final String dumpFileName = MmsUtils.MMS_DUMP_PREFIX + getDumpFileId(pdu); final String dumpFileName = MmsUtils.MMS_DUMP_PREFIX + getDumpFileId(pdu);
final File dumpFile = DebugUtils.getDebugFile(dumpFileName, true); final File dumpFile = DebugUtils.getDebugFile(dumpFileName, true);
if (dumpFile != null) { try {
try { final FileOutputStream fos = new FileOutputStream(dumpFile);
final FileOutputStream fos = new FileOutputStream(dumpFile); try (BufferedOutputStream bos = new BufferedOutputStream(fos)) {
try (BufferedOutputStream bos = new BufferedOutputStream(fos)) { bos.write(rawPdu);
bos.write(rawPdu); bos.flush();
bos.flush();
}
DebugUtils.ensureReadable(dumpFile);
} catch (final IOException e) {
LogUtil.e(TAG, "dumpPdu: " + e, e);
} }
DebugUtils.ensureReadable(dumpFile);
} catch (final IOException e) {
LogUtil.e(TAG, "dumpPdu: " + e, e);
} }
} }
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -32,20 +33,15 @@ class SystemProperties {
sSystemPropertiesGetMethod = sSystemPropertiesGetMethod =
systemPropertiesClass.getMethod("get", String.class); systemPropertiesClass.getMethod("get", String.class);
} }
} catch (final ClassNotFoundException e) { } catch (final ClassNotFoundException | NoSuchMethodException e) {
// Nothing to do
} catch (final NoSuchMethodException e) {
// Nothing to do // Nothing to do
} }
} }
if (sSystemPropertiesGetMethod != null) { if (sSystemPropertiesGetMethod != null) {
try { try {
return (String) sSystemPropertiesGetMethod.invoke(null, name); return (String) sSystemPropertiesGetMethod.invoke(null, name);
} catch (final IllegalArgumentException e) { } catch (final IllegalArgumentException | InvocationTargetException |
// Nothing to do IllegalAccessException e) {
} catch (final IllegalAccessException e) {
// Nothing to do
} catch (final InvocationTargetException e) {
// Nothing to do // Nothing to do
} }
} }
@@ -26,11 +26,12 @@ import android.graphics.RectF;
import android.graphics.drawable.AnimatedImageDrawable; import android.graphics.drawable.AnimatedImageDrawable;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import androidx.annotation.Nullable;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.widget.ImageView; import android.widget.ImageView;
import androidx.annotation.Nullable;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.datamodel.binding.Binding; import com.android.messaging.datamodel.binding.Binding;
import com.android.messaging.datamodel.binding.BindingBase; import com.android.messaging.datamodel.binding.BindingBase;
@@ -132,7 +132,7 @@ public class AttachmentPreview extends ScrollView implements OnAttachmentClickLi
} }
// returns true if we have attachments // returns true if we have attachments
public boolean onAttachmentsChanged(final DraftMessageData draftMessageData) { public void onAttachmentsChanged(final DraftMessageData draftMessageData) {
final boolean isFirstUpdate = mPendingFirstUpdate; final boolean isFirstUpdate = mPendingFirstUpdate;
final List<MessagePartData> attachments = draftMessageData.getReadOnlyAttachments(); final List<MessagePartData> attachments = draftMessageData.getReadOnlyAttachments();
final List<PendingAttachmentData> pendingAttachments = final List<PendingAttachmentData> pendingAttachments =
@@ -163,7 +163,7 @@ public class AttachmentPreview extends ScrollView implements OnAttachmentClickLi
// Run immediately when clearing attachments // Run immediately when clearing attachments
mHideRunnable.run(); mHideRunnable.run();
} }
return false; return;
} }
cancelPendingHide(); // We're showing cancelPendingHide(); // We're showing
@@ -248,7 +248,6 @@ public class AttachmentPreview extends ScrollView implements OnAttachmentClickLi
} }
} }
} }
return true;
} }
public void onMessageAnimationStart() { public void onMessageAnimationStart() {
@@ -30,11 +30,11 @@ import androidx.fragment.app.Fragment;
import androidx.loader.app.LoaderManager; import androidx.loader.app.LoaderManager;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.datamodel.DataModel;
import com.android.messaging.datamodel.binding.Binding; import com.android.messaging.datamodel.binding.Binding;
import com.android.messaging.datamodel.binding.BindingBase; import com.android.messaging.datamodel.binding.BindingBase;
import com.android.messaging.datamodel.data.BlockedParticipantsData; import com.android.messaging.datamodel.data.BlockedParticipantsData;
import com.android.messaging.datamodel.data.BlockedParticipantsData.BlockedParticipantsDataListener; import com.android.messaging.datamodel.data.BlockedParticipantsData.BlockedParticipantsDataListener;
import com.android.messaging.datamodel.DataModel;
import com.android.messaging.util.Assert; import com.android.messaging.util.Assert;
/** /**
@@ -19,16 +19,16 @@ package com.android.messaging.ui;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.view.ActionMode; import android.view.ActionMode;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.util.BugleActivityUtil; import com.android.messaging.util.BugleActivityUtil;
import com.android.messaging.util.ImeUtil; import com.android.messaging.util.ImeUtil;
+2 -5
View File
@@ -32,6 +32,7 @@ import com.android.messaging.util.Assert;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
public class SnackBar { public class SnackBar {
public static final int LONG_DURATION_IN_MS = 5000; public static final int LONG_DURATION_IN_MS = 5000;
@@ -211,11 +212,7 @@ public class SnackBar {
mAction = builder.mAction; mAction = builder.mAction;
mPlacement = builder.mPlacement; mPlacement = builder.mPlacement;
mParentView = builder.mParentView; mParentView = builder.mParentView;
if (builder.mInteractions == null) { mInteractions = Objects.requireNonNullElseGet(builder.mInteractions, ArrayList::new);
mInteractions = new ArrayList<>();
} else {
mInteractions = builder.mInteractions;
}
mActionTextView = (TextView) mRootView.findViewById(R.id.snack_bar_action); mActionTextView = (TextView) mRootView.findViewById(R.id.snack_bar_action);
mMessageView = (TextView) mRootView.findViewById(R.id.snack_bar_message); mMessageView = (TextView) mRootView.findViewById(R.id.snack_bar_message);
@@ -32,11 +32,11 @@ import android.os.Bundle;
import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.Intents; import android.provider.ContactsContract.Intents;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.text.TextUtils;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.core.app.TaskStackBuilder; import androidx.core.app.TaskStackBuilder;
import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import android.text.TextUtils;
import com.android.ex.photo.Intents.PhotoViewIntentBuilder; import com.android.ex.photo.Intents.PhotoViewIntentBuilder;
import com.android.messaging.R; import com.android.messaging.R;
@@ -345,9 +345,8 @@ public class UIIntentsImpl extends UIIntents {
@Override @Override
public Intent getIntentForConversationActivity(final Context context, public Intent getIntentForConversationActivity(final Context context,
final String conversationId, final MessageData draft) { final String conversationId, final MessageData draft) {
final Intent intent = getConversationActivityIntent(context, conversationId, draft, return getConversationActivityIntent(context, conversationId, draft,
false /* withCustomTransition */); false /* withCustomTransition */);
return intent;
} }
@Override @Override
@@ -34,7 +34,6 @@ import com.android.messaging.R;
import com.android.messaging.datamodel.data.MessagePartData; import com.android.messaging.datamodel.data.MessagePartData;
import com.android.messaging.datamodel.media.ImageRequest; import com.android.messaging.datamodel.media.ImageRequest;
import com.android.messaging.datamodel.media.MessagePartVideoThumbnailRequestDescriptor; import com.android.messaging.datamodel.media.MessagePartVideoThumbnailRequestDescriptor;
import com.android.messaging.datamodel.media.VideoThumbnailRequest;
import com.android.messaging.util.Assert; import com.android.messaging.util.Assert;
/** /**
@@ -20,9 +20,6 @@ import android.content.Context;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.Outline; import android.graphics.Outline;
import android.graphics.drawable.ColorDrawable;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.Gravity; import android.view.Gravity;
@@ -34,6 +31,9 @@ import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import com.android.messaging.Factory; import com.android.messaging.Factory;
import com.android.messaging.R; import com.android.messaging.R;
@@ -184,7 +184,7 @@ public class ViewPagerTabs extends HorizontalScrollView implements ViewPager.OnP
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
position = getRtlPosition(position); position = getRtlPosition(position);
int tabStripChildCount = mTabStrip.getChildCount(); int tabStripChildCount = mTabStrip.getChildCount();
if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) { if (position < 0 || position >= tabStripChildCount) {
return; return;
} }
@@ -195,7 +195,7 @@ public class ViewPagerTabs extends HorizontalScrollView implements ViewPager.OnP
public void onPageSelected(int position) { public void onPageSelected(int position) {
position = getRtlPosition(position); position = getRtlPosition(position);
int tabStripChildCount = mTabStrip.getChildCount(); int tabStripChildCount = mTabStrip.getChildCount();
if ((tabStripChildCount == 0) || (position < 0) || (position >= tabStripChildCount)) { if (position < 0 || position >= tabStripChildCount) {
return; return;
} }
@@ -18,7 +18,6 @@
package com.android.messaging.ui.animation; package com.android.messaging.ui.animation;
import android.animation.TypeEvaluator; import android.animation.TypeEvaluator;
import android.app.Activity;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Rect; import android.graphics.Rect;
@@ -25,13 +25,14 @@ import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import androidx.core.view.ViewCompat;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewGroupOverlay; import android.view.ViewGroupOverlay;
import android.view.ViewOverlay; import android.view.ViewOverlay;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import androidx.core.view.ViewCompat;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.util.UiUtils; import com.android.messaging.util.UiUtils;
@@ -18,7 +18,6 @@ package com.android.messaging.ui.contact;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import androidx.core.util.Pair;
import android.text.TextUtils; import android.text.TextUtils;
import android.text.util.Rfc822Token; import android.text.util.Rfc822Token;
import android.text.util.Rfc822Tokenizer; import android.text.util.Rfc822Tokenizer;
@@ -222,7 +221,6 @@ public final class ContactRecipientAdapter extends BaseRecipientAdapter {
* Compare two RecipientEntry's, first by locale-aware display name comparison, then by * Compare two RecipientEntry's, first by locale-aware display name comparison, then by
* contact id comparison, finally by first-level-ness comparison. * contact id comparison, finally by first-level-ness comparison.
*/ */
@Override
public int compare(RecipientEntry lhs, RecipientEntry rhs) { public int compare(RecipientEntry lhs, RecipientEntry rhs) {
// Send-to-destinations always appear before everything else. // Send-to-destinations always appear before everything else.
final boolean sendToLhs = ContactRecipientEntryUtils final boolean sendToLhs = ContactRecipientEntryUtils
@@ -21,9 +21,6 @@ import android.content.res.Resources;
import android.graphics.Rect; import android.graphics.Rect;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import android.text.Editable; import android.text.Editable;
import android.text.Html; import android.text.Html;
import android.text.InputFilter; import android.text.InputFilter;
@@ -41,6 +38,8 @@ import android.widget.ImageButton;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import com.android.messaging.Factory; import com.android.messaging.Factory;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.datamodel.binding.Binding; import com.android.messaging.datamodel.binding.Binding;
@@ -320,14 +319,12 @@ public class ComposeMessageView extends LinearLayout
} }
// returns true if it actually shows the subject editor and false if already showing // returns true if it actually shows the subject editor and false if already showing
private boolean showSubjectEditor() { private void showSubjectEditor() {
// show the subject editor // show the subject editor
if (mSubjectView.getVisibility() == View.GONE) { if (mSubjectView.getVisibility() == View.GONE) {
mSubjectView.setVisibility(View.VISIBLE); mSubjectView.setVisibility(View.VISIBLE);
mSubjectView.requestFocus(); mSubjectView.requestFocus();
return true;
} }
return false;
} }
private void hideSubjectEditor() { private void hideSubjectEditor() {
@@ -24,12 +24,6 @@ import android.content.res.Resources;
import android.graphics.Rect; import android.graphics.Rect;
import android.graphics.drawable.StateListDrawable; import android.graphics.drawable.StateListDrawable;
import android.os.Handler; import android.os.Handler;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import android.util.StateSet; import android.util.StateSet;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MotionEvent; import android.view.MotionEvent;
@@ -40,6 +34,11 @@ import android.view.ViewGroupOverlay;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.datamodel.data.ConversationMessageData; import com.android.messaging.datamodel.data.ConversationMessageData;
@@ -77,9 +76,7 @@ public class ConversationFastScroller extends RecyclerView.OnScrollListener impl
private static final int HIDE_ANIMATION_DURATION_MS = 300; private static final int HIDE_ANIMATION_DURATION_MS = 300;
private static final int HIDE_DELAY_MS = 1500; private static final int HIDE_DELAY_MS = 1500;
private final Context mContext;
private final RecyclerView mRv; private final RecyclerView mRv;
private final ViewGroupOverlay mOverlay;
private final ImageView mTrackImageView; private final ImageView mTrackImageView;
private final ImageView mThumbImageView; private final ImageView mThumbImageView;
private final TextView mPreviewTextView; private final TextView mPreviewTextView;
@@ -117,7 +114,7 @@ public class ConversationFastScroller extends RecyclerView.OnScrollListener impl
}; };
private ConversationFastScroller(RecyclerView rv, int position) { private ConversationFastScroller(RecyclerView rv, int position) {
mContext = rv.getContext(); final Context context = rv.getContext();
mRv = rv; mRv = rv;
mRv.addOnLayoutChangeListener(this); mRv.addOnLayoutChangeListener(this);
mRv.addOnScrollListener(this); mRv.addOnScrollListener(this);
@@ -131,7 +128,7 @@ public class ConversationFastScroller extends RecyclerView.OnScrollListener impl
mPosRight = (position == POSITION_RIGHT_SIDE); mPosRight = (position == POSITION_RIGHT_SIDE);
// Cache the dimensions we'll need during layout // Cache the dimensions we'll need during layout
final Resources res = mContext.getResources(); final Resources res = context.getResources();
mTrackWidth = res.getDimensionPixelSize(R.dimen.fastscroll_track_width); mTrackWidth = res.getDimensionPixelSize(R.dimen.fastscroll_track_width);
mThumbHeight = res.getDimensionPixelSize(R.dimen.fastscroll_thumb_height); mThumbHeight = res.getDimensionPixelSize(R.dimen.fastscroll_thumb_height);
mPreviewHeight = res.getDimensionPixelSize(R.dimen.fastscroll_preview_height); mPreviewHeight = res.getDimensionPixelSize(R.dimen.fastscroll_preview_height);
@@ -141,7 +138,7 @@ public class ConversationFastScroller extends RecyclerView.OnScrollListener impl
R.dimen.fastscroll_preview_margin_left_right); R.dimen.fastscroll_preview_margin_left_right);
mTouchSlop = res.getDimensionPixelOffset(R.dimen.fastscroll_touch_slop); mTouchSlop = res.getDimensionPixelOffset(R.dimen.fastscroll_touch_slop);
final LayoutInflater inflator = LayoutInflater.from(mContext); final LayoutInflater inflator = LayoutInflater.from(context);
mTrackImageView = (ImageView) inflator.inflate(R.layout.fastscroll_track, null); mTrackImageView = (ImageView) inflator.inflate(R.layout.fastscroll_track, null);
mThumbImageView = (ImageView) inflator.inflate(R.layout.fastscroll_thumb, null); mThumbImageView = (ImageView) inflator.inflate(R.layout.fastscroll_thumb, null);
mPreviewTextView = (TextView) inflator.inflate(R.layout.fastscroll_preview, null); mPreviewTextView = (TextView) inflator.inflate(R.layout.fastscroll_preview, null);
@@ -149,10 +146,10 @@ public class ConversationFastScroller extends RecyclerView.OnScrollListener impl
refreshConversationThemeColor(); refreshConversationThemeColor();
// Add the fast scroll views to the overlay, so they are rendered above the list // Add the fast scroll views to the overlay, so they are rendered above the list
mOverlay = rv.getOverlay(); final ViewGroupOverlay overlay = rv.getOverlay();
mOverlay.add(mTrackImageView); overlay.add(mTrackImageView);
mOverlay.add(mThumbImageView); overlay.add(mThumbImageView);
mOverlay.add(mPreviewTextView); overlay.add(mPreviewTextView);
hide(false /* animate */); hide(false /* animate */);
mPreviewTextView.setAlpha(0f); mPreviewTextView.setAlpha(0f);
@@ -177,8 +177,8 @@ public class ConversationInputManager implements ConversationInput.ConversationI
} }
public boolean onNavigationUpPressed() { public boolean onNavigationUpPressed() {
for (int i = 0; i < mInputs.length; i++) { for (ConversationInput input : mInputs) {
if (mInputs[i].onNavigationUpPressed()) { if (input.onNavigationUpPressed()) {
return true; return true;
} }
} }
@@ -209,8 +209,8 @@ public class ConversationInputManager implements ConversationInput.ConversationI
public void hideAllInputs(final boolean animate) { public void hideAllInputs(final boolean animate) {
beginUpdate(); beginUpdate();
for (int i = 0; i < mInputs.length; i++) { for (ConversationInput input : mInputs) {
showHideInternal(mInputs[i], false, animate); showHideInternal(input, false, animate);
} }
endUpdate(); endUpdate();
} }
@@ -225,9 +225,9 @@ public class ConversationInputManager implements ConversationInput.ConversationI
} }
public boolean updateActionBar(final ActionBar actionBar) { public boolean updateActionBar(final ActionBar actionBar) {
for (int i = 0; i < mInputs.length; i++) { for (ConversationInput input : mInputs) {
if (mInputs[i].mShowing) { if (input.mShowing) {
return mInputs[i].updateActionBar(actionBar); return input.updateActionBar(actionBar);
} }
} }
return false; return false;
@@ -271,8 +271,7 @@ public class ConversationInputManager implements ConversationInput.ConversationI
// All inputs are mutually exclusive. Showing one will hide everything else. // All inputs are mutually exclusive. Showing one will hide everything else.
// The one exception, is that the keyboard and location media chooser can be open at the // The one exception, is that the keyboard and location media chooser can be open at the
// time to enable searching within that chooser // time to enable searching within that chooser
for (int i = 0; i < mInputs.length; i++) { for (final ConversationInput currInput : mInputs) {
final ConversationInput currInput = mInputs[i];
if (currInput != target) { if (currInput != target) {
// TODO : If there's more exceptions we will want to make this more // TODO : If there's more exceptions we will want to make this more
// generic // generic
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -23,15 +24,11 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.ui.AsyncImageView;
import com.android.messaging.ui.CursorRecyclerAdapter; import com.android.messaging.ui.CursorRecyclerAdapter;
import com.android.messaging.ui.AsyncImageView.AsyncImageViewDelayLoader; import com.android.messaging.ui.AsyncImageView.AsyncImageViewDelayLoader;
import com.android.messaging.ui.conversation.ConversationMessageView.ConversationMessageViewHost; import com.android.messaging.ui.conversation.ConversationMessageView.ConversationMessageViewHost;
import com.android.messaging.util.Assert; import com.android.messaging.util.Assert;
import java.util.HashSet;
import java.util.List;
/** /**
* Provides an interface to expose Conversation Message Cursor data to a UI widget like a * Provides an interface to expose Conversation Message Cursor data to a UI widget like a
* RecyclerView. * RecyclerView.
@@ -73,7 +73,6 @@ import com.android.messaging.util.UiUtils;
import com.android.messaging.util.YouTubeUtil; import com.android.messaging.util.YouTubeUtil;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
@@ -238,8 +237,7 @@ public class ConversationMessageView extends FrameLayout implements View.OnClick
* @param cursor The cursor from a MessageList that this view is in, pointing to its entry. * @param cursor The cursor from a MessageList that this view is in, pointing to its entry.
* @param oneOnOne Whether this is a 1:1 conversation * @param oneOnOne Whether this is a 1:1 conversation
*/ */
public void bind(final Cursor cursor, public void bind(final Cursor cursor, final boolean oneOnOne, final String selectedMessageId) {
final boolean oneOnOne, final String selectedMessageId) {
mOneOnOne = oneOnOne; mOneOnOne = oneOnOne;
// Update our UI model // Update our UI model
@@ -494,7 +492,7 @@ public class ConversationMessageView extends FrameLayout implements View.OnClick
// Bind image attachments. If there are multiple, they are shown in a collage view. // Bind image attachments. If there are multiple, they are shown in a collage view.
final List<MessagePartData> imageParts = mData.getAttachments(sImageFilter); final List<MessagePartData> imageParts = mData.getAttachments(sImageFilter);
if (imageParts.size() > 1) { if (imageParts.size() > 1) {
Collections.sort(imageParts, sImageComparator); imageParts.sort(sImageComparator);
mMultiAttachmentView.bindAttachments(imageParts, null, imageParts.size()); mMultiAttachmentView.bindAttachments(imageParts, null, imageParts.size());
mMultiAttachmentView.setVisibility(View.VISIBLE); mMultiAttachmentView.setVisibility(View.VISIBLE);
} else { } else {
@@ -26,7 +26,6 @@ import com.android.messaging.datamodel.data.SubscriptionListData;
import com.android.messaging.datamodel.data.SubscriptionListData.SubscriptionListEntry; import com.android.messaging.datamodel.data.SubscriptionListData.SubscriptionListEntry;
import com.android.messaging.ui.conversation.SimSelectorView.SimSelectorViewListener; import com.android.messaging.ui.conversation.SimSelectorView.SimSelectorViewListener;
import com.android.messaging.util.AccessibilityUtil; import com.android.messaging.util.AccessibilityUtil;
import com.android.messaging.util.Assert;
import com.android.messaging.util.ThreadUtil; import com.android.messaging.util.ThreadUtil;
/** /**
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -17,15 +18,12 @@ package com.android.messaging.ui.conversation;
import android.content.Context; import android.content.Context;
import android.graphics.Outline; import android.graphics.Outline;
import android.net.Uri;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
import android.view.ViewOutlineProvider; import android.view.ViewOutlineProvider;
import com.android.messaging.ui.ContactIconView; import com.android.messaging.ui.ContactIconView;
import com.android.messaging.util.Assert;
import com.android.messaging.util.AvatarUriUtil;
/** /**
* Shows SIM avatar icon in the SIM switcher / Self-send button. * Shows SIM avatar icon in the SIM switcher / Self-send button.
@@ -42,7 +42,6 @@ import com.android.messaging.ui.contact.AddContactsConfirmationDialog;
import com.android.messaging.ui.conversationlist.ConversationListFragment.ConversationListFragmentHost; import com.android.messaging.ui.conversationlist.ConversationListFragment.ConversationListFragmentHost;
import com.android.messaging.ui.conversationlist.MultiSelectActionModeCallback.SelectedConversation; import com.android.messaging.ui.conversationlist.MultiSelectActionModeCallback.SelectedConversation;
import com.android.messaging.util.PhoneUtils; import com.android.messaging.util.PhoneUtils;
import com.android.messaging.util.Trace;
import com.android.messaging.util.UiUtils; import com.android.messaging.util.UiUtils;
import java.util.ArrayList; import java.util.ArrayList;
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -24,7 +25,6 @@ import android.view.ViewGroup;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.ui.CursorRecyclerAdapter; import com.android.messaging.ui.CursorRecyclerAdapter;
import com.android.messaging.ui.conversationlist.ConversationListItemView.HostInterface;
/** /**
* Provides an interface to expose Conversation List Cursor data to a UI widget like a ListView. * Provides an interface to expose Conversation List Cursor data to a UI widget like a ListView.
@@ -33,7 +33,6 @@ import android.view.ViewGroup.MarginLayoutParams;
import android.view.ViewPropertyAnimator; import android.view.ViewPropertyAnimator;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import android.widget.AbsListView; import android.widget.AbsListView;
import android.widget.ImageView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.view.ViewGroupCompat; import androidx.core.view.ViewGroupCompat;
@@ -312,7 +311,7 @@ public class ConversationListFragment extends Fragment implements ConversationLi
// It is recommended for the Floating Action button functionality to be duplicated as a // It is recommended for the Floating Action button functionality to be duplicated as a
// menu // menu
AccessibilityManager accessibilityManager = (AccessibilityManager) AccessibilityManager accessibilityManager = (AccessibilityManager)
getActivity().getSystemService(Context.ACCESSIBILITY_SERVICE); requireActivity().getSystemService(Context.ACCESSIBILITY_SERVICE);
startNewConversationMenuItem.setVisible(accessibilityManager startNewConversationMenuItem.setVisible(accessibilityManager
.isTouchExplorationEnabled()); .isTouchExplorationEnabled());
} }
@@ -397,7 +396,7 @@ public class ConversationListFragment extends Fragment implements ConversationLi
R.integer.fab_animation_duration_ms)); R.integer.fab_animation_duration_ms));
} }
public ViewPropertyAnimator dismissFab() { public void dismissFab() {
// To prevent clicking while animating. // To prevent clicking while animating.
mStartNewConversationButton.setEnabled(false); mStartNewConversationButton.setEnabled(false);
final MarginLayoutParams lp = final MarginLayoutParams lp =
@@ -405,11 +404,11 @@ public class ConversationListFragment extends Fragment implements ConversationLi
final float fabWidthWithLeftRightMargin = mStartNewConversationButton.getWidth() final float fabWidthWithLeftRightMargin = mStartNewConversationButton.getWidth()
+ lp.leftMargin + lp.rightMargin; + lp.leftMargin + lp.rightMargin;
final int direction = AccessibilityUtil.isLayoutRtl(mStartNewConversationButton) ? -1 : 1; final int direction = AccessibilityUtil.isLayoutRtl(mStartNewConversationButton) ? -1 : 1;
return getNormalizedFabAnimator().translationX(direction * fabWidthWithLeftRightMargin); getNormalizedFabAnimator().translationX(direction * fabWidthWithLeftRightMargin);
} }
public ViewPropertyAnimator showFab() { public void showFab() {
return getNormalizedFabAnimator().translationX(0).withEndAction(() -> { getNormalizedFabAnimator().translationX(0).withEndAction(() -> {
// Re-enable clicks after the animation. // Re-enable clicks after the animation.
mStartNewConversationButton.setEnabled(true); mStartNewConversationButton.setEnabled(true);
}); });
@@ -24,8 +24,6 @@ import android.graphics.Rect;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import androidx.core.text.BidiFormatter;
import androidx.core.text.TextDirectionHeuristicsCompat;
import android.text.TextPaint; import android.text.TextPaint;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
@@ -39,6 +37,8 @@ import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.core.content.res.ResourcesCompat; import androidx.core.content.res.ResourcesCompat;
import androidx.core.text.BidiFormatter;
import androidx.core.text.TextDirectionHeuristicsCompat;
import com.android.messaging.Factory; import com.android.messaging.Factory;
import com.android.messaging.R; import com.android.messaging.R;
@@ -61,6 +61,7 @@ import com.android.messaging.util.PhoneUtils;
import com.android.messaging.util.Typefaces; import com.android.messaging.util.Typefaces;
import com.android.messaging.util.UiUtils; import com.android.messaging.util.UiUtils;
import com.android.messaging.util.UriUtil; import com.android.messaging.util.UriUtil;
import org.lineageos.messaging.util.PrefsUtils; import org.lineageos.messaging.util.PrefsUtils;
import java.util.List; import java.util.List;
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -30,7 +31,6 @@ import com.android.messaging.datamodel.data.ParticipantData;
import com.android.messaging.datamodel.data.PersonItemData; import com.android.messaging.datamodel.data.PersonItemData;
import com.android.messaging.ui.CursorRecyclerAdapter; import com.android.messaging.ui.CursorRecyclerAdapter;
import com.android.messaging.ui.PersonItemView; import com.android.messaging.ui.PersonItemView;
import com.android.messaging.ui.PersonItemView.PersonItemViewListener;
import com.android.messaging.util.PhoneUtils; import com.android.messaging.util.PhoneUtils;
/** /**
@@ -24,7 +24,6 @@ import android.content.Intent;
import android.content.res.Resources; import android.content.res.Resources;
import android.database.Cursor; import android.database.Cursor;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcelable;
import android.provider.Settings; import android.provider.Settings;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@@ -50,10 +49,9 @@ import com.android.messaging.datamodel.data.PeopleOptionsItemData;
import com.android.messaging.datamodel.data.PersonItemData; import com.android.messaging.datamodel.data.PersonItemData;
import com.android.messaging.ui.CompositeAdapter; import com.android.messaging.ui.CompositeAdapter;
import com.android.messaging.ui.PersonItemView; import com.android.messaging.ui.PersonItemView;
import com.android.messaging.ui.UIIntents;
import com.android.messaging.ui.conversation.ConversationActivity; import com.android.messaging.ui.conversation.ConversationActivity;
import com.android.messaging.util.NotificationsUtil;
import com.android.messaging.util.Assert; import com.android.messaging.util.Assert;
import com.android.messaging.util.NotificationsUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -19,7 +19,7 @@ package com.android.messaging.ui.conversationsettings;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import androidx.appcompat.widget.SwitchCompat; import androidx.appcompat.widget.SwitchCompat;
import android.text.TextUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
@@ -238,7 +238,7 @@ public class AudioRecordView extends FrameLayout implements
} }
@VisibleForTesting @VisibleForTesting
boolean onRecordButtonTouchDown() { void onRecordButtonTouchDown() {
if (!mMediaRecorder.isRecording() && mCurrentMode == MODE_IDLE) { if (!mMediaRecorder.isRecording() && mCurrentMode == MODE_IDLE) {
setMode(MODE_STARTING); setMode(MODE_STARTING);
playAudioStartSound(() -> { playAudioStartSound(() -> {
@@ -253,9 +253,7 @@ public class AudioRecordView extends FrameLayout implements
} }
}); });
mAudioRecordStartTimeMillis = System.currentTimeMillis(); mAudioRecordStartTimeMillis = System.currentTimeMillis();
return true;
} }
return false;
} }
@VisibleForTesting @VisibleForTesting
@@ -38,7 +38,6 @@ import android.view.Surface;
import android.view.WindowManager; import android.view.WindowManager;
import com.android.messaging.datamodel.data.DraftMessageData.DraftMessageSubscriptionDataProvider; import com.android.messaging.datamodel.data.DraftMessageData.DraftMessageSubscriptionDataProvider;
import com.android.messaging.Factory;
import com.android.messaging.datamodel.data.ParticipantData; import com.android.messaging.datamodel.data.ParticipantData;
import com.android.messaging.datamodel.media.ImageRequest; import com.android.messaging.datamodel.media.ImageRequest;
import com.android.messaging.sms.MmsConfig; import com.android.messaging.sms.MmsConfig;
@@ -27,10 +27,11 @@ import android.widget.ImageButton;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.datamodel.binding.ImmutableBindingRef; import com.android.messaging.datamodel.binding.ImmutableBindingRef;
import com.android.messaging.datamodel.data.MediaPickerData;
import com.android.messaging.datamodel.data.DraftMessageData.DraftMessageSubscriptionDataProvider; import com.android.messaging.datamodel.data.DraftMessageData.DraftMessageSubscriptionDataProvider;
import com.android.messaging.datamodel.data.MediaPickerData;
import com.android.messaging.ui.BasePagerViewHolder; import com.android.messaging.ui.BasePagerViewHolder;
import com.android.messaging.util.Assert; import com.android.messaging.util.Assert;
@@ -17,7 +17,6 @@
package com.android.messaging.ui.mediapicker; package com.android.messaging.ui.mediapicker;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
@@ -188,8 +187,8 @@ public class MediaPicker extends Fragment implements DraftMessageSubscriptionDat
private boolean mAnimateOnAttach; private boolean mAnimateOnAttach;
@Override @Override
public void onAttach (final Activity activity) { public void onAttach(@NonNull final Context context) {
super.onAttach(activity); super.onAttach(context);
mIsAttached = true; mIsAttached = true;
if (mStartingMediaTypeOnAttach != MEDA_TYPE_INVALID) { if (mStartingMediaTypeOnAttach != MEDA_TYPE_INVALID) {
// open() was previously called. Do the pending open now. // open() was previously called. Do the pending open now.
@@ -31,7 +31,6 @@ import android.widget.LinearLayout;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.ui.PagingAwareViewPager; import com.android.messaging.ui.PagingAwareViewPager;
import com.android.messaging.util.Assert;
import com.android.messaging.util.UiUtils; import com.android.messaging.util.UiUtils;
/** /**
@@ -545,7 +545,7 @@ public class FocusOverlayManager {
} }
public static boolean isSupported(String value, List<String> supported) { public static boolean isSupported(String value, List<String> supported) {
return supported != null && supported.indexOf(value) >= 0; return supported != null && supported.contains(value);
} }
public static boolean isMeteringAreaSupported(Parameters params) { public static boolean isMeteringAreaSupported(Parameters params) {
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -18,6 +19,7 @@ package com.android.messaging.ui.photoviewer;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.AnimatedImageDrawable; import android.graphics.drawable.AnimatedImageDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import androidx.loader.content.Loader; import androidx.loader.content.Loader;
import com.android.ex.photo.PhotoViewCallbacks; import com.android.ex.photo.PhotoViewCallbacks;
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -17,8 +18,6 @@ package com.android.messaging.util;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import androidx.core.view.accessibility.AccessibilityEventCompat;
import androidx.core.view.accessibility.AccessibilityRecordCompat;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityEvent;
@@ -69,10 +68,7 @@ public class AccessibilityUtil {
event.setEnabled(view.isEnabled()); event.setEnabled(view.isEnabled());
event.setClassName(view.getClass().getName()); event.setClassName(view.getClass().getName());
event.setPackageName(context.getPackageName()); event.setPackageName(context.getPackageName());
event.setSource(view);
// JellyBean MR1 requires a source view to set the window ID.
final AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
record.setSource(view);
// Sends the event directly through the accessibility manager. If we only supported SDK 14+ // Sends the event directly through the accessibility manager. If we only supported SDK 14+
// we could have done: // we could have done:
@@ -19,16 +19,12 @@ package com.android.messaging.util;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context; import android.content.Context;
import android.os.UserManager; import android.os.UserManager;
import android.text.TextUtils;
import com.android.messaging.Factory; import com.android.messaging.Factory;
import com.android.messaging.R; import com.android.messaging.R;
import com.android.messaging.datamodel.DataModel; import com.android.messaging.datamodel.DataModel;
import com.android.messaging.ui.conversation.ConversationActivity;
import com.android.messaging.ui.conversationlist.ConversationListActivity;
/** /**
* Utility class including logic to verify requirements to run Bugle and other activity startup * Utility class including logic to verify requirements to run Bugle and other activity startup
@@ -104,7 +104,7 @@ public class ChangeDefaultSmsAppHelper {
} }
} }
private class ChangeSmsAppSettingRunnable implements Runnable { private static class ChangeSmsAppSettingRunnable implements Runnable {
private final Activity mActivity; private final Activity mActivity;
public ChangeSmsAppSettingRunnable(final Activity activity) { public ChangeSmsAppSettingRunnable(final Activity activity) {
@@ -22,8 +22,6 @@ import android.telephony.PhoneStateListener;
import android.telephony.ServiceState; import android.telephony.ServiceState;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import com.android.messaging.datamodel.data.ParticipantData;
/** /**
* ConnectivityUtil listens to the network service state changes. * ConnectivityUtil listens to the network service state changes.
*/ */
@@ -19,7 +19,6 @@ package com.android.messaging.util;
import android.Manifest; import android.Manifest;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.provider.ContactsContract; import android.provider.ContactsContract;
@@ -35,7 +34,6 @@ import android.text.TextUtils;
import android.view.View; import android.view.View;
import com.android.ex.chips.RecipientEntry; import com.android.ex.chips.RecipientEntry;
import com.android.messaging.Factory;
import com.android.messaging.datamodel.CursorQueryData; import com.android.messaging.datamodel.CursorQueryData;
import com.android.messaging.datamodel.FrequentContactsCursorQueryData; import com.android.messaging.datamodel.FrequentContactsCursorQueryData;
import com.android.messaging.datamodel.data.ParticipantData; import com.android.messaging.datamodel.data.ParticipantData;
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -21,7 +22,7 @@ import java.util.HashSet;
/** /**
* Utility class to make it easy to store multiple conversation id strings in a single string * Utility class to make it easy to store multiple conversation id strings in a single string
* with delimeters. * with delimiters.
*/ */
public class ConversationIdSet extends HashSet<String> { public class ConversationIdSet extends HashSet<String> {
private static final String JOIN_DELIMITER = "|"; private static final String JOIN_DELIMITER = "|";
+2 -1
View File
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -26,8 +27,8 @@ import com.google.common.annotations.VisibleForTesting;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
+6 -12
View File
@@ -18,16 +18,12 @@
package com.android.messaging.util; package com.android.messaging.util;
import android.os.Environment; import android.os.Environment;
import android.text.TextUtils;
import com.android.messaging.sms.MmsUtils;
import com.google.common.io.ByteStreams; import com.google.common.io.ByteStreams;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
public class DebugUtils { public class DebugUtils {
@@ -54,14 +50,12 @@ public class DebugUtils {
byte[] data = null; byte[] data = null;
try { try {
final File inputFile = getDebugFile(dumpFileName, false); final File inputFile = getDebugFile(dumpFileName, false);
if (inputFile != null) { final FileInputStream fis = new FileInputStream(inputFile);
final FileInputStream fis = new FileInputStream(inputFile); try (BufferedInputStream bis = new BufferedInputStream(fis)) {
try (BufferedInputStream bis = new BufferedInputStream(fis)) { // dump file
// dump file data = ByteStreams.toByteArray(bis);
data = ByteStreams.toByteArray(bis); if (data == null || data.length < 1) {
if (data == null || data.length < 1) { LogUtil.e(LogUtil.BUGLE_TAG, "receiveFromDumpFile: empty data");
LogUtil.e(LogUtil.BUGLE_TAG, "receiveFromDumpFile: empty data");
}
} }
} }
} catch (final IOException e) { } catch (final IOException e) {
@@ -145,7 +145,7 @@ public final class EmailAddress {
} }
// check if the host contains two continuous dots. // check if the host contains two continuous dots.
if (host.indexOf("..") >= 0) { if (host.contains("..")) {
return false; return false;
} }
@@ -179,7 +179,7 @@ public final class EmailAddress {
} }
// the user cannot contain two continuous dots // the user cannot contain two continuous dots
if (user.indexOf("..") >= 0) { if (user.contains("..")) {
return false; return false;
} }
@@ -33,9 +33,10 @@ import android.graphics.Shader.TileMode;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.provider.MediaStore; import android.provider.MediaStore;
import androidx.annotation.Nullable;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.Nullable;
import com.android.messaging.Factory; import com.android.messaging.Factory;
import com.android.messaging.datamodel.MediaScratchFileProvider; import com.android.messaging.datamodel.MediaScratchFileProvider;
import com.android.messaging.datamodel.MessagingContentProvider; import com.android.messaging.datamodel.MessagingContentProvider;
@@ -31,6 +31,7 @@ import androidx.annotation.NonNull;
import com.android.messaging.Factory; import com.android.messaging.Factory;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Objects;
/** /**
* This class is provides the same interface and functionality as android.media.AsyncPlayer * This class is provides the same interface and functionality as android.media.AsyncPlayer
@@ -257,11 +258,7 @@ public class NotificationPlayer implements OnCompletionListener {
* @param tag a string to use for debugging * @param tag a string to use for debugging
*/ */
public NotificationPlayer(final String tag) { public NotificationPlayer(final String tag) {
if (tag != null) { mTag = Objects.requireNonNullElse(tag, "NotificationPlayer");
mTag = tag;
} else {
mTag = "NotificationPlayer";
}
} }
/** /**
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -50,6 +51,7 @@ import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects;
/** /**
* This class abstracts away platform dependency of calling telephony related * This class abstracts away platform dependency of calling telephony related
@@ -356,10 +358,7 @@ public class PhoneUtils {
public List<SubscriptionInfo> getActiveSubscriptionInfoList() { public List<SubscriptionInfo> getActiveSubscriptionInfoList() {
final List<SubscriptionInfo> subscriptionInfos = final List<SubscriptionInfo> subscriptionInfos =
mSubscriptionManager.getActiveSubscriptionInfoList(); mSubscriptionManager.getActiveSubscriptionInfoList();
if (subscriptionInfos != null) { return Objects.requireNonNullElse(subscriptionInfos, EMPTY_SUBSCRIPTION_LIST);
return subscriptionInfos;
}
return EMPTY_SUBSCRIPTION_LIST;
} }
/** /**
@@ -1222,10 +1222,10 @@ public class ExifInterface {
*/ */
public Long getTagLongValue(int tagId, int ifdId) { public Long getTagLongValue(int tagId, int ifdId) {
long[] l = getTagLongValues(tagId, ifdId); long[] l = getTagLongValues(tagId, ifdId);
if (l == null || l.length <= 0) { if (l == null || l.length == 0) {
return null; return null;
} }
return new Long(l[0]); return l[0];
} }
/** /**
@@ -1241,10 +1241,10 @@ public class ExifInterface {
*/ */
public Integer getTagIntValue(int tagId, int ifdId) { public Integer getTagIntValue(int tagId, int ifdId) {
int[] l = getTagIntValues(tagId, ifdId); int[] l = getTagIntValues(tagId, ifdId);
if (l == null || l.length <= 0) { if (l == null || l.length == 0) {
return null; return null;
} }
return new Integer(l[0]); return l[0];
} }
/** /**
@@ -1260,10 +1260,10 @@ public class ExifInterface {
*/ */
public Byte getTagByteValue(int tagId, int ifdId) { public Byte getTagByteValue(int tagId, int ifdId) {
byte[] l = getTagByteValues(tagId, ifdId); byte[] l = getTagByteValues(tagId, ifdId);
if (l == null || l.length <= 0) { if (l == null || l.length == 0) {
return null; return null;
} }
return new Byte(l[0]); return l[0];
} }
/** /**
@@ -1,5 +1,6 @@
/* /*
* Copyright (C) 2015 The Android Open Source Project * Copyright (C) 2015 The Android Open Source Project
* Copyright (C) 2024 The LineageOS Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -44,8 +45,8 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds); super.onUpdate(context, appWidgetManager, appWidgetIds);
for (int i = 0; i < appWidgetIds.length; ++i) { for (int appWidgetId : appWidgetIds) {
updateWidget(context, appWidgetIds[i]); updateWidget(context, appWidgetId);
} }
} }
@@ -44,7 +44,6 @@ import com.android.messaging.datamodel.media.MediaResourceManager;
import com.android.messaging.datamodel.media.MessagePartImageRequestDescriptor; import com.android.messaging.datamodel.media.MessagePartImageRequestDescriptor;
import com.android.messaging.datamodel.media.MessagePartVideoThumbnailRequestDescriptor; import com.android.messaging.datamodel.media.MessagePartVideoThumbnailRequestDescriptor;
import com.android.messaging.datamodel.media.UriImageRequestDescriptor; import com.android.messaging.datamodel.media.UriImageRequestDescriptor;
import com.android.messaging.datamodel.media.VideoThumbnailRequest;
import com.android.messaging.sms.MmsUtils; import com.android.messaging.sms.MmsUtils;
import com.android.messaging.ui.UIIntents; import com.android.messaging.ui.UIIntents;
import com.android.messaging.util.AvatarUriUtil; import com.android.messaging.util.AvatarUriUtil;