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

Commit 9c30c280 authored by Santos Cordon's avatar Santos Cordon
Browse files

[2/4] Use new Icon class in PhoneAccount.

Bug: 21088522
Change-Id: If57c3cb2f1c6630b6bd66e55862bec564e817945
parent ed0c0cc3
Loading
Loading
Loading
Loading
+35 −23
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Binder;
import android.os.Process;
@@ -43,7 +44,6 @@ import android.util.AtomicFile;
import android.util.Base64;
import android.util.Xml;


// TODO: Needed for move to system service: import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.FastXmlSerializer;
@@ -56,6 +56,7 @@ import org.xmlpull.v1.XmlSerializer;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
@@ -83,8 +84,8 @@ import java.util.concurrent.CopyOnWriteArrayList;
 *
 *  -- About Users and Phone Accounts --
 *
 * When it comes to PhoneAccounts, we store all phone account in a single place,
 * which means that there are three users that we deal with:
 * We store all phone accounts for all users in a single place, which means that there are three
 * users that we have to deal with in code:
 * 1) The Android User that is currently active on the device.
 * 2) The user which owns/registers the phone account.
 * 3) The user running the app that is requesting the phone account information.
@@ -92,12 +93,12 @@ import java.util.concurrent.CopyOnWriteArrayList;
 * For example, I have a device with 2 users, primary (A) and secondary (B), and the secondary user
 * has a work profile running as another user (B2). Lets say that user B opens the phone settings
 * (not currently supported, but theoretically speaking), and phone settings queries for a phone
 * account list. Lets also say that an app running in the work profile has registered a phone account.
 * This means that:
 * account list. Lets also say that an app running in the work profile has registered a phone
 * account. This means that:
 *
 * Since phone settings always runs as the primary user, We have the following situation:
 * User A (settings) is requesting a list of phone accounts while the active user is User B, and that
 * list contains a phone account for profile User B2.
 * User A (settings) is requesting a list of phone accounts while the active user is User B, and
 * that list contains a phone account for profile User B2.
 *
 * In practice, (2) is stored with the phone account handle and is part of the handle's ID. (1) is
 * saved in {@link #mCurrentUserHandle} and (3) we get from Binder.getCallingUser(). We check these
@@ -879,13 +880,13 @@ public final class PhoneAccountRegistrar {
            serializer.endTag(null, tagName);
        }

        protected void writeBitmapIfNonNull(String tagName, Bitmap value, XmlSerializer serializer)
        protected void writeIconIfNonNull(String tagName, Icon value, XmlSerializer serializer)
                throws IOException {
            if (value != null && value.getByteCount() > 0) {
            if (value != null) {
                ByteArrayOutputStream stream = new ByteArrayOutputStream();
                value.compress(Bitmap.CompressFormat.PNG, 100, stream);
                byte[] imageByteArray = stream.toByteArray();
                String text = Base64.encodeToString(imageByteArray, 0, imageByteArray.length, 0);
                value.writeToStream(stream);
                byte[] iconByteArray = stream.toByteArray();
                String text = Base64.encodeToString(iconByteArray, 0, iconByteArray.length, 0);

                serializer.startTag(null, tagName);
                serializer.text(text);
@@ -931,11 +932,16 @@ public final class PhoneAccountRegistrar {
            return arrayEntries;
        }

        protected Bitmap readBitmap(XmlPullParser parser)
                throws IOException, XmlPullParserException {
        protected Bitmap readBitmap(XmlPullParser parser) {
            byte[] imageByteArray = Base64.decode(parser.getText(), 0);
            return BitmapFactory.decodeByteArray(imageByteArray, 0, imageByteArray.length);
        }

        protected Icon readIcon(XmlPullParser parser) throws IOException {
            byte[] iconByteArray = Base64.decode(parser.getText(), 0);
            ByteArrayInputStream stream = new ByteArrayInputStream(iconByteArray);
            return Icon.createFromStream(stream);
        }
    }

    @VisibleForTesting
@@ -1037,6 +1043,7 @@ public final class PhoneAccountRegistrar {
        private static final String LABEL = "label";
        private static final String SHORT_DESCRIPTION = "short_description";
        private static final String SUPPORTED_URI_SCHEMES = "supported_uri_schemes";
        private static final String ICON = "icon";

        @Override
        public void writeToXml(PhoneAccount o, XmlSerializer serializer, Context context)
@@ -1053,10 +1060,7 @@ public final class PhoneAccountRegistrar {
                writeTextIfNonNull(ADDRESS, o.getAddress(), serializer);
                writeTextIfNonNull(SUBSCRIPTION_ADDRESS, o.getSubscriptionAddress(), serializer);
                writeTextIfNonNull(CAPABILITIES, Integer.toString(o.getCapabilities()), serializer);
                writeTextIfNonNull(ICON_RES_ID, Integer.toString(o.getIconResId()), serializer);
                writeTextIfNonNull(ICON_PACKAGE_NAME, o.getIconPackageName(), serializer);
                writeBitmapIfNonNull(ICON_BITMAP, o.getIconBitmap(), serializer);
                writeTextIfNonNull(ICON_TINT, Integer.toString(o.getIconTint()), serializer);
                writeIconIfNonNull(ICON, o.getIcon(), serializer);
                writeTextIfNonNull(HIGHLIGHT_COLOR,
                        Integer.toString(o.getHighlightColor()), serializer);
                writeTextIfNonNull(LABEL, o.getLabel(), serializer);
@@ -1083,6 +1087,7 @@ public final class PhoneAccountRegistrar {
                String label = null;
                String shortDescription = null;
                List<String> supportedUriSchemes = null;
                Icon icon = null;

                while (XmlUtils.nextElementWithin(parser, outerDepth)) {
                    if (parser.getName().equals(ACCOUNT_HANDLE)) {
@@ -1122,6 +1127,9 @@ public final class PhoneAccountRegistrar {
                        shortDescription = parser.getText();
                    } else if (parser.getName().equals(SUPPORTED_URI_SCHEMES)) {
                        supportedUriSchemes = readStringList(parser);
                    } else if (parser.getName().equals(ICON)) {
                        parser.next();
                        icon = readIcon(parser);
                    }
                }

@@ -1161,10 +1169,13 @@ public final class PhoneAccountRegistrar {
                        .setSupportedUriSchemes(supportedUriSchemes)
                        .setHighlightColor(highlightColor);

                if (iconBitmap == null) {
                    builder.setIcon(iconPackageName, iconResId, iconTint);
                } else {
                    builder.setIcon(iconBitmap);
                if (icon != null) {
                    builder.setIcon(icon);
                } else if (iconBitmap != null) {
                    builder.setIcon(Icon.createWithBitmap(iconBitmap));
                } else if (!TextUtils.isEmpty(iconPackageName)) {
                    builder.setIcon(Icon.createWithResource(iconPackageName, iconResId));
                    // TODO: Need to set tint.
                }

                return builder.build();
@@ -1173,7 +1184,8 @@ public final class PhoneAccountRegistrar {
        }

        /**
         * Determines if the SIP call settings specify to use SIP for all calls, including PSTN calls.
         * Determines if the SIP call settings specify to use SIP for all calls, including PSTN
         * calls.
         *
         * @param context The context.
         * @return {@code True} if SIP should be used for all calls.
+10 −3
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
@@ -111,7 +112,9 @@ public class CallServiceNotifier {
                .setSubscriptionAddress(Uri.parse("tel:555-TEST"))
                .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER |
                        PhoneAccount.CAPABILITY_VIDEO_CALLING)
                .setIcon(context, R.drawable.stat_sys_phone_call, Color.RED)
                .setIcon(Icon.createWithResource(
                        context.getResources(), R.drawable.stat_sys_phone_call))
                // TODO: Add icon tint (Color.RED)
                .setHighlightColor(Color.RED)
                .setShortDescription("a short description for the call provider")
                .setSupportedUriSchemes(Arrays.asList("tel"))
@@ -127,7 +130,9 @@ public class CallServiceNotifier {
                .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER |
                        PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION |
                        PhoneAccount.CAPABILITY_VIDEO_CALLING)
                .setIcon(context, R.drawable.stat_sys_phone_call, Color.GREEN)
                .setIcon(Icon.createWithResource(
                        context.getResources(), R.drawable.stat_sys_phone_call))
                // TODO: Add icon tint (Color.GREEN)
                .setHighlightColor(Color.GREEN)
                .setShortDescription("a short description for the sim subscription")
                .build());
@@ -140,7 +145,9 @@ public class CallServiceNotifier {
                .setAddress(Uri.parse("tel:555-CMGR"))
                .setSubscriptionAddress(Uri.parse("tel:555-CMGR"))
                .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
                .setIcon(context, R.drawable.stat_sys_phone_call, Color.BLUE)
                .setIcon(Icon.createWithResource(
                        context.getResources(), R.drawable.stat_sys_phone_call))
                // TODO: Add icon tint (Color.BLUE)
                .setShortDescription("a short description for the connection manager")
                .build());
    }
+9 −26
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Parcel;
import android.telecom.PhoneAccount;
@@ -226,10 +227,9 @@ public class PhoneAccountRegistrarTest extends TelecomTestCase {
                        .setAddress(Uri.parse("tel:123456"))
                        .setCapabilities(23)
                        .setHighlightColor(0xf0f0f0)
                        .setIcon(
                                "com.android.server.telecom.tests",
                                R.drawable.stat_sys_phone_call,
                                0xfefefe)
                        .setIcon(Icon.createWithResource(
                                "com.android.server.telecom.tests", R.drawable.stat_sys_phone_call))
                        // TODO: set icon tint (0xfefefe)
                        .setShortDescription("short description")
                        .setSubscriptionAddress(Uri.parse("tel:2345678"))
                        .setSupportedUriSchemes(Arrays.asList("tel", "sip"))
@@ -239,10 +239,10 @@ public class PhoneAccountRegistrarTest extends TelecomTestCase {
                        .setAddress(Uri.parse("tel:123456"))
                        .setCapabilities(23)
                        .setHighlightColor(0xf0f0f0)
                        .setIcon(
                        .setIcon(Icon.createWithBitmap(
                                BitmapFactory.decodeResource(
                                        getContext().getResources(),
                                        R.drawable.stat_sys_phone_call))
                                        R.drawable.stat_sys_phone_call)))
                        .setShortDescription("short description")
                        .setSubscriptionAddress(Uri.parse("tel:2345678"))
                        .setSupportedUriSchemes(Arrays.asList("tel", "sip"))
@@ -273,7 +273,8 @@ public class PhoneAccountRegistrarTest extends TelecomTestCase {
                .setAddress(Uri.parse("http://foo.com/" + idx))
                .setSubscriptionAddress(Uri.parse("tel:555-000" + idx))
                .setCapabilities(idx)
                .setIcon("com.android.server.telecom.tests", R.drawable.stat_sys_phone_call)
                .setIcon(Icon.createWithResource(
                            "com.android.server.telecom.tests", R.drawable.stat_sys_phone_call))
                .setShortDescription("desc" + idx)
                .build();
    }
@@ -343,10 +344,7 @@ public class PhoneAccountRegistrarTest extends TelecomTestCase {
            assertEquals(a.getAddress(), b.getAddress());
            assertEquals(a.getSubscriptionAddress(), b.getSubscriptionAddress());
            assertEquals(a.getCapabilities(), b.getCapabilities());
            assertEquals(a.getIconResId(), b.getIconResId());
            assertEquals(a.getIconPackageName(), b.getIconPackageName());
            assertBitmapEquals(a.getIconBitmap(), b.getIconBitmap());
            assertEquals(a.getIconTint(), b.getIconTint());
            assertEquals(a.getIcon().toString(), b.getIcon().toString());
            assertEquals(a.getHighlightColor(), b.getHighlightColor());
            assertEquals(a.getLabel(), b.getLabel());
            assertEquals(a.getShortDescription(), b.getShortDescription());
@@ -354,21 +352,6 @@ public class PhoneAccountRegistrarTest extends TelecomTestCase {
        }
    }

    private static void assertBitmapEquals(Bitmap a, Bitmap b) {
        if (a == null || b == null) {
            assertEquals(null, a);
            assertEquals(null, b);
        } else {
            assertEquals(a.getWidth(), b.getWidth());
            assertEquals(a.getHeight(), b.getHeight());
            for (int x = 0; x < a.getWidth(); x++) {
                for (int y = 0; y < a.getHeight(); y++) {
                    assertEquals(a.getPixel(x, y), b.getPixel(x, y));
                }
            }
        }
    }

    private static void assertStateEquals(
            PhoneAccountRegistrar.State a, PhoneAccountRegistrar.State b) {
        assertPhoneAccountHandleEquals(a.defaultOutgoing, b.defaultOutgoing);