1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.telecom; 18 19 import android.annotation.IntDef; 20 import android.annotation.NonNull; 21 import android.os.Parcel; 22 import android.os.Parcelable; 23 24 import java.lang.annotation.Retention; 25 import java.lang.annotation.RetentionPolicy; 26 import java.util.Objects; 27 28 public final class PhoneAccountSuggestion implements Parcelable { 29 30 /** @hide */ 31 @Retention(RetentionPolicy.SOURCE) 32 @IntDef(value = {REASON_NONE, REASON_INTRA_CARRIER, REASON_FREQUENT, 33 REASON_USER_SET, REASON_OTHER}, prefix = { "REASON_" }) 34 public @interface SuggestionReason {} 35 36 /** 37 * Indicates that this account is not suggested for use, but is still available. 38 */ 39 public static final int REASON_NONE = 0; 40 41 /** 42 * Indicates that the {@link PhoneAccountHandle} is suggested because the number we're calling 43 * is on the same carrier, and therefore may have lower rates. 44 */ 45 public static final int REASON_INTRA_CARRIER = 1; 46 47 /** 48 * Indicates that the {@link PhoneAccountHandle} is suggested because the user uses it 49 * frequently for the number that we are calling. 50 */ 51 public static final int REASON_FREQUENT = 2; 52 53 /** 54 * Indicates that the {@link PhoneAccountHandle} is suggested because the user explicitly 55 * specified that it be used for the number we are calling. 56 */ 57 public static final int REASON_USER_SET = 3; 58 59 /** 60 * Indicates that the {@link PhoneAccountHandle} is suggested for a reason not otherwise 61 * enumerated here. 62 */ 63 public static final int REASON_OTHER = 4; 64 65 private PhoneAccountHandle mHandle; 66 private int mReason; 67 private boolean mShouldAutoSelect; 68 69 /** 70 * Creates a new instance of {@link PhoneAccountSuggestion}. This constructor is intended for 71 * use by apps implementing a {@link PhoneAccountSuggestionService}, and generally should not be 72 * used by dialer apps other than for testing purposes. 73 * 74 * @param handle The {@link PhoneAccountHandle} for this suggestion. 75 * @param reason The reason for this suggestion 76 * @param shouldAutoSelect Whether the dialer should automatically place the call using this 77 * account. See {@link #shouldAutoSelect()}. 78 */ PhoneAccountSuggestion(@onNull PhoneAccountHandle handle, @SuggestionReason int reason, boolean shouldAutoSelect)79 public PhoneAccountSuggestion(@NonNull PhoneAccountHandle handle, @SuggestionReason int reason, 80 boolean shouldAutoSelect) { 81 this.mHandle = handle; 82 this.mReason = reason; 83 this.mShouldAutoSelect = shouldAutoSelect; 84 } 85 PhoneAccountSuggestion(Parcel in)86 private PhoneAccountSuggestion(Parcel in) { 87 mHandle = in.readParcelable(PhoneAccountHandle.class.getClassLoader(), android.telecom.PhoneAccountHandle.class); 88 mReason = in.readInt(); 89 mShouldAutoSelect = in.readByte() != 0; 90 } 91 92 public static final @android.annotation.NonNull Creator<PhoneAccountSuggestion> CREATOR = 93 new Creator<PhoneAccountSuggestion>() { 94 @Override 95 public PhoneAccountSuggestion createFromParcel(Parcel in) { 96 return new PhoneAccountSuggestion(in); 97 } 98 99 @Override 100 public PhoneAccountSuggestion[] newArray(int size) { 101 return new PhoneAccountSuggestion[size]; 102 } 103 }; 104 105 /** 106 * @return The {@link PhoneAccountHandle} for this suggestion. 107 */ getPhoneAccountHandle()108 @NonNull public PhoneAccountHandle getPhoneAccountHandle() { 109 return mHandle; 110 } 111 112 /** 113 * @return The reason for this suggestion 114 */ getReason()115 public @SuggestionReason int getReason() { 116 return mReason; 117 } 118 119 /** 120 * Suggests whether the dialer should automatically place the call using this account without 121 * user interaction. This may be set on multiple {@link PhoneAccountSuggestion}s, and the dialer 122 * is free to choose which one to use. 123 * @return {@code true} if the hint is to auto-select, {@code false} otherwise. 124 */ shouldAutoSelect()125 public boolean shouldAutoSelect() { 126 return mShouldAutoSelect; 127 } 128 129 @Override describeContents()130 public int describeContents() { 131 return 0; 132 } 133 134 @Override writeToParcel(Parcel dest, int flags)135 public void writeToParcel(Parcel dest, int flags) { 136 dest.writeParcelable(mHandle, flags); 137 dest.writeInt(mReason); 138 dest.writeByte((byte) (mShouldAutoSelect ? 1 : 0)); 139 } 140 141 @Override equals(Object o)142 public boolean equals(Object o) { 143 if (this == o) return true; 144 if (o == null || getClass() != o.getClass()) return false; 145 PhoneAccountSuggestion that = (PhoneAccountSuggestion) o; 146 return mReason == that.mReason 147 && mShouldAutoSelect == that.mShouldAutoSelect 148 && Objects.equals(mHandle, that.mHandle); 149 } 150 151 @Override hashCode()152 public int hashCode() { 153 return Objects.hash(mHandle, mReason, mShouldAutoSelect); 154 } 155 } 156