Move out helper objects from MessengerDelegate
am: 0b9eee1428

Change-Id: I0b7426d52eaa512afe945c207e1b9216a437c27f
diff --git a/src/com/android/car/messenger/CompositeKey.java b/src/com/android/car/messenger/CompositeKey.java
new file mode 100644
index 0000000..97fb029
--- /dev/null
+++ b/src/com/android/car/messenger/CompositeKey.java
@@ -0,0 +1,64 @@
+package com.android.car.messenger;
+
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * A composite key used for {@link Map} lookups, using two strings for
+ * checking equality and hashing.
+ */
+public abstract class CompositeKey {
+    private final String mDeviceAddress;
+    private final String mSubKey;
+
+    protected CompositeKey(String deviceAddress, String subKey) {
+        mDeviceAddress = deviceAddress;
+        mSubKey = subKey;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (!(o instanceof CompositeKey)) {
+            return false;
+        }
+
+        CompositeKey that = (CompositeKey) o;
+        return Objects.equals(mDeviceAddress, that.mDeviceAddress)
+                && Objects.equals(mSubKey, that.mSubKey);
+    }
+
+    /**
+     * Returns true if the device address of this composite key equals {@code deviceAddress}.
+     *
+     * @param deviceAddress the device address which is compared to this key's device address
+     * @return true if the device addresses match
+     */
+    public boolean matches(String deviceAddress) {
+        return mDeviceAddress.equals(deviceAddress);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mDeviceAddress, mSubKey);
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s, deviceAddress: %s, subKey: %s",
+                getClass().getSimpleName(), mDeviceAddress, mSubKey);
+    }
+
+    /** Returns this composite key's device address. */
+    public String getDeviceAddress() {
+        return mDeviceAddress;
+    }
+
+    /** Returns this composite key's sub key. */
+    public String getSubKey() {
+        return mSubKey;
+    }
+}
diff --git a/src/com/android/car/messenger/MessengerDelegate.java b/src/com/android/car/messenger/MessengerDelegate.java
index 28eeeee..ad2ee6a 100644
--- a/src/com/android/car/messenger/MessengerDelegate.java
+++ b/src/com/android/car/messenger/MessengerDelegate.java
@@ -17,8 +17,6 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
-import android.os.Parcel;
-import android.os.Parcelable;
 import android.provider.ContactsContract;
 import android.text.TextUtils;
 import android.widget.Toast;
@@ -47,7 +45,6 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.function.Predicate;
 
 /** Delegate class responsible for handling messaging service actions */
@@ -477,117 +474,6 @@
     }
 
     /**
-     * A composite key used for {@link Map} lookups, using two strings for
-     * checking equality and hashing.
-     */
-    public abstract static class CompositeKey {
-        private final String mDeviceAddress;
-        private final String mSubKey;
-
-        CompositeKey(String deviceAddress, String subKey) {
-            mDeviceAddress = deviceAddress;
-            mSubKey = subKey;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) {
-                return true;
-            }
-
-            if (!(o instanceof CompositeKey)) {
-                return false;
-            }
-
-            CompositeKey that = (CompositeKey) o;
-            return Objects.equals(mDeviceAddress, that.mDeviceAddress)
-                    && Objects.equals(mSubKey, that.mSubKey);
-        }
-
-        /**
-         * Returns true if the device address of this composite key equals {@code deviceAddress}.
-         *
-         * @param deviceAddress the device address which is compared to this key's device address
-         * @return true if the device addresses match
-         */
-        public boolean matches(String deviceAddress) {
-            return mDeviceAddress.equals(deviceAddress);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(mDeviceAddress, mSubKey);
-        }
-
-        @Override
-        public String toString() {
-            return String.format("%s, deviceAddress: %s, subKey: %s",
-                    getClass().getSimpleName(), mDeviceAddress, mSubKey);
-        }
-
-        /** Returns this composite key's device address. */
-        public String getDeviceAddress() {
-            return mDeviceAddress;
-        }
-
-        /** Returns this composite key's sub key. */
-        public String getSubKey() {
-            return mSubKey;
-        }
-    }
-
-    /**
-     * {@link CompositeKey} subclass used to identify Notification info for a sender;
-     * it uses a combination of senderContactUri and senderContactName as the secondary key.
-     */
-    public static class SenderKey extends CompositeKey implements Parcelable {
-
-        private SenderKey(String deviceAddress, String key) {
-            super(deviceAddress, key);
-        }
-
-        SenderKey(MapMessage message) {
-            // Use a combination of senderName and senderContactUri for key. Ideally we would use
-            // only senderContactUri (which is encoded phone no.). However since some phones don't
-            // provide these, we fall back to senderName. Since senderName may not be unique, we
-            // include senderContactUri also to provide uniqueness in cases it is available.
-            this(message.getDeviceAddress(),
-                    message.getSenderName() + "/" + message.getSenderContactUri());
-        }
-
-        @Override
-        public String toString() {
-            return String.format("SenderKey: %s -- %s", getDeviceAddress(), getSubKey());
-        }
-
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeString(getDeviceAddress());
-            dest.writeString(getSubKey());
-        }
-
-        /** Creates {@link SenderKey} instances from {@link Parcel} sources. */
-        public static final Parcelable.Creator<SenderKey> CREATOR =
-                new Parcelable.Creator<SenderKey>() {
-                    @Override
-                    public SenderKey createFromParcel(Parcel source) {
-                        return new SenderKey(source.readString(), source.readString());
-                    }
-
-                    @Override
-                    public SenderKey[] newArray(int size) {
-                        return new SenderKey[size];
-                    }
-                };
-
-    }
-
-    /**
      * {@link CompositeKey} subclass used to identify specific messages; it uses message-handle as
      * the secondary key.
      */
diff --git a/src/com/android/car/messenger/MessengerService.java b/src/com/android/car/messenger/MessengerService.java
index 11fdd13..3ea681f 100644
--- a/src/com/android/car/messenger/MessengerService.java
+++ b/src/com/android/car/messenger/MessengerService.java
@@ -18,7 +18,6 @@
 import androidx.core.app.NotificationCompat;
 import androidx.core.app.RemoteInput;
 
-import com.android.car.messenger.MessengerDelegate.SenderKey;
 import com.android.car.messenger.bluetooth.BluetoothMonitor;
 import com.android.car.messenger.log.L;
 
diff --git a/src/com/android/car/messenger/SenderKey.java b/src/com/android/car/messenger/SenderKey.java
new file mode 100644
index 0000000..d1225c0
--- /dev/null
+++ b/src/com/android/car/messenger/SenderKey.java
@@ -0,0 +1,57 @@
+package com.android.car.messenger;
+
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * {@link CompositeKey} subclass used to identify Notification info for a sender;
+ * it uses a combination of senderContactUri and senderContactName as the secondary key.
+ */
+public class SenderKey extends CompositeKey implements Parcelable {
+
+    private SenderKey(String deviceAddress, String key) {
+        super(deviceAddress, key);
+    }
+
+    SenderKey(MapMessage message) {
+        // Use a combination of senderName and senderContactUri for key. Ideally we would use
+        // only senderContactUri (which is encoded phone no.). However since some phones don't
+        // provide these, we fall back to senderName. Since senderName may not be unique, we
+        // include senderContactUri also to provide uniqueness in cases it is available.
+        this(message.getDeviceAddress(),
+                message.getSenderName() + "/" + message.getSenderContactUri());
+    }
+
+    @Override
+    public String toString() {
+        return String.format("SenderKey: %s -- %s", getDeviceAddress(), getSubKey());
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeString(getDeviceAddress());
+        dest.writeString(getSubKey());
+    }
+
+    /** Creates {@link SenderKey} instances from {@link Parcel} sources. */
+    public static final Parcelable.Creator<SenderKey> CREATOR =
+            new Parcelable.Creator<SenderKey>() {
+                @Override
+                public SenderKey createFromParcel(Parcel source) {
+                    return new SenderKey(source.readString(), source.readString());
+                }
+
+                @Override
+                public SenderKey[] newArray(int size) {
+                    return new SenderKey[size];
+                }
+            };
+
+}
+
diff --git a/tests/robotests/src/com/android/car/messenger/MessengerDelegateTest.java b/tests/robotests/src/com/android/car/messenger/MessengerDelegateTest.java
index cf04da3..b160736 100644
--- a/tests/robotests/src/com/android/car/messenger/MessengerDelegateTest.java
+++ b/tests/robotests/src/com/android/car/messenger/MessengerDelegateTest.java
@@ -50,7 +50,7 @@
     private Intent mMessageOneIntent;
     private MapMessage mMessageOne;
     private MessengerDelegate.MessageKey mMessageOneKey;
-    private MessengerDelegate.SenderKey mSenderKey;
+    private SenderKey mSenderKey;
 
     @Before
     public void setUp() {
@@ -261,6 +261,6 @@
                 "Hello", /* timestamp= */ null, /* isReadOnPhone */ false);
         mMessageOne = MapMessage.parseFrom(mMessageOneIntent);
         mMessageOneKey = new MessengerDelegate.MessageKey(mMessageOne);
-        mSenderKey = new MessengerDelegate.SenderKey(mMessageOne);
+        mSenderKey = new SenderKey(mMessageOne);
     }
 }