/*
* 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.Context;
import org.dodgybits.shuffle.android.core.model.Context.Builder;
import org.dodgybits.shuffle.android.core.model.encoding.EntityEncoder;
import org.dodgybits.shuffle.android.core.model.persistence.EntityPersister;
import org.dodgybits.shuffle.android.core.util.TextColours;
import org.dodgybits.shuffle.android.core.view.ContextIcon;
import org.dodgybits.shuffle.android.core.view.DrawableUtils;
import org.dodgybits.shuffle.android.list.activity.State;
import org.dodgybits.shuffle.android.list.view.ContextView;
import org.dodgybits.shuffle.android.persistence.provider.ContextProvider;
import roboguice.inject.InjectView;
import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.GradientDrawable.Orientation;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.google.inject.Inject;
public class ContextEditorActivity extends AbstractEditorActivity<Context> implements TextWatcher {
private static final String cTag = "ContextEditorActivity";
private static final int COLOUR_PICKER = 0;
private static final int ICON_PICKER = 1;
private int mColourIndex;
private ContextIcon mIcon;
@InjectView(R.id.name) private EditText mNameWidget;
@InjectView(R.id.colour_display) private TextView mColourWidget;
@InjectView(R.id.icon_display) private ImageView mIconWidget;
@InjectView(R.id.icon_none) private TextView mIconNoneWidget;
@InjectView(R.id.icon_clear_button) private ImageButton mClearIconButton;
@InjectView(R.id.context_preview) private ContextView mContext;
@Inject private EntityPersister<Context> mPersister;
@Inject private EntityEncoder<Context> mEncoder;
@Override
protected void onCreate(Bundle icicle) {
Log.d(cTag, "onCreate+");
super.onCreate(icicle);
loadCursor();
// The text view for our context description, identified by its ID in the XML file.
mNameWidget.addTextChangedListener(this);
mColourIndex = -1;
mIcon = ContextIcon.NONE;
View colourEntry = findViewById(R.id.colour_entry);
colourEntry.setOnClickListener(this);
colourEntry.setOnFocusChangeListener(this);
View iconEntry = findViewById(R.id.icon_entry);
iconEntry.setOnClickListener(this);
iconEntry.setOnFocusChangeListener(this);
mClearIconButton.setOnClickListener(this);
mClearIconButton.setOnFocusChangeListener(this);
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_context);
mOriginalItem = mPersister.read(mCursor);
updateUIFromItem(mOriginalItem);
} else if (mState == State.STATE_INSERT) {
setTitle(R.string.title_new_context);
Bundle extras = getIntent().getExtras();
updateUIFromExtras(extras);
}
}
@Override
protected boolean isValid() {
String name = mNameWidget.getText().toString();
return !TextUtils.isEmpty(name);
}
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
Log.d(cTag, "Got resultCode " + resultCode + " with data " + data);
switch (requestCode) {
case COLOUR_PICKER:
if (resultCode == Activity.RESULT_OK) {
if (data != null) {
mColourIndex = Integer.parseInt(data.getStringExtra("colour"));
displayColour();
updatePreview();
}
}
break;
case ICON_PICKER:
if (resultCode == Activity.RESULT_OK) {
if (data != null) {
String iconName = data.getStringExtra("iconName");
mIcon = ContextIcon.createIcon(iconName, getResources());
displayIcon();
updatePreview();
}
}
break;
default:
Log.e(cTag, "Unknown requestCode: " + requestCode);
}
}
/**
* Take care of deleting a context. Simply deletes the entry.
*/
@Override
protected void doDeleteAction() {
super.doDeleteAction();
mNameWidget.setText("");
}
/**
* @return id of layout for this view
*/
@Override
protected int getContentViewResId() {
return R.layout.context_editor;
}
@Override
protected Intent getInsertIntent() {
return new Intent(Intent.ACTION_INSERT, ContextProvider.Contexts.CONTENT_URI);
}
@Override
protected CharSequence getItemName() {
return getString(R.string.context_name);
}
@Override
protected Context createItemFromUI() {
Builder builder = Context.newBuilder();
if (mOriginalItem != null) {
builder.mergeFrom(mOriginalItem);
}
builder.setName(mNameWidget.getText().toString());
builder.setModifiedDate(System.currentTimeMillis());
builder.setColourIndex(mColourIndex);
builder.setIconName(mIcon.iconName);
return builder.build();
}
@Override
protected void updateUIFromExtras(Bundle extras) {
if (mColourIndex == -1) {
mColourIndex = 0;
}
displayIcon();
displayColour();
updatePreview();
}
@Override
protected void updateUIFromItem(Context context) {
mNameWidget.setTextKeepState(context.getName());
mColourIndex = context.getColourIndex();
displayColour();
final String iconName = context.getIconName();
mIcon = ContextIcon.createIcon(iconName, getResources());
displayIcon();
updatePreview();
if (mOriginalItem == null) {
mOriginalItem = context;
}
}
@Override
protected EntityEncoder<Context> getEncoder() {
return mEncoder;
}
@Override
protected EntityPersister<Context> getPersister() {
return mPersister;
}
private void loadCursor() {
if (mUri != null && mState == State.STATE_EDIT)
{
mCursor = managedQuery(mUri, ContextProvider.Contexts.cFullProjection, null, null, null);
if (mCursor == null || mCursor.getCount() == 0) {
// The cursor is empty. This can happen if the event was deleted.
finish();
}
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.colour_entry: {
// Launch activity to pick colour
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ColourPickerActivity.TYPE);
startActivityForResult(intent, COLOUR_PICKER);
break;
}
case R.id.icon_entry: {
// Launch activity to pick icon
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(IconPickerActivity.TYPE);
startActivityForResult(intent, ICON_PICKER);
break;
}
case R.id.icon_clear_button: {
mIcon = ContextIcon.NONE;
displayIcon();
updatePreview();
break;
}
default:
super.onClick(v);
break;
}
}
private void displayColour() {
int bgColour = TextColours.getInstance(this).getBackgroundColour(mColourIndex);
GradientDrawable drawable = DrawableUtils.createGradient(bgColour, Orientation.TL_BR);
drawable.setCornerRadius(8.0f);
mColourWidget.setBackgroundDrawable(drawable);
}
private void displayIcon() {
if (mIcon == ContextIcon.NONE) {
mIconNoneWidget.setVisibility(View.VISIBLE);
mIconWidget.setVisibility(View.GONE);
mClearIconButton.setEnabled(false);
} else {
mIconNoneWidget.setVisibility(View.GONE);
mIconWidget.setImageResource(mIcon.largeIconId);
mIconWidget.setVisibility(View.VISIBLE);
mClearIconButton.setEnabled(true);
}
}
private void updatePreview() {
String name = mNameWidget.getText().toString();
if (TextUtils.isEmpty(name) || mColourIndex == -1) {
mContext.setVisibility(View.GONE);
} else {
mContext.updateView(createItemFromUI());
mContext.setVisibility(View.VISIBLE);
}
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
updatePreview();
}
}