• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 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.provider;
18 
19 import android.net.Uri;
20 import android.content.ContentProviderClient;
21 import android.content.ContentValues;
22 import android.content.ContentProviderOperation;
23 import android.content.ContentUris;
24 import android.accounts.Account;
25 import android.database.Cursor;
26 import android.os.RemoteException;
27 import android.util.Pair;
28 
29 /**
30  * The ContentProvider contract for associating data with ana data array account.
31  * This may be used by providers that want to store this data in a standard way.
32  */
33 public class SyncStateContract {
34     public interface Columns extends BaseColumns {
35         /**
36          * A reference to the name of the account to which this data belongs
37          * <P>Type: STRING</P>
38          */
39         public static final String ACCOUNT_NAME = "account_name";
40 
41         /**
42          * A reference to the type of the account to which this data belongs
43          * <P>Type: STRING</P>
44          */
45         public static final String ACCOUNT_TYPE = "account_type";
46 
47         /**
48          * The sync data associated with this account.
49          * <P>Type: NONE</P>
50          */
51         public static final String DATA = "data";
52     }
53 
54     public static class Constants implements Columns {
55         public static final String CONTENT_DIRECTORY = "syncstate";
56     }
57 
58     public static final class Helpers {
59         private static final String[] DATA_PROJECTION = new String[]{Columns.DATA, Columns._ID};
60         private static final String SELECT_BY_ACCOUNT =
61                 Columns.ACCOUNT_NAME + "=? AND " + Columns.ACCOUNT_TYPE + "=?";
62 
63         /**
64          * Get the sync state that is associated with the account or null.
65          * @param provider the {@link ContentProviderClient} that is to be used to communicate
66          * with the {@link android.content.ContentProvider} that contains the sync state.
67          * @param uri the uri of the sync state
68          * @param account the {@link Account} whose sync state should be returned
69          * @return the sync state or null if there is no sync state associated with the account
70          * @throws RemoteException if there is a failure communicating with the remote
71          * {@link android.content.ContentProvider}
72          */
get(ContentProviderClient provider, Uri uri, Account account)73         public static byte[] get(ContentProviderClient provider, Uri uri,
74                 Account account) throws RemoteException {
75             Cursor c = provider.query(uri, DATA_PROJECTION, SELECT_BY_ACCOUNT,
76                     new String[]{account.name, account.type}, null);
77             try {
78                 if (c.moveToNext()) {
79                     return c.getBlob(c.getColumnIndexOrThrow(Columns.DATA));
80                 }
81             } finally {
82                 c.close();
83             }
84             return null;
85         }
86 
87         /**
88          * Assigns the data array as the sync state for the given account.
89          * @param provider the {@link ContentProviderClient} that is to be used to communicate
90          * with the {@link android.content.ContentProvider} that contains the sync state.
91          * @param uri the uri of the sync state
92          * @param account the {@link Account} whose sync state should be set
93          * @param data the byte[] that contains the sync state
94          * @throws RemoteException if there is a failure communicating with the remote
95          * {@link android.content.ContentProvider}
96          */
set(ContentProviderClient provider, Uri uri, Account account, byte[] data)97         public static void set(ContentProviderClient provider, Uri uri,
98                 Account account, byte[] data) throws RemoteException {
99             ContentValues values = new ContentValues();
100             values.put(Columns.DATA, data);
101             values.put(Columns.ACCOUNT_NAME, account.name);
102             values.put(Columns.ACCOUNT_TYPE, account.type);
103             provider.insert(uri, values);
104         }
105 
insert(ContentProviderClient provider, Uri uri, Account account, byte[] data)106         public static Uri insert(ContentProviderClient provider, Uri uri,
107                 Account account, byte[] data) throws RemoteException {
108             ContentValues values = new ContentValues();
109             values.put(Columns.DATA, data);
110             values.put(Columns.ACCOUNT_NAME, account.name);
111             values.put(Columns.ACCOUNT_TYPE, account.type);
112             return provider.insert(uri, values);
113         }
114 
update(ContentProviderClient provider, Uri uri, byte[] data)115         public static void update(ContentProviderClient provider, Uri uri, byte[] data)
116                 throws RemoteException {
117             ContentValues values = new ContentValues();
118             values.put(Columns.DATA, data);
119             provider.update(uri, values, null, null);
120         }
121 
getWithUri(ContentProviderClient provider, Uri uri, Account account)122         public static Pair<Uri, byte[]> getWithUri(ContentProviderClient provider, Uri uri,
123                 Account account) throws RemoteException {
124             Cursor c = provider.query(uri, DATA_PROJECTION, SELECT_BY_ACCOUNT,
125                     new String[]{account.name, account.type}, null);
126             try {
127                 if (c.moveToNext()) {
128                     long rowId = c.getLong(1);
129                     byte[] blob = c.getBlob(c.getColumnIndexOrThrow(Columns.DATA));
130                     return Pair.create(ContentUris.withAppendedId(uri, rowId), blob);
131                 }
132             } finally {
133                 c.close();
134             }
135             return null;
136         }
137 
138         /**
139          * Creates and returns a ContentProviderOperation that assigns the data array as the
140          * sync state for the given account.
141          * @param uri the uri of the sync state
142          * @param account the {@link Account} whose sync state should be set
143          * @param data the byte[] that contains the sync state
144          * @return the new ContentProviderOperation that assigns the data array as the
145          * account's sync state
146          */
newSetOperation(Uri uri, Account account, byte[] data)147         public static ContentProviderOperation newSetOperation(Uri uri,
148                 Account account, byte[] data) {
149             ContentValues values = new ContentValues();
150             values.put(Columns.DATA, data);
151             return ContentProviderOperation
152                     .newInsert(uri)
153                     .withValue(Columns.ACCOUNT_NAME, account.name)
154                     .withValue(Columns.ACCOUNT_TYPE, account.type)
155                     .withValues(values)
156                     .build();
157         }
158 
159         /**
160          * Creates and returns a ContentProviderOperation that assigns the data array as the
161          * sync state for the given account.
162          * @param uri the uri of the specific sync state to set
163          * @param data the byte[] that contains the sync state
164          * @return the new ContentProviderOperation that assigns the data array as the
165          * account's sync state
166          */
newUpdateOperation(Uri uri, byte[] data)167         public static ContentProviderOperation newUpdateOperation(Uri uri, byte[] data) {
168             ContentValues values = new ContentValues();
169             values.put(Columns.DATA, data);
170             return ContentProviderOperation
171                     .newUpdate(uri)
172                     .withValues(values)
173                     .build();
174         }
175     }
176 }
177