/* * Copyright (C) 2009 Android Shuffle Open Source Project * * 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 org.dodgybits.shuffle.android.core.model.persistence; import java.util.Calendar; import java.util.TimeZone; import org.dodgybits.android.shuffle.R; import org.dodgybits.shuffle.android.core.model.Context; import org.dodgybits.shuffle.android.core.model.Id; import org.dodgybits.shuffle.android.core.model.Project; import org.dodgybits.shuffle.android.core.model.Task; import org.dodgybits.shuffle.android.persistence.provider.ContextProvider; import org.dodgybits.shuffle.android.persistence.provider.ProjectProvider; import org.dodgybits.shuffle.android.persistence.provider.TaskProvider; import roboguice.inject.ContentResolverProvider; import roboguice.inject.ResourcesProvider; import com.google.inject.Inject; import android.content.ContentResolver; import android.content.ContentUris; import android.content.res.Resources; import android.net.Uri; import android.os.Handler; import android.text.format.DateUtils; import android.util.Log; public class InitialDataGenerator { private static final String cTag = "InitialDataGenerator"; private static final int AT_HOME_INDEX = 0; private static final int AT_WORK_INDEX = 1; private static final int AT_COMPUTER_INDEX = 2; private static final int ERRANDS_INDEX = 3; private static final int COMMUNICATION_INDEX = 4; private static final int READ_INDEX = 5; private Context[] mPresetContexts = null; private EntityPersister<Context> mContextPersister; private EntityPersister<Project> mProjectPersister; private EntityPersister<Task> mTaskPersister; private ContentResolver mContentResolver; private Resources mResources; @Inject public InitialDataGenerator(EntityPersister<Context> contextPersister, EntityPersister<Project> projectPersister, EntityPersister<Task> taskPersister, ContentResolverProvider provider, ResourcesProvider resourcesProvider ) { mContentResolver = provider.get(); mResources = resourcesProvider.get(); mContextPersister = contextPersister; mProjectPersister = projectPersister; mTaskPersister = taskPersister; initPresetContexts(); } public Context getSampleContext() { return mPresetContexts[ERRANDS_INDEX]; } /** * Delete any existing projects, contexts and tasks and create the standard * contexts. * * @param androidContext the android context, in this case the activity. * @param handler the android message handler */ public void cleanSlate(Handler handler) { initPresetContexts(); int deletedRows = mContentResolver.delete( TaskProvider.Tasks.CONTENT_URI, null, null); Log.d(cTag, "Deleted " + deletedRows + " tasks."); deletedRows = mContentResolver.delete( ProjectProvider.Projects.CONTENT_URI, null, null); Log.d(cTag, "Deleted " + deletedRows + " projects."); deletedRows = mContentResolver.delete( ContextProvider.Contexts.CONTENT_URI, null, null); Log.d(cTag, "Deleted " + deletedRows + " contexts."); for (int i = 0; i < mPresetContexts.length; i++) { mPresetContexts[i] = insertContext(mPresetContexts[i]); } if (handler != null) handler.sendEmptyMessage(0); } /** * Clean out the current data and populate the database with a set of sample * data. * @param androidContext the context, that being the view * @param handler the message handler */ public void createSampleData(Handler handler) { cleanSlate(null); Calendar cal = Calendar.getInstance(); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); long now = cal.getTimeInMillis(); cal.add(Calendar.DAY_OF_YEAR, -1); long yesterday = cal.getTimeInMillis(); cal.add(Calendar.DAY_OF_YEAR, 3); long twoDays = cal.getTimeInMillis(); cal.add(Calendar.DAY_OF_YEAR, 5); long oneWeek = cal.getTimeInMillis(); cal.add(Calendar.WEEK_OF_YEAR, 1); long twoWeeks = cal.getTimeInMillis(); Project sellBike = createProject("Sell old Powerbook", Id.NONE); sellBike = insertProject(sellBike); insertTask( createTask("Backup data", null, AT_COMPUTER_INDEX, sellBike, now, now + DateUtils.HOUR_IN_MILLIS)); insertTask( createTask("Reformat HD", "Install Leopard and updates", AT_COMPUTER_INDEX, sellBike, twoDays, twoDays + 2 * DateUtils.HOUR_IN_MILLIS)); insertTask( createTask("Determine good price", "Take a look on ebay for similar systems", AT_COMPUTER_INDEX, sellBike, oneWeek, oneWeek + 2 * DateUtils.HOUR_IN_MILLIS)); insertTask( createTask("Put up ad", AT_COMPUTER_INDEX, sellBike, twoWeeks)); Project cleanGarage = createProject("Clean out garage", Id.NONE); cleanGarage = insertProject(cleanGarage); insertTask( createTask("Sort out contents", "Split into keepers and junk", AT_HOME_INDEX, cleanGarage, yesterday, yesterday)); insertTask( createTask("Advertise garage sale", "Local paper(s) and on craigslist", AT_COMPUTER_INDEX, cleanGarage, oneWeek, oneWeek + 2 * DateUtils.HOUR_IN_MILLIS)); insertTask( createTask("Contact local charities", "See what they want or maybe just put in charity bins", COMMUNICATION_INDEX, cleanGarage, now, now)); insertTask( createTask("Take rest to tip", "Hire trailer?", ERRANDS_INDEX, cleanGarage, now, now)); Project skiTrip = createProject("Organise ski trip", Id.NONE); skiTrip = insertProject(skiTrip); insertTask( createTask("Send email to determine best week", null, COMMUNICATION_INDEX, skiTrip, now, now + 2 * DateUtils.HOUR_IN_MILLIS)); insertTask( createTask("Look up package deals", AT_COMPUTER_INDEX, skiTrip, 0L)); insertTask( createTask("Book chalet", AT_COMPUTER_INDEX, skiTrip, 0L)); insertTask( createTask("Book flights", AT_COMPUTER_INDEX, skiTrip, 0L)); insertTask( createTask("Book hire car", AT_COMPUTER_INDEX, skiTrip, 0L)); insertTask( createTask("Get board waxed", ERRANDS_INDEX, skiTrip, 0L)); Project discussI8n = createProject("Discuss internationalization", mPresetContexts[AT_WORK_INDEX].getLocalId()); discussI8n = insertProject(discussI8n); insertTask( createTask("Read up on options", null, AT_COMPUTER_INDEX, discussI8n, twoDays, twoDays + 2 * DateUtils.HOUR_IN_MILLIS)); insertTask( createTask("Kickoff meeting", null, COMMUNICATION_INDEX, discussI8n, oneWeek, oneWeek + 2 * DateUtils.HOUR_IN_MILLIS)); insertTask( createTask("Produce report", null, AT_WORK_INDEX, discussI8n, twoWeeks, twoWeeks + 2 * DateUtils.HOUR_IN_MILLIS)); // a few stand alone tasks insertTask( createTask("Organise music collection", AT_COMPUTER_INDEX, null, 0L)); insertTask( createTask("Make copy of door keys", ERRANDS_INDEX, null, yesterday)); insertTask( createTask("Read Falling Man", READ_INDEX, null, 0L)); insertTask( createTask("Buy Tufte books", ERRANDS_INDEX, null, oneWeek)); if (handler != null) handler.sendEmptyMessage(0); } private void initPresetContexts() { if (mPresetContexts == null) { mPresetContexts = new Context[] { createContext(mResources.getText(R.string.context_athome).toString(), 5, "go_home"), // 0 createContext(mResources.getText(R.string.context_atwork).toString(), 19, "system_file_manager"), // 1 createContext(mResources.getText(R.string.context_online).toString(), 1, "applications_internet"), // 2 createContext(mResources.getText(R.string.context_errands).toString(), 14, "applications_development"), // 3 createContext(mResources.getText(R.string.context_contact).toString(), 22, "system_users"), // 4 createContext(mResources.getText(R.string.context_read).toString(), 16, "format_justify_fill") // 5 }; } } private Context createContext(String name, int colourIndex, String iconName) { Context.Builder builder = Context.newBuilder(); builder .setName(name) .setColourIndex(colourIndex) .setIconName(iconName); return builder.build(); } private Task createTask(String description, int contextIndex, Project project, long start) { return createTask(description, null, contextIndex, project, start); } private Task createTask(String description, String details, int contextIndex, Project project, long start) { return createTask(description, details, contextIndex, project, start, start); } private int ORDER = 1; private Task createTask(String description, String details, int contextIndex, Project project, long start, long due) { Id contextId = contextIndex > -1 ? mPresetContexts[contextIndex].getLocalId() : Id.NONE; long created = System.currentTimeMillis(); String timezone = TimeZone.getDefault().getID(); Task.Builder builder = Task.newBuilder(); builder .setDescription(description) .setDetails(details) .setContextId(contextId) .setProjectId(project == null ? Id.NONE : project.getLocalId()) .setCreatedDate(created) .setModifiedDate(created) .setStartDate(start) .setDueDate(due) .setTimezone(timezone) .setOrder(ORDER++); return builder.build(); } private Project createProject(String name, Id defaultContextId) { Project.Builder builder = Project.newBuilder(); builder .setName(name) .setDefaultContextId(defaultContextId) .setModifiedDate(System.currentTimeMillis()); return builder.build(); } private Context insertContext( org.dodgybits.shuffle.android.core.model.Context context) { Uri uri = mContextPersister.insert(context); long id = ContentUris.parseId(uri); Log.d(cTag, "Created context id=" + id + " uri=" + uri); Context.Builder builder = Context.newBuilder(); builder.mergeFrom(context); builder.setLocalId(Id.create(id)); context = builder.build(); return context; } private Project insertProject( Project project) { Uri uri = mProjectPersister.insert(project); long id = ContentUris.parseId(uri); Log.d(cTag, "Created project id=" + id + " uri=" + uri); Project.Builder builder = Project.newBuilder(); builder.mergeFrom(project); builder.setLocalId(Id.create(id)); project = builder.build(); return project; } private Task insertTask( Task task) { Uri uri = mTaskPersister.insert(task); long id = ContentUris.parseId(uri); Log.d(cTag, "Created task id=" + id); Task.Builder builder = Task.newBuilder(); builder.mergeFrom(task); builder.setLocalId(Id.create(id)); task = builder.build(); return task; } }