package com.openerp.addons.note; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import com.openerp.OEArguments; import org.json.JSONArray; import org.json.JSONObject; import android.annotation.SuppressLint; import android.app.ActionBar; import android.app.ActionBar.OnNavigationListener; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.os.Bundle; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; import android.widget.EditText; import android.widget.Toast; import com.openerp.R; import com.openerp.addons.note.NoteDB.NoteStages; import com.openerp.addons.note.NoteDB.NoteTags; import com.openerp.orm.OEDataRow; import com.openerp.orm.OEHelper; import com.openerp.orm.OEM2MIds; import com.openerp.orm.OEM2MIds.Operation; import com.openerp.orm.OEValues; import com.openerp.support.OEUser; import com.openerp.support.listview.OEListAdapter; import com.openerp.util.HTMLHelper; import com.openerp.util.controls.OEEditText; import com.openerp.util.controls.OETextView; import com.openerp.util.tags.MultiTagsTextView.TokenListener; import com.openerp.util.tags.TagsItem; import com.openerp.util.tags.TagsView; import com.openerp.util.tags.TagsView.NewTokenCreateListener; public class NoteComposeActivity extends Activity implements OnNavigationListener, NewTokenCreateListener, TokenListener { public static final String TAG = "com.openerp.addons.note.NoteComposeActivity"; Context mContext = null; /** * Note db, OpenERP Instance */ NoteDB mDb = null; OEHelper mOpenERP = null; /** * Database Objects */ NoteDB mNoteDB = null; NoteTags mTagsDb = null; NoteStages mNoteStageDB = null; Integer mStageId = null; List<Object> mNoteTags = new ArrayList<Object>(); OEListAdapter mNoteStageAdapter = null; OEListAdapter mNoteTagsAdapter = null; OEDataRow mNoteRow = null; Integer mNoteId = null; Boolean mEditMode = false; HashMap<String, Integer> mSelectedTagsIds = new HashMap<String, Integer>(); String mPadURL = ""; /** * Actionbar */ ActionBar mActionbar; List<Object> mActionbarSpinnerItems = new ArrayList<Object>(); HashMap<String, Integer> mActionbarSpinnerItemsPositions = new HashMap<String, Integer>(); /** * Note pad status */ boolean mPadInstalled = false; WebView mWebViewPad = null; OEEditText edtNoteTitle = null; OEEditText edtNoteDescription = null; TagsView mNoteTagsView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_note_compose); mContext = this; mDb = new NoteDB(mContext); mTagsDb = mDb.new NoteTags(mContext); mOpenERP = mDb.getOEInstance(); init(); } private void init() { mNoteDB = new NoteDB(mContext); mNoteStageDB = mNoteDB.new NoteStages(mContext); initActionBar(); initNoteTags(); checkForPad(); initNote(); } public void checkForPad() { Log.d(TAG, "NoteComposeActivity->checkForPad()"); if (mOpenERP != null) { mPadInstalled = mOpenERP.moduleExists("note_pad"); } } @SuppressLint("SetJavaScriptEnabled") private void initNote() { edtNoteTitle = (OEEditText) findViewById(R.id.edtNoteTitleInput); edtNoteDescription = (OEEditText) findViewById(R.id.edtNoteComposeDescription); mWebViewPad = (WebView) findViewById(R.id.webNoteComposeWebViewPad); Intent intent = getIntent(); if (intent.hasExtra("note_id")) { mEditMode = true; mNoteId = intent.getIntExtra("note_id", 0); mNoteRow = mDb.select(mNoteId); OEDataRow stage = mNoteRow.getM2ORecord("stage_id").browse(); if (stage != null) { mStageId = stage.getInt("id"); mActionbar .setSelectedNavigationItem(mActionbarSpinnerItemsPositions .get("key_" + mStageId)); } } if (intent.hasExtra("note_title")) { edtNoteTitle.setText(intent.getStringExtra("note_title")); } if (mPadInstalled) { edtNoteDescription.setVisibility(View.GONE); mWebViewPad.setVisibility(View.VISIBLE); if (mEditMode) { mPadURL = mNoteRow.getString("note_pad_url"); if (mPadURL.equals("false")) { mPadURL = getPadURL(mNoteRow.getInt("id")); } } else { mPadURL = getPadURL(null); } mWebViewPad.getSettings().setJavaScriptEnabled(true); mWebViewPad.getSettings().setJavaScriptCanOpenWindowsAutomatically( true); mWebViewPad.loadUrl(mPadURL + "?showChat=false&userName=" + OEUser.current(mContext).getUsername()); } else { edtNoteDescription.setVisibility(View.VISIBLE); mWebViewPad.setVisibility(View.GONE); if (mEditMode) { edtNoteDescription .setMovementMethod(new ScrollingMovementMethod()); edtNoteDescription.setText(HTMLHelper.stringToHtml(mNoteRow .getString("memo"))); } } if (mEditMode) { edtNoteTitle.setText(mNoteRow.getString("name")); List<OEDataRow> tags = mNoteRow.getM2MRecord("tag_ids") .browseEach(); if (tags != null) { for (OEDataRow row : tags) { TagsItem item = new TagsItem(row.getInt("id"), row.getString("name"), null); mNoteTagsView.addObject(item); } } } } private String getPadURL(Integer note_id) { if (mOpenERP != null) { JSONObject newContext = new JSONObject(); try { boolean flag = false; if (note_id != null) { List<Object> ids = new ArrayList<Object>(); ids.add(note_id); if (mOpenERP.syncWithServer(false, null, ids)) { mNoteRow = mDb.select(note_id); if (!mNoteRow.getString("note_pad_url").equals("false")) { mPadURL = mNoteRow.getString("note_pad_url"); flag = true; } } } if (!flag) { newContext.put("model", "note.note"); newContext.put("field_name", "note_pad_url"); JSONObject kwargs = new JSONObject(); if (note_id != null) newContext.put("object_id", note_id); kwargs.accumulate("context", newContext); mOpenERP.updateKWargs(kwargs); OEArguments arguments = new OEArguments(); JSONObject result = (JSONObject) mOpenERP.call_kw( "pad_generate_url", arguments, null); mPadURL = result.getString("url"); } } catch (Exception e) { } } return mPadURL; } private void initNoteTags() { mNoteTagsView = (TagsView) findViewById(R.id.edtComposeNoteTags); for (OEDataRow tag : mTagsDb.select()) { TagsItem tag_item = new TagsItem(tag.getInt("id"), tag.getString("name"), null); mNoteTags.add(tag_item); } mNoteTagsAdapter = new OEListAdapter(mContext, R.layout.custom_note_tags_adapter_view_item, mNoteTags) { @Override public View getView(int position, View convertView, ViewGroup parent) { View mView = convertView; if (mView == null) { mView = getLayoutInflater().inflate(getResource(), parent, false); } TagsItem row = (TagsItem) mNoteTags.get(position); OETextView txvName = (OETextView) mView .findViewById(R.id.txvCustomNoteTagsAdapterViewItem); txvName.setText(row.getSubject()); return mView; } }; mNoteTagsView.setAdapter(mNoteTagsAdapter); mNoteTagsView.showImage(false); mNoteTagsView.setNewTokenCreateListener(this); mNoteTagsView.setTokenListener(this); } private void initActionBar() { mActionbar = getActionBar(); mActionbar.setHomeButtonEnabled(true); mActionbar.setDisplayHomeAsUpEnabled(true); mActionbar.setDisplayShowTitleEnabled(false); mActionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); setupActionbarSpinner(); } private void setupActionbarSpinner() { mActionbarSpinnerItems.add(new SpinnerNavItem(0, "Stages")); int i = 1; for (OEDataRow stage : mNoteStageDB.select()) { mActionbarSpinnerItems.add(new SpinnerNavItem(stage.getInt("id"), stage.getString("name"))); mActionbarSpinnerItemsPositions.put("key_" + stage.getInt("id"), i); i++; } mActionbarSpinnerItems.add(new SpinnerNavItem(-1, "Add New")); mNoteStageAdapter = new OEListAdapter(mContext, R.layout.spinner_custom_layout, mActionbarSpinnerItems) { @Override public View getView(int position, View convertView, ViewGroup parent) { View mView = convertView; if (mView == null) { mView = getLayoutInflater().inflate(getResource(), parent, false); } OETextView txvTitle = (OETextView) mView .findViewById(R.id.txvCustomSpinnerItemText); SpinnerNavItem item = (SpinnerNavItem) mActionbarSpinnerItems .get(position); txvTitle.setText(item.get_title()); return mView; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { View mView = convertView; if (mView == null) { mView = getLayoutInflater().inflate(getResource(), parent, false); } OETextView txvTitle = (OETextView) mView .findViewById(R.id.txvCustomSpinnerItemText); SpinnerNavItem item = (SpinnerNavItem) mActionbarSpinnerItems .get(position); txvTitle.setText(item.get_title()); return mView; } }; mActionbar.setListNavigationCallbacks(mNoteStageAdapter, this); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_fragment_note_new_edit, menu); MenuItem menu_note_write = menu.findItem(R.id.menu_note_write); if (mEditMode) { menu_note_write.setTitle("Update"); } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; case R.id.menu_note_write: String mToast = "Creating note..."; if (mEditMode) { saveNote(mNoteId); } else { saveNote(null); } Toast.makeText(this, mToast, Toast.LENGTH_LONG).show(); return true; case R.id.menu_note_cancel: if (mEditMode) { // if (isContentChanged()) { // openConfirmDiscard("Discard ?", // "Your changes will be discarded. Are you sure?", // "Discard", "Cancel"); // } else { // finish(); // } // } else { // finish(); } else { finish(); } return true; default: return super.onOptionsItemSelected(item); } } private void saveNote(Integer mNoteId) { if (mOpenERP != null) { OEValues values = new OEValues(); String name = ""; String memo = ""; if (mStageId == null) { Toast.makeText(mContext, "Please select stage", Toast.LENGTH_LONG).show(); return; } if (mPadInstalled) { try { JSONArray args = new JSONArray(); args.put(mPadURL); JSONObject content = mOpenERP.call_kw("pad.common", "pad_get_content", args); memo = content.getString("result"); values.put("note_pad_url", mPadURL); memo = name + " <br> " + memo; } catch (Exception e) { } } else { memo = edtNoteDescription.getText().toString(); } name = noteName(memo); List<Integer> tag_ids = new ArrayList<Integer>(); for (String key : mSelectedTagsIds.keySet()) tag_ids.add(mSelectedTagsIds.get(key)); OEM2MIds m2mIds = new OEM2MIds(Operation.ADD, tag_ids); values.put("name", name); values.put("memo", memo); values.put("open", true); values.put("date_done", false); values.put("stage_id", mStageId); values.put("tag_ids", m2mIds); values.put("current_partner_id", OEUser.current(mContext) .getPartner_id()); String mToast = "Note Created"; if (mNoteId != null) { // Updating mToast = "Note Updated"; mOpenERP.update(values, mNoteId); } else { // Creating mOpenERP.create(values); } Toast.makeText(mContext, mToast, Toast.LENGTH_LONG).show(); finish(); } else { Toast.makeText(mContext, "No Connection", Toast.LENGTH_LONG).show(); } } private String noteName(String memo) { String name = ""; String[] parts = memo.split("\\n"); if (parts.length == 1) { parts = memo.split("\\</br>"); if (parts.length == 1) parts = memo.split("\\<br>"); } name = parts[0]; return name; } class SpinnerNavItem { int _id; String _title; public SpinnerNavItem(int _id, String _title) { this._id = _id; this._title = _title; } public int get_id() { return _id; } public void set_id(int _id) { this._id = _id; } public String get_title() { return _title; } public void set_title(String _title) { this._title = _title; } } @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { SpinnerNavItem item = (SpinnerNavItem) mActionbarSpinnerItems .get(itemPosition); if (item.get_id() == 0) { return false; } if (item.get_id() == -1) { createNoteStage(); } mStageId = item.get_id(); return true; } public void createNoteStage() { AlertDialog.Builder builder = new Builder(this); final EditText stage = new EditText(this); builder.setTitle("Stage Name").setMessage("Enter new Stage") .setView(stage); builder.setPositiveButton("Create", new OnClickListener() { public void onClick(DialogInterface di, int i) { // do something with onClick String mToast = "No Connection "; if ((stage.getText().toString()).equalsIgnoreCase("Add New") || (stage.getText().toString()) .equalsIgnoreCase("AddNew")) { mToast = "You can't take " + stage.getText().toString(); } else { OEHelper oe = mNoteStageDB.getOEInstance(); if (oe != null) { String stageName = stage.getText().toString(); OEValues values = new OEValues(); values.put("name", stageName); int newId = oe.create(values); mActionbarSpinnerItems.add( mActionbarSpinnerItems.size() - 1, new SpinnerNavItem(newId, stageName)); mActionbarSpinnerItemsPositions.put("key_" + newId, mActionbarSpinnerItems.size() - 2); mActionbar .setSelectedNavigationItem(mActionbarSpinnerItemsPositions .get("key_" + newId)); mStageId = newId; mNoteStageAdapter .notifiyDataChange(mActionbarSpinnerItems); mToast = "Stage created"; } } Toast.makeText(mContext, mToast, Toast.LENGTH_SHORT).show(); } }); builder.setNegativeButton("Cancel", null); builder.create().show(); } @Override public TagsItem newTokenAddListener(String token) { TagsItem item = null; OEHelper oe = mTagsDb.getOEInstance(); if (oe != null) { OEValues values = new OEValues(); values.put("name", token); int id = oe.create(values); item = new TagsItem(id, token, null); mNoteTags.add(item); mNoteTagsAdapter.notifiyDataChange(mNoteTags); } return item; } @Override public void onTokenAdded(Object token, View view) { TagsItem item = (TagsItem) token; mSelectedTagsIds.put("key_" + item.getId(), item.getId()); } @Override public void onTokenSelected(Object token, View view) { } @Override public void onTokenRemoved(Object token) { TagsItem item = (TagsItem) token; mSelectedTagsIds.remove("key_" + item.getId()); } }