com.google.samples.apps.iosched.sync.userdata.util.UserActionHelper.java Source code

Java tutorial

Introduction

Here is the source code for com.google.samples.apps.iosched.sync.userdata.util.UserActionHelper.java

Source

/*
 * Copyright 2014 Google Inc. All rights reserved.
 *
 * 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.google.samples.apps.iosched.sync.userdata.util;

import android.content.ContentProviderOperation;
import android.content.Context;
import android.content.OperationApplicationException;
import android.os.RemoteException;
import android.util.Log;

import com.google.samples.apps.iosched.provider.ScheduleContract;
import com.google.samples.apps.iosched.sync.userdata.UserAction;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.stream.JsonReader;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import static com.google.samples.apps.iosched.util.LogUtils.makeLogTag;

public class UserActionHelper {
    private static final String TAG = makeLogTag(UserActionHelper.class);

    static public void updateContentProvider(Context context, List<UserAction> userActions, String account) {
        ArrayList<ContentProviderOperation> batch = new ArrayList<ContentProviderOperation>();
        for (UserAction action : userActions) {
            batch.add(createUpdateOperation(context, action, account));
        }
        try {
            context.getContentResolver().applyBatch(ScheduleContract.CONTENT_AUTHORITY, batch);
        } catch (RemoteException e) {
            Log.e(TAG, "Could not apply operations", e);
        } catch (OperationApplicationException e) {
            Log.e(TAG, "Could not apply operations", e);
        }
    }

    static private ContentProviderOperation createUpdateOperation(Context context, UserAction action,
            String account) {
        if (action.type == UserAction.TYPE.ADD_STAR) {
            return ContentProviderOperation
                    .newInsert(ScheduleContract.addOverrideAccountName(ScheduleContract.MySchedule.CONTENT_URI,
                            account))
                    .withValue(ScheduleContract.MySchedule.MY_SCHEDULE_DIRTY_FLAG, "0")
                    .withValue(ScheduleContract.MySchedule.SESSION_ID, action.sessionId).build();
        } else {
            return ContentProviderOperation
                    .newDelete(ScheduleContract.addOverrideAccountName(ScheduleContract.MySchedule.CONTENT_URI,
                            account))
                    .withSelection(
                            ScheduleContract.MySchedule.SESSION_ID + " = ? AND "
                                    + ScheduleContract.MySchedule.MY_SCHEDULE_ACCOUNT_NAME + " = ? ",
                            new String[] { action.sessionId, account })
                    .build();
        }
    }

    public static String serializeUserActions(List<UserAction> actions) {
        JsonArray array = new JsonArray();
        for (UserAction action : actions) {
            JsonObject obj = new JsonObject();
            obj.add("type", new JsonPrimitive(action.type.name()));
            obj.add("id", new JsonPrimitive(action.sessionId));
            array.add(obj);
        }
        return array.toString();
    }

    public static List<UserAction> deserializeUserActions(String str) {
        try {
            ArrayList<UserAction> actions = new ArrayList<UserAction>();
            JsonReader reader = new JsonReader(new StringReader(str));
            reader.beginArray();
            while (reader.hasNext()) {
                reader.beginObject();
                UserAction action = new UserAction();
                while (reader.hasNext()) {
                    String key = reader.nextName();
                    if ("type".equals(key)) {
                        action.type = UserAction.TYPE.valueOf(reader.nextString());
                    } else if ("id".equals(key)) {
                        action.sessionId = reader.nextString();
                    } else {
                        throw new RuntimeException("Invalid key " + key + " in serialized UserAction: " + str);
                    }
                }
                reader.endObject();
                actions.add(action);
            }
            reader.endArray();
            return actions;
        } catch (IOException ex) {
            throw new RuntimeException("Error deserializing UserActions: " + str, ex);
        }
    }
}