diff options
| -rw-r--r-- | api/current.txt | 13 | ||||
| -rw-r--r-- | telecomm/java/android/telecomm/ConnectionService.java | 6 | ||||
| -rw-r--r-- | telecomm/java/android/telecomm/Subscription.aidl | 22 | ||||
| -rw-r--r-- | telecomm/java/android/telecomm/Subscription.java | 205 | ||||
| -rw-r--r-- | telecomm/java/com/android/internal/telecomm/ITelecommService.aidl | 16 | ||||
| -rw-r--r-- | telephony/java/android/telephony/TelephonyManager.java | 53 |
6 files changed, 297 insertions, 18 deletions
diff --git a/api/current.txt b/api/current.txt index 76b6c84f1ee3..30ccead984b5 100644 --- a/api/current.txt +++ b/api/current.txt @@ -27737,8 +27737,17 @@ package android.telecomm { } public class Subscription implements android.os.Parcelable { - ctor public Subscription(); + ctor public Subscription(android.content.ComponentName, java.lang.String, android.net.Uri, int, int, int, boolean, boolean); method public int describeContents(); + method public android.content.ComponentName getComponentName(); + method public android.net.Uri getHandle(); + method public android.graphics.drawable.Drawable getIcon(android.content.Context); + method public android.graphics.drawable.Drawable getIcon(android.content.Context, int); + method public java.lang.String getId(); + method public java.lang.String getLabel(android.content.Context); + method public java.lang.String getShortDescription(android.content.Context); + method public boolean isEnabled(); + method public boolean isSystemDefault(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; } @@ -28202,6 +28211,7 @@ package android.telephony { method public java.lang.String getSimSerialNumber(); method public int getSimState(); method public java.lang.String getSubscriberId(); + method public java.util.List<android.telecomm.Subscription> getSubscriptions(); method public java.lang.String getVoiceMailAlphaTag(); method public java.lang.String getVoiceMailNumber(); method public boolean hasIccCard(); @@ -28226,6 +28236,7 @@ package android.telephony { field public static final java.lang.String EXTRA_STATE_IDLE; field public static final java.lang.String EXTRA_STATE_OFFHOOK; field public static final java.lang.String EXTRA_STATE_RINGING; + field public static final java.lang.String EXTRA_SUBSCRIPTION = "subscription"; field public static final int NETWORK_TYPE_1xRTT = 7; // 0x7 field public static final int NETWORK_TYPE_CDMA = 4; // 0x4 field public static final int NETWORK_TYPE_EDGE = 2; // 0x2 diff --git a/telecomm/java/android/telecomm/ConnectionService.java b/telecomm/java/android/telecomm/ConnectionService.java index d97450900a95..8a4e12388c97 100644 --- a/telecomm/java/android/telecomm/ConnectionService.java +++ b/telecomm/java/android/telecomm/ConnectionService.java @@ -20,15 +20,9 @@ import android.net.Uri; import android.os.Bundle; import android.telephony.DisconnectCause; -import android.os.SystemClock; - import java.util.Collection; import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; import java.util.Map; -import java.util.Set; /** * A {@link android.app.Service} that provides telephone connections to diff --git a/telecomm/java/android/telecomm/Subscription.aidl b/telecomm/java/android/telecomm/Subscription.aidl new file mode 100644 index 000000000000..6327fcc15dd8 --- /dev/null +++ b/telecomm/java/android/telecomm/Subscription.aidl @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.telecomm; + +/** + * {@hide} + */ +parcelable Subscription; diff --git a/telecomm/java/android/telecomm/Subscription.java b/telecomm/java/android/telecomm/Subscription.java index f187f4d176be..964db4a5c05b 100644 --- a/telecomm/java/android/telecomm/Subscription.java +++ b/telecomm/java/android/telecomm/Subscription.java @@ -16,25 +16,169 @@ package android.telecomm; +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; +import android.telephony.Rlog; +import android.util.DisplayMetrics; +import android.util.Log; + +import java.util.MissingResourceException; /** * Represents a distinct subscription, line of service or call placement method that - * a {@link ConnectionService} can use to place phone calls. + * the system can use to place phone calls. */ public class Subscription implements Parcelable { - public Subscription() {} + private static final int NO_DENSITY = -1; + + private static final String LOG_TAG = "Subscription"; + + private final ComponentName mComponentName; + private final String mId; + private final Uri mHandle; + private final int mLabelResId; + private final int mShortDescriptionResId; + private final int mIconResId; + private final boolean mIsEnabled; + private final boolean mIsSystemDefault; + + public Subscription( + ComponentName componentName, + String id, + Uri handle, + int labelResId, + int shortDescriptionResId, + int iconResId, + boolean isEnabled, + boolean isSystemDefault) { + mComponentName = componentName; + mId = id; + mHandle = handle; + mLabelResId = labelResId; + mShortDescriptionResId = shortDescriptionResId; + mIconResId = iconResId; + mIsSystemDefault = isSystemDefault; + mIsEnabled = isEnabled; + } + + /** + * The {@code ComponentName} of the {@link android.telecomm.ConnectionService} which is + * responsible for making phone calls using this {@code Subscription}. + * + * @return A suitable {@code ComponentName}. + */ + public ComponentName getComponentName() { + return mComponentName; + } + + /** + * A unique identifier for this {@code Subscription}, generated by and meaningful to the + * {@link android.telecomm.ConnectionService} that created it. + * + * @return A unique identifier for this {@code Subscription}. + */ + public String getId() { + return mId; + } + + /** + * The handle (e.g., a phone number) associated with this {@code Subscription}. This represents + * the destination from which outgoing calls using this {@code Subscription} will appear to come + * from, if applicable, and the destination to which incoming calls using this + * {@code Subscription} may be addressed. + * + * @return A handle expressed as a {@code Uri}, for example, a phone number. + */ + public Uri getHandle() { + return mHandle; + } + + /** + * A short string label describing this {@code Subscription}. + * + * @param context The invoking {@code Context}, used for retrieving resources. + * + * @return A label for this {@code Subscription}. + */ + public String getLabel(Context context) { + return getString(context, mLabelResId); + } + + /** + * A short paragraph describing this {@code Subscription}. + * + * @param context The invoking {@code Context}, used for retrieving resources. + * + * @return A description for this {@code Subscription}. + */ + public String getShortDescription(Context context) { + return getString(context, mShortDescriptionResId); + } + + /** + * An icon to represent this {@code Subscription} in a user interface. + * + * @param context The invoking {@code Context}, used for retrieving resources. + * + * @return An icon for this {@code Subscription}. + */ + public Drawable getIcon(Context context) { + return getIcon(context, mIconResId, NO_DENSITY); + } + + /** + * An icon to represent this {@code Subscription} in a user interface. + * + * @param context The invoking {@code Context}, used for retrieving resources. + * @param density A display density from {@link DisplayMetrics}. + * + * @return An icon for this {@code Subscription}. + */ + public Drawable getIcon(Context context, int density) { + return getIcon(context, mIconResId, density); + } + + /** + * Whether this {@code Subscription} is enabled for use. + * + * @return {@code true} if this {@code Subscription} is enabled. + */ + public boolean isEnabled() { + return mIsEnabled; + } + + /** + * Whether this {@code Subscription} is the system default. + * + * @return {@code true} if this {@code Subscription} is the system default. + */ + public boolean isSystemDefault() { + return mIsSystemDefault; + } public int describeContents() { return 0; } - public void writeToParcel(Parcel out, int flags) {} + public void writeToParcel(Parcel out, int flags) { + out.writeParcelable(mComponentName, flags); + out.writeString(mId); + out.writeString(mHandle != null ? mHandle.toString() : ""); + out.writeInt(mLabelResId); + out.writeInt(mShortDescriptionResId); + out.writeInt(mIconResId); + out.writeInt(mIsEnabled ? 1 : 0); + out.writeInt(mIsSystemDefault ? 1 : 0); + } - public static final Parcelable.Creator<Subscription> CREATOR - = new Parcelable.Creator<Subscription>() { + public static final Creator<Subscription> CREATOR + = new Creator<Subscription>() { public Subscription createFromParcel(Parcel in) { return new Subscription(in); } @@ -44,5 +188,54 @@ public class Subscription implements Parcelable { } }; - private Subscription(Parcel in) {} + private Subscription(Parcel in) { + mComponentName = in.readParcelable(getClass().getClassLoader()); + mId = in.readString(); + String uriString = in.readString(); + mHandle = uriString.length() > 0 ? Uri.parse(uriString) : null; + mLabelResId = in.readInt(); + mShortDescriptionResId = in.readInt(); + mIconResId = in.readInt(); + mIsEnabled = in.readInt() == 1; + mIsSystemDefault = in.readInt() == 1; + } + + private String getString(Context context, int resId) { + Context packageContext; + try { + packageContext = context.createPackageContext(mComponentName.getPackageName(), 0); + } catch (PackageManager.NameNotFoundException e) { + if (Rlog.isLoggable(LOG_TAG, Log.WARN)) { + Rlog.w(LOG_TAG, "Cannot find package " + mComponentName.getPackageName()); + } + return null; + } + String result = packageContext.getString(resId); + if (result == null && Rlog.isLoggable(LOG_TAG, Log.WARN)) { + Rlog.w(LOG_TAG, "Cannot find string " + resId + " in package " + + mComponentName.getPackageName()); + } + return result; + } + + private Drawable getIcon(Context context, int resId, int density) { + Context packageContext; + try { + packageContext = context.createPackageContext(mComponentName.getPackageName(), 0); + } catch (PackageManager.NameNotFoundException e) { + if (Rlog.isLoggable(LOG_TAG, Log.WARN)) { + Rlog.w(LOG_TAG, "Cannot find package " + mComponentName.getPackageName()); + } + return null; + } + try { + return density == NO_DENSITY ? + packageContext.getResources().getDrawable(resId) : + packageContext.getResources().getDrawableForDensity(resId, density); + } catch (MissingResourceException e) { + Rlog.e(LOG_TAG, "Cannot find icon " + resId + " in package " + + mComponentName.getPackageName() + ": " + e.toString()); + return null; + } + } } diff --git a/telecomm/java/com/android/internal/telecomm/ITelecommService.aidl b/telecomm/java/com/android/internal/telecomm/ITelecommService.aidl index 638b86aa149c..dc2b8694c66e 100644 --- a/telecomm/java/com/android/internal/telecomm/ITelecommService.aidl +++ b/telecomm/java/com/android/internal/telecomm/ITelecommService.aidl @@ -16,6 +16,7 @@ package com.android.internal.telecomm; +import android.telecomm.Subscription; import android.content.ComponentName; /** @@ -45,4 +46,19 @@ interface ITelecommService { * Returns the component name of the phone application installed on the system partition. */ ComponentName getSystemPhoneApplication(); + + /** + * Gets a list of Subscriptions. + */ + List<Subscription> getSubscriptions(); + + /** + * Sets the enabled state of a given Subscription. + */ + void setEnabled(in Subscription subscription, boolean enabled); + + /** + * Sets a given Subscription as the system default. + */ + void setSystemDefault(in Subscription subscription); } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 50bbb1edc962..3fde36e9b666 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -19,15 +19,12 @@ package android.telephony; import android.annotation.SystemApi; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; -import android.content.ComponentName; import android.content.Context; import android.os.Bundle; -import android.os.Handler; -import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; -import android.telephony.Rlog; +import android.telecomm.Subscription; import android.util.Log; import com.android.internal.telecomm.ITelecommService; @@ -40,7 +37,6 @@ import com.android.internal.telephony.TelephonyProperties; import java.io.FileInputStream; import java.io.IOException; -import java.util.HashMap; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -302,6 +298,17 @@ public class TelephonyManager { public static final String EXTRA_INCOMING_NUMBER = "incoming_number"; /** + * The lookup key used with an {@link android.content.Intent#ACTION_CALL} or + * {@link android.content.Intent#ACTION_DIAL} {@code Intent} for a {@link Subscription} + * object indicating a preference when making a phone connection. + * + * <p class="note"> + * Retrieve with + * {@link android.content.Intent#getParcelableExtra(String)}. + */ + public static final String EXTRA_SUBSCRIPTION = "subscription"; + + /** * Broadcast intent action indicating that a precise call state * (cellular) on the device has changed. * @@ -3112,4 +3119,40 @@ public class TelephonyManager { } return false; } + + /** + * Return a list of Subscriptions that can be used to indicate a preference when making + * a phone call. + * + * @see #EXTRA_SUBSCRIPTION + * @return A list of {@code Subscription} objects. + */ + public List<Subscription> getSubscriptions() { + try { + return getTelecommService().getSubscriptions(); + } catch (RemoteException e) { + Log.e(TAG, "Error calling ITelephony#getSubscriptions", e); + } + return null; + } + + /** @hide */ + @SystemApi + public void setEnabled(Subscription subscription, boolean enabled) { + try { + getTelecommService().setEnabled(subscription, enabled); + } catch (RemoteException e) { + Log.e(TAG, "Error calling ITelephony#setEnabled", e); + } + } + + /** @hide */ + @SystemApi + public void setSystemDefault(Subscription subscription) { + try { + getTelecommService().setSystemDefault(subscription); + } catch (RemoteException e) { + Log.e(TAG, "Error calling ITelephony#setSystemDefault", e); + } + } } |