1718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana/*
2718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * Copyright (C) 2009 The Android Open Source Project
3718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana *
4718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * Licensed under the Apache License, Version 2.0 (the "License");
5718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * you may not use this file except in compliance with the License.
6718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * You may obtain a copy of the License at
7718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana *
8718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana *      http://www.apache.org/licenses/LICENSE-2.0
9718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana *
10718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * Unless required by applicable law or agreed to in writing, software
11718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * distributed under the License is distributed on an "AS IS" BASIS,
12718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * See the License for the specific language governing permissions and
14718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * limitations under the License.
15718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana */
16718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana
17718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintanapackage android.content;
18718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana
19718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintanaimport android.text.TextUtils;
20ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintanaimport android.os.Parcelable;
21ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintanaimport android.os.Parcel;
22718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana
23718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana/**
24718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * Value type that represents a SyncAdapterType. This object overrides {@link #equals} and
25718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana * {@link #hashCode}, making it suitable for use as the key of a {@link java.util.Map}
26718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana */
27ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintanapublic class SyncAdapterType implements Parcelable {
28718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana    public final String authority;
29718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana    public final String accountType;
30e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana    public final boolean isKey;
31e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana    private final boolean userVisible;
32e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana    private final boolean supportsUploading;
33718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana
34e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana    public SyncAdapterType(String authority, String accountType, boolean userVisible,
35e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana            boolean supportsUploading) {
36718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        if (TextUtils.isEmpty(authority)) {
37718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana            throw new IllegalArgumentException("the authority must not be empty: " + authority);
38718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        }
39718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        if (TextUtils.isEmpty(accountType)) {
40718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana            throw new IllegalArgumentException("the accountType must not be empty: " + accountType);
41718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        }
42718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        this.authority = authority;
43718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        this.accountType = accountType;
444a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana        this.userVisible = userVisible;
45e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        this.supportsUploading = supportsUploading;
46e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        this.isKey = false;
47e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana    }
48e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana
49e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana    private SyncAdapterType(String authority, String accountType) {
50e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        if (TextUtils.isEmpty(authority)) {
51e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana            throw new IllegalArgumentException("the authority must not be empty: " + authority);
52e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        }
53e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        if (TextUtils.isEmpty(accountType)) {
54e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana            throw new IllegalArgumentException("the accountType must not be empty: " + accountType);
55e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        }
56e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        this.authority = authority;
57e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        this.accountType = accountType;
58e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        this.userVisible = true;
59e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        this.supportsUploading = true;
60e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        this.isKey = true;
61e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana    }
62e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana
63e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana    public boolean supportsUploading() {
64e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        if (isKey) {
65e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana            throw new IllegalStateException(
66e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana                    "this method is not allowed to be called when this is a key");
67e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        }
68e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        return supportsUploading;
69e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana    }
70e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana
71e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana    public boolean isUserVisible() {
72e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        if (isKey) {
73e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana            throw new IllegalStateException(
74e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana                    "this method is not allowed to be called when this is a key");
75e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        }
76e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        return userVisible;
774a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana    }
784a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana
794a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana    public static SyncAdapterType newKey(String authority, String accountType) {
80e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        return new SyncAdapterType(authority, accountType);
81718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana    }
82718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana
83718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana    public boolean equals(Object o) {
84718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        if (o == this) return true;
85718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        if (!(o instanceof SyncAdapterType)) return false;
86718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        final SyncAdapterType other = (SyncAdapterType)o;
87e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        // don't include userVisible or supportsUploading in the equality check
88718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        return authority.equals(other.authority) && accountType.equals(other.accountType);
89718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana    }
90718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana
91718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana    public int hashCode() {
92718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        int result = 17;
93718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        result = 31 * result + authority.hashCode();
94718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        result = 31 * result + accountType.hashCode();
95e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        // don't include userVisible or supportsUploading  the hash
96718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana        return result;
97718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana    }
98718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana
99718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana    public String toString() {
100e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        if (isKey) {
101e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana            return "SyncAdapterType Key {name=" + authority
102e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana                    + ", type=" + accountType
103e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana                    + "}";
104e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        } else {
105e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana            return "SyncAdapterType {name=" + authority
106e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana                    + ", type=" + accountType
107e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana                    + ", userVisible=" + userVisible
108e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana                    + ", supportsUploading=" + supportsUploading
109e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana                    + "}";
110e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        }
111718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana    }
112ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana
113ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana    public int describeContents() {
114ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana        return 0;
115ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana    }
116ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana
117ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana    public void writeToParcel(Parcel dest, int flags) {
118e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        if (isKey) {
119e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana            throw new IllegalStateException("keys aren't parcelable");
120e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        }
121e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana
122ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana        dest.writeString(authority);
123ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana        dest.writeString(accountType);
1244a6679b97e0285c5b65ec5c0d9080ff90d3e9e81Fred Quintana        dest.writeInt(userVisible ? 1 : 0);
125e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        dest.writeInt(supportsUploading ? 1 : 0);
126ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana    }
127ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana
128ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana    public SyncAdapterType(Parcel source) {
129e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana        this(
130e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana                source.readString(),
131e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana                source.readString(),
132e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana                source.readInt() != 0,
133e0616ffb741b64e3bc7a1e3ad9def3d50eee53fdFred Quintana                source.readInt() != 0);
134ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana    }
135ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana
136ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana    public static final Creator<SyncAdapterType> CREATOR = new Creator<SyncAdapterType>() {
137ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana        public SyncAdapterType createFromParcel(Parcel source) {
138ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana            return new SyncAdapterType(source);
139ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana        }
140ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana
141ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana        public SyncAdapterType[] newArray(int size) {
142ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana            return new SyncAdapterType[size];
143ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana        }
144ac9385ef3105fb7464e1f46049c62755a8b7f0e9Fred Quintana    };
145718d8a2d7ff3e864a73879eb646f46c14ab74d07Fred Quintana}