/* * 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.editor.activity; import org.dodgybits.android.shuffle.R; import org.dodgybits.shuffle.android.core.model.Id; import org.dodgybits.shuffle.android.core.model.Project; import org.dodgybits.shuffle.android.core.model.Project.Builder; import org.dodgybits.shuffle.android.core.model.encoding.EntityEncoder; import org.dodgybits.shuffle.android.core.model.persistence.EntityPersister; import org.dodgybits.shuffle.android.list.activity.State; import org.dodgybits.shuffle.android.persistence.provider.ContextProvider; import org.dodgybits.shuffle.android.persistence.provider.ProjectProvider; import roboguice.inject.InjectView; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.Spinner; import android.widget.TextView; import com.google.inject.Inject; public class ProjectEditorActivity extends AbstractEditorActivity<Project> { private static final String cTag = "ProjectEditorActivity"; @InjectView(R.id.name) EditText mNameWidget; @InjectView(R.id.default_context) Spinner mDefaultContextSpinner; @InjectView(R.id.parallel_entry) RelativeLayout mParallelEntry; @InjectView(R.id.parallel_label) TextView mParallelLabel; @InjectView(R.id.parallel_icon) ImageView mParallelButton; private @InjectView(R.id.active_entry) View mActiveEntry; private @InjectView(R.id.active_entry_checkbox) CheckBox mActiveCheckBox; private @InjectView(R.id.deleted_entry) View mDeletedEntry; private CheckBox mDeletedCheckBox; @Inject private EntityPersister<Project> mPersister; @Inject private EntityEncoder<Project> mEncoder; private String[] mContextNames; private long[] mContextIds; private boolean isParallel; @Override protected void onCreate(Bundle icicle) { Log.d(cTag, "onCreate+"); super.onCreate(icicle); loadCursor(); findViewsAndAddListeners(); if (mState == State.STATE_EDIT) { // Make sure we are at the one and only row in the cursor. mCursor.moveToFirst(); setTitle(R.string.title_edit_project); mOriginalItem = mPersister.read(mCursor); updateUIFromItem(mOriginalItem); } else if (mState == State.STATE_INSERT) { isParallel = false; setTitle(R.string.title_new_project); mDeletedEntry.setVisibility(View.GONE); mDeletedCheckBox.setChecked(false); Bundle extras = getIntent().getExtras(); updateUIFromExtras(extras); } } private void findViewsAndAddListeners() { Cursor contactCursor = getContentResolver().query( ContextProvider.Contexts.CONTENT_URI, new String[] {ContextProvider.Contexts._ID, ContextProvider.Contexts.NAME}, null, null, null); int size = contactCursor.getCount() + 1; mContextIds = new long[size]; mContextIds[0] = 0; mContextNames = new String[size]; mContextNames[0] = getText(R.string.none_empty).toString(); for (int i = 1; i < size; i++) { contactCursor.moveToNext(); mContextIds[i] = contactCursor.getLong(0); mContextNames[i] = contactCursor.getString(1); } contactCursor.close(); ArrayAdapter<String> adapter = new ArrayAdapter<String>( this, android.R.layout.simple_list_item_1, mContextNames); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mDefaultContextSpinner.setAdapter(adapter); mParallelEntry.setOnClickListener(this); mActiveEntry.setOnClickListener(this); mActiveEntry.setOnFocusChangeListener(this); mDeletedEntry.setOnClickListener(this); mDeletedEntry.setOnFocusChangeListener(this); mDeletedCheckBox = (CheckBox) mDeletedEntry.findViewById(R.id.deleted_entry_checkbox); } @Override protected boolean isValid() { String name = mNameWidget.getText().toString(); return !TextUtils.isEmpty(name); } @Override protected void doDeleteAction() { super.doDeleteAction(); mNameWidget.setText(""); } @Override protected Project createItemFromUI() { Builder builder = Project.newBuilder(); if (mOriginalItem != null) { builder.mergeFrom(mOriginalItem); } builder.setName(mNameWidget.getText().toString()); builder.setModifiedDate(System.currentTimeMillis()); builder.setParallel(isParallel); Id defaultContextId = Id.NONE; int selectedItemPosition = mDefaultContextSpinner.getSelectedItemPosition(); if (selectedItemPosition > 0) { defaultContextId = Id.create(mContextIds[selectedItemPosition]); } builder.setDefaultContextId(defaultContextId); builder.setDeleted(mDeletedCheckBox.isChecked()); builder.setActive(mActiveCheckBox.isChecked()); return builder.build(); } @Override protected void updateUIFromExtras(Bundle extras) { // do nothing for now } @Override protected void updateUIFromItem(Project project) { mNameWidget.setTextKeepState(project.getName()); Id defaultContextId = project.getDefaultContextId(); if (defaultContextId.isInitialised()) { for (int i = 1; i < mContextIds.length; i++) { if (mContextIds[i] == defaultContextId.getId()) { mDefaultContextSpinner.setSelection(i); break; } } } else { mDefaultContextSpinner.setSelection(0); } isParallel = project.isParallel(); updateParallelSection(); mActiveCheckBox.setChecked(project.isActive()); mDeletedEntry.setVisibility(project.isDeleted() ? View.VISIBLE : View.GONE); mDeletedCheckBox.setChecked(project.isDeleted()); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.parallel_entry: { isParallel = !isParallel; updateParallelSection(); break; } case R.id.active_entry: { mActiveCheckBox.toggle(); break; } case R.id.deleted_entry: { mDeletedCheckBox.toggle(); break; } default: super.onClick(v); break; } } /** * @return id of layout for this view */ @Override protected int getContentViewResId() { return R.layout.project_editor; } @Override protected Intent getInsertIntent() { return new Intent(Intent.ACTION_INSERT, ProjectProvider.Projects.CONTENT_URI); } @Override protected CharSequence getItemName() { return getString(R.string.project_name); } @Override protected EntityEncoder<Project> getEncoder() { return mEncoder; } @Override protected EntityPersister<Project> getPersister() { return mPersister; } private void loadCursor() { if (mUri != null && mState == State.STATE_EDIT) { mCursor = managedQuery(mUri, ProjectProvider.Projects.FULL_PROJECTION, null, null, null); if (mCursor == null || mCursor.getCount() == 0) { // The cursor is empty. This can happen if the event was deleted. finish(); return; } } } private void updateParallelSection() { if (isParallel) { mParallelLabel.setText(R.string.parallel_title); mParallelButton.setImageResource(R.drawable.parallel); } else { mParallelLabel.setText(R.string.sequence_title); mParallelButton.setImageResource(R.drawable.sequence); } } }