package no.java.schedule.provider.parsers; import android.content.ContentResolver; import android.content.ContentValues; import android.content.SharedPreferences; import android.graphics.Color; import android.graphics.ColorMatrix; import android.net.Uri; import no.java.schedule.activities.tasks.LoadDatabaseFromIncogitoWebserviceTask; import no.java.schedule.provider.SessionsContract; import no.java.schedule.provider.constants.TrackJsonKeys; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class TrackParser extends AbstractScheduleParser { private int[] colors; private int nextColorIndex =0; public TrackParser(ContentResolver contentResolver, LoadDatabaseFromIncogitoWebserviceTask task, SharedPreferences hashStore) { super(contentResolver, task, hashStore); } protected void parse(String feedData) throws JSONException { task.progress("Deleting old tracks from database"); contentResolver.delete(SessionsContract.Tracks.CONTENT_URI, null, null); // Parse incoming JSON stream JSONObject conference = new JSONObject(feedData); JSONArray tracks = conference.getJSONArray("labels"); task.progress("Parsing tracks"); List<ContentValues> entries = new ArrayList <ContentValues>(tracks.length()); createColorCodes(tracks.length()); for (int i = 0; i < tracks.length(); i++) { JSONObject track = tracks.getJSONObject(i); entries.add(parse(track)); } contentResolver.bulkInsert(SessionsContract.Tracks.CONTENT_URI, entries.toArray(new ContentValues[entries.size()])); } void createColorCodes(int trackCount) { if (trackCount>0){ colors = new int[trackCount]; float angle = 0; float increment = 360/trackCount; int startColor = Color.BLUE; for (int i = 0; i < colors.length; i++) { colors[i] = rotateColor(startColor,angle); angle+=increment; } } } /** * Parse a given track {@link org.json.JSONObject} into the given * {@link android.content.ContentValues} for insertion into {@link no.java.schedule.provider.SessionsContract.Tracks#CONTENT_URI}. */ public ContentValues parse(JSONObject track) { ContentValues contentValues = new ContentValues(); final String title = track.optString(TrackJsonKeys.DISPLAYNAME, null); contentValues.put(SessionsContract.TracksColumns.TRACK, title); //int color = Integer.parseInt(track.optString(TrackJsonKeys.COLOR, null), 16); int color = findColorFromTitle(title); contentValues.put(SessionsContract.TracksColumns.COLOR, color); contentValues.put(SessionsContract.TracksColumns.VISIBLE, 1); return contentValues; } private int findColorFromTitle(String title) { return colors[nextColorIndex++]; } private int rotateColor(int color, float deg) { // Based on the com.example.android.apis.graphics.ColorPickerDialog of android api demos int r = Color.red(color); int g = Color.green(color); int b = Color.blue(color); ColorMatrix cm = new ColorMatrix(); ColorMatrix tmp = new ColorMatrix(); cm.setRGB2YUV(); tmp.setRotate(0, deg); cm.postConcat(tmp); tmp.setYUV2RGB(); cm.postConcat(tmp); final float[] a = cm.getArray(); int ir = Math.round(a[0] * r + a[1] * g + a[2] * b); int ig = Math.round(a[5] * r + a[6] * g + a[7] * b); int ib = Math.round(a[10] * r + a[11] * g + a[12] * b); return Color.argb(Color.alpha(color), pinToByte(ir),pinToByte(ig), pinToByte(ib)); } private int pinToByte(int n) { if (n < 0) { n = 0; } else if (n > 255) { n = 255; } return n; } public void parseTracks(Uri uri) throws JSONException, IOException { task.progress("Downloading tracks feed"); parse(readURI(uri)); } @Override protected String downloadingMessage() { return "Fetching tracks."; } @Override protected String nochangesMessage() { return "No changes to tracks."; } }