/* * Copyright (C) 2011 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 com.example.android.voicemail.common.core; import android.net.Uri; /** * A simple immutable data object to represent a voicemail. */ public final class VoicemailImpl implements Voicemail { private final Long mTimestamp; private final String mNumber; private final Long mId; private final Long mDuration; private final String mSource; private final String mProviderData; private final Uri mUri; private final Boolean mIsRead; private final boolean mHasContent; // TODO: 5. We should probably consider changing "number" everywhere to "contact", given that // it's not clear that these will be restricted to telephone numbers. private VoicemailImpl( Long timestamp, String number, Long id, Long duration, String source, String providerData, Uri uri, Boolean isRead, boolean hasContent) { mId = id; mNumber = number; mDuration = duration; mTimestamp = timestamp; mSource = source; mProviderData = providerData; mUri = uri; mIsRead = isRead; mHasContent = hasContent; } /** * Create a {@link Builder} for a new {@link Voicemail} to be inserted. * <p> * The number and the timestamp are mandatory for insertion. */ public static Builder createForInsertion(long timestamp, String number) { return new Builder().setNumber(number).setTimestamp(timestamp); } /** * Create a {@link Builder} for updating a {@link Voicemail}. * <p> * Only the id of the voicemail to be updated is mandatory. */ public static Builder createForUpdate(long id) { return new Builder().setId(id); } /** * Create a {@link Builder} for a new {@link Voicemail}, such as one suitable for returning from * a list of results or creating from scratch. */ public static Builder createEmptyBuilder() { return new Builder(); } /** * Builder pattern for creating a {@link VoicemailImpl}. * <p> * All fields are optional, and can be set with the various {@code setXXX} methods. * <p> * This class is <b>not thread safe</b> */ public static class Builder { private Long mBuilderTimestamp; private String mBuilderNumber; private Long mBuilderId; private Long mBuilderDuration; private String mBuilderSourcePackage; private String mBuilderSourceData; private Uri mBuilderUri; private Boolean mBuilderIsRead; private boolean mBuilderHasContent; /** You should use the correct factory method to construct a builder. */ private Builder() { } public Builder setNumber(String number) { mBuilderNumber = number; return this; } public Builder setTimestamp(long timestamp) { mBuilderTimestamp = timestamp; return this; } public Builder setId(long id) { mBuilderId = id; return this; } public Builder setDuration(long duration) { mBuilderDuration = duration; return this; } public Builder setSourcePackage(String sourcePackage) { mBuilderSourcePackage = sourcePackage; return this; } public Builder setSourceData(String sourceData) { mBuilderSourceData = sourceData; return this; } public Builder setUri(Uri uri) { mBuilderUri = uri; return this; } public Builder setIsRead(boolean isRead) { mBuilderIsRead = isRead; return this; } public Builder setHasContent(boolean hasContent) { mBuilderHasContent = hasContent; return this; } public VoicemailImpl build() { return new VoicemailImpl(mBuilderTimestamp, mBuilderNumber, mBuilderId, mBuilderDuration, mBuilderSourcePackage, mBuilderSourceData, mBuilderUri, mBuilderIsRead, mBuilderHasContent); } } @Override public long getId() { return hasId() ? mId : -1; } @Override public boolean hasId() { return mId != null; } @Override public String getNumber() { return mNumber; } @Override public boolean hasNumber() { return mNumber != null; } @Override public long getTimestampMillis() { return hasTimestampMillis() ? mTimestamp : 0; } @Override public boolean hasTimestampMillis() { return mTimestamp != null; } @Override public long getDuration() { return hasDuration() ? mDuration : 0; } @Override public boolean hasDuration() { return mDuration != null; } @Override public String getSourcePackage() { return mSource; } @Override public boolean hasSourcePackage() { return mSource != null; } @Override public String getSourceData() { return mProviderData; } @Override public boolean hasSourceData() { return mProviderData != null; } @Override public Uri getUri() { return mUri; } @Override public boolean hasUri() { return mUri != null; } @Override public boolean isRead() { return hasRead() ? mIsRead : false; } @Override public boolean hasRead() { return mIsRead != null; } @Override public boolean hasContent() { return mHasContent; } @Override public String toString() { return "VoicemailImpl [mTimestamp=" + mTimestamp + ", mNumber=" + mNumber + ", mId=" + mId + ", mDuration=" + mDuration + ", mSource=" + mSource + ", mProviderData=" + mProviderData + ", mUri=" + mUri + ", mIsRead=" + mIsRead + ", mHasContent=" + mHasContent + "]"; } }