package com.boardgamegeek.export; import android.content.ContentProviderOperation; import android.content.ContentProviderOperation.Builder; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; import com.boardgamegeek.R; import com.boardgamegeek.export.model.PlayerColor; import com.boardgamegeek.export.model.User; import com.boardgamegeek.provider.BggContract.Buddies; import com.boardgamegeek.provider.BggContract.PlayerColors; import com.boardgamegeek.util.ResolverUtils; import com.google.gson.Gson; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import java.util.ArrayList; public class UserStep implements Step { @NonNull @Override public String getFileName() { return "users.json"; } @NonNull @Override public String getDescription(@NonNull Context context) { return context.getString(R.string.backup_type_user); } @Nullable @Override public Cursor getCursor(@NonNull Context context) { return context.getContentResolver().query( Buddies.CONTENT_URI, User.PROJECTION, null, null, null); } @Override public void writeJsonRecord(@NonNull Context context, @NonNull Cursor cursor, @NonNull Gson gson, @NonNull JsonWriter writer) { User user = User.fromCursor(cursor); user.addColors(context); if (user.hasColors()) { gson.toJson(user, User.class, writer); } } @Override public void initializeImport(Context context) { } @Override public void importRecord(@NonNull Context context, @NonNull Gson gson, @NonNull JsonReader reader) { User user = gson.fromJson(reader, User.class); ContentResolver resolver = context.getContentResolver(); String name = user.getName(); if (ResolverUtils.rowExists(resolver, Buddies.buildBuddyUri(name))) { ArrayList<ContentProviderOperation> batch = new ArrayList<>(); for (PlayerColor color : user.getColors()) { if (!TextUtils.isEmpty(color.getColor())) { Builder builder; final int sortOrder = color.getSort(); if (ResolverUtils.rowExists(resolver, PlayerColors.buildUserUri(name, sortOrder))) { builder = ContentProviderOperation.newUpdate(PlayerColors.buildUserUri(name, sortOrder)); } else { builder = ContentProviderOperation.newInsert(PlayerColors.buildUserUri(name)) .withValue(PlayerColors.PLAYER_COLOR_SORT_ORDER, sortOrder); } batch.add(builder.withValue(PlayerColors.PLAYER_COLOR, color.getColor()).build()); } } ResolverUtils.applyBatch(context, batch); } } }