Android Open Source - Locast-Core-Android Tag List






From Project

Back to project page Locast-Core-Android.

License

The source code is released under:

GNU General Public License

If you think the Android project Locast-Core-Android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package edu.mit.mobile.android.locast.widget;
//  w  w w .java  2s .c om
/*
 * Copyright (C) 2010-2013 MIT Mobile Experience Lab
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */
import java.util.Collections;
import java.util.List;
import java.util.Vector;

import android.content.Context;
import android.content.res.TypedArray;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.ViewGroup;
import android.widget.AutoCompleteTextView;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import edu.mit.mobile.android.locast.R;

/**
 * A user-modifiable set of free tags. The user can add a new tag to a set of available tags or
 * choose from a set of recommended tags.
 *
 * @author stevep
 *
 */
public class TagList extends TagListView implements OnEditorActionListener, OnFocusChangeListener {
    private ViewGroup recommendedTagView;
    private TextView recommendedTagLabel;
    private AutoCompleteTextView addTagEditText;

    private final List<String> recommendedTags = new Vector<String>();
    private final List<String> shownRecs = new Vector<String>();

    private int style;

    private RemoteTagsAdapter acAdapter;

    public TagList(Context context) {
        super(context);

        init(context);
    }

    public TagList(Context context, AttributeSet attrs) {
        super(context, attrs);

        init(context);
    }

    private void init(Context context) {

        recommendedTagView = (ViewGroup) findViewById(R.id.tag_recommended_tags);
        recommendedTagLabel = (TextView) findViewById(R.id.tag_recommended_label);
        addTagEditText = (AutoCompleteTextView) findViewById(R.id.tag_add_text);

        ((ImageButton) findViewById(R.id.tag_add_button))
                .setOnClickListener(mDefaultOnClickListener);

        setOnTagClickListener(mDefaultOnClickListener);

        addTagEditText.setOnFocusChangeListener(this);
        addTagEditText.setAdapter(acAdapter);
        addTagEditText.setOnEditorActionListener(this);
    }

    @Override
    protected void inflateLayout(Context context, AttributeSet attrs) {
        LayoutInflater.from(context).inflate(R.layout.taglist, this);
        final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TagList);
        style = ta.getInt(R.styleable.TagList_taglist_type, R.id.full);

        if (style == R.id.selector) {
            findViewById(R.id.tag_manual_entry).setVisibility(View.GONE);
            findViewById(R.id.tag_recommended_label).setVisibility(View.GONE);
        }
    }

    public void setRemoteTagsAdapter(RemoteTagsAdapter remoteTagsAdapter) {
        this.acAdapter = remoteTagsAdapter;
    }

    @Override
    public void setEnabled(boolean enabled) {
        super.setEnabled(enabled);
        addTagEditText.setEnabled(enabled);
        recommendedTagView.setEnabled(enabled);

        findViewById(R.id.tag_add_button).setEnabled(enabled);

    }

    @Override
    public boolean addTag(String tag) {
        if (!super.addTag(tag)) {
            return false;
        }

        if (recommendedTags.contains(tag)) {
            recommendedTagView.removeViewAt(shownRecs.indexOf(tag));
            shownRecs.remove(tag);
            if (shownRecs.size() == 0) {
                recommendedTagLabel.setVisibility(TextView.GONE);
            }
        }
        return true;
    }

    @Override
    public boolean removeTag(String tag) {
        if (!super.removeTag(tag)) {
            return false;
        }

        if (recommendedTags.contains(tag) && !shownRecs.contains(tag)) {
            shownRecs.add(tag);
            Collections.sort(shownRecs);
            recommendedTagLabel.setVisibility(TextView.VISIBLE);
            recommendedTagView.addView(getTagView(tag, false), shownRecs.indexOf(tag));
        }

        return true;
    }

    /**
     * A list of tags that are recommended for the given item.
     *
     * @param tag
     */
    public void addRecommendedTag(String tag) {
        if (tag.length() == 0) {
            throw new IllegalArgumentException("cannot add empty tag");
        }
        if (!recommendedTags.contains(tag)) {
            recommendedTags.add(tag);

            if (!getTags().contains(tag)) {
                shownRecs.add(tag);
                Collections.sort(shownRecs);
                recommendedTagLabel.setVisibility(TextView.VISIBLE);
                recommendedTagView.addView(getTagView(tag, false), shownRecs.indexOf(tag));
            }
        }
    }

    public void addedRecommendedTags(List<String> tags) {
        for (final String tag : tags) {
            addRecommendedTag(tag);
        }
    }

    @Override
    public void clearAllTags() {
        super.clearAllTags();
        clearRecommendedTags();
    }

    public void clearRecommendedTags() {
        recommendedTags.clear();
        shownRecs.clear();
        recommendedTagView.removeAllViews();
        recommendedTagLabel.setVisibility(TextView.GONE);
    }

    private boolean addEditTextTag() {
        boolean changed = false;
        String tag = addTagEditText.getText().toString();
        tag = tag.trim();
        tag = tag.toLowerCase();

        if (tag.length() > 0) {
            changed = addTag(tag);
            addTagEditText.setText("");
        }
        return changed;
    }

    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        final int id = v.getId();
        if (id == R.id.tag_add_text) {
            if (addEditTextTag() && listener != null) {
                listener.onTagListChange(this);
            }
            return true;
        }
        return false;
    }

    static class SavedState extends BaseSavedState {
        private final List<String> addedTags;
        private final List<String> recTags;

        SavedState(Parcelable superState, List<String> addedTags, List<String> recTags) {
            super(superState);
            this.addedTags = addedTags;
            this.recTags = recTags;
        }

        @SuppressWarnings("unchecked")
        private SavedState(Parcel in) {
            super(in);
            addedTags = in.readArrayList(String.class.getClassLoader());
            recTags = in.readArrayList(String.class.getClassLoader());
        }

        public List<String> getAddedTags() {
            return addedTags;
        }

        public List<String> getRecTags() {
            return recTags;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            super.writeToParcel(dest, flags);
            dest.writeList(addedTags);
            dest.writeList(recTags);
        }

        public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() {
            public SavedState createFromParcel(Parcel in) {
                return new SavedState(in);
            }

            public SavedState[] newArray(int size) {
                return new SavedState[size];
            }
        };
    }

    @Override
    protected Parcelable onSaveInstanceState() {
        final Parcelable superState = super.onSaveInstanceState();

        return new SavedState(superState, getTags(), recommendedTags);
    }

    @Override
    protected void onRestoreInstanceState(Parcelable state) {
        final SavedState ss = (SavedState) state;
        super.onRestoreInstanceState(ss.getSuperState());
        clearAllTags();
        addTags(ss.getAddedTags());
        addedRecommendedTags(ss.getRecTags());
    }

    private OnTagListChangeListener listener = null;

    public void setOnTagListChangeListener(OnTagListChangeListener listener) {
        this.listener = listener;
    }

    public interface OnTagListChangeListener {
        public void onTagListChange(TagList v);
    }

    public void onFocusChange(View v, boolean hasFocus) {
        final int id = v.getId();
        if (id == R.id.tag_add_text) {
            if (hasFocus && acAdapter != null) {
                acAdapter.refreshTags();
            }
        }
    }

    private final OnClickListener mDefaultOnClickListener = new OnClickListener() {

        /**
         * Listener to handle the act of clicking on a tag button.
         */
        public void onClick(View v) {
            boolean changed = false;

            final int id = v.getId();
            if (id == R.id.tag_add_button) {
                changed = addEditTextTag();
            } else {
                if (v instanceof TagButton) {
                    final TagButton tagButton = (TagButton) v;
                    if (tagButton.isAdded()) {
                        changed = removeTag((String) tagButton.getTag(R.id.locast_core__tag));
                    } else {
                        changed = addTag((String) tagButton.getTag(R.id.locast_core__tag));
                    }
                }
            }

            if (changed && listener != null) {
                listener.onTagListChange(TagList.this);
            }
        }
    };
}




Java Source Code List

com.beoui.geocell.GeocellLogger.java
com.beoui.geocell.GeocellQueryEngine.java
com.beoui.geocell.GeocellUtils.java
com.beoui.geocell.annotations.Geocells.java
com.beoui.geocell.annotations.Latitude.java
com.beoui.geocell.annotations.Longitude.java
com.beoui.geocell.comparator.DoubleTupleComparator.java
com.beoui.geocell.comparator.LocationComparableTuple.java
com.beoui.geocell.model.BoundingBox.java
com.beoui.geocell.model.CostFunction.java
com.beoui.geocell.model.DefaultCostFunction.java
com.beoui.geocell.model.GeocellQuery.java
com.beoui.geocell.model.LocationCapable.java
com.beoui.geocell.model.Point.java
com.beoui.geocell.model.Tuple.java
com.stackoverflow.ArrayUtils.java
com.stackoverflow.CollectionUtils.java
com.stackoverflow.MediaUtils.java
com.stackoverflow.Predicate.java
edu.mit.mobile.android.MelAndroid.java
edu.mit.mobile.android.json.JSONArrayAdapter.java
edu.mit.mobile.android.locast.Constants.java
edu.mit.mobile.android.locast.accounts.AbsAccountChangeReceiver.java
edu.mit.mobile.android.locast.accounts.AbsLocastAuthenticationService.java
edu.mit.mobile.android.locast.accounts.AbsLocastAuthenticatorActivity.java
edu.mit.mobile.android.locast.accounts.AbsLocastAuthenticator.java
edu.mit.mobile.android.locast.accounts.AbsRegisterActivity.java
edu.mit.mobile.android.locast.accounts.LogoutFragment.java
edu.mit.mobile.android.locast.app.LocastApplication.java
edu.mit.mobile.android.locast.data.AbsComment.java
edu.mit.mobile.android.locast.data.AbsResourcesSync.java
edu.mit.mobile.android.locast.data.CastMedia.java
edu.mit.mobile.android.locast.data.ImageContent.java
edu.mit.mobile.android.locast.data.JSONSyncableIdenticalChildFinder.java
edu.mit.mobile.android.locast.data.JsonSyncableItem.java
edu.mit.mobile.android.locast.data.MediaProcessingException.java
edu.mit.mobile.android.locast.data.NoPublicPath.java
edu.mit.mobile.android.locast.data.OrderedList.java
edu.mit.mobile.android.locast.data.ResourcesSync.java
edu.mit.mobile.android.locast.data.SyncException.java
edu.mit.mobile.android.locast.data.SyncItemDeletedException.java
edu.mit.mobile.android.locast.data.SyncMapException.java
edu.mit.mobile.android.locast.data.SyncMap.java
edu.mit.mobile.android.locast.data.VideoContent.java
edu.mit.mobile.android.locast.data.interfaces.AuthorableUtils.java
edu.mit.mobile.android.locast.data.interfaces.Authorable.java
edu.mit.mobile.android.locast.data.interfaces.CommentableUtils.java
edu.mit.mobile.android.locast.data.interfaces.Commentable.java
edu.mit.mobile.android.locast.data.interfaces.FavoritableUtils.java
edu.mit.mobile.android.locast.data.interfaces.Favoritable.java
edu.mit.mobile.android.locast.data.interfaces.LocatableUtils.java
edu.mit.mobile.android.locast.data.interfaces.Locatable.java
edu.mit.mobile.android.locast.data.interfaces.PrivatelyAuthorableUtils.java
edu.mit.mobile.android.locast.data.interfaces.PrivatelyAuthorable.java
edu.mit.mobile.android.locast.data.interfaces.TitledUtils.java
edu.mit.mobile.android.locast.data.interfaces.Titled.java
edu.mit.mobile.android.locast.data.tags.IdenticalTagFinder.java
edu.mit.mobile.android.locast.data.tags.TagSyncField.java
edu.mit.mobile.android.locast.data.tags.Tag.java
edu.mit.mobile.android.locast.data.tags.TaggableUtils.java
edu.mit.mobile.android.locast.data.tags.TaggableWrapper.java
edu.mit.mobile.android.locast.data.tags.Taggable.java
edu.mit.mobile.android.locast.net.ClientResponseException.java
edu.mit.mobile.android.locast.net.LocastApplicationCallbacks.java
edu.mit.mobile.android.locast.net.NetworkClient.java
edu.mit.mobile.android.locast.net.NetworkProtocolException.java
edu.mit.mobile.android.locast.sync.AbsLocastAccountSyncService.java
edu.mit.mobile.android.locast.sync.AbsMediaSync.java
edu.mit.mobile.android.locast.sync.LocastSimpleSyncService.java
edu.mit.mobile.android.locast.sync.LocastSyncService.java
edu.mit.mobile.android.locast.sync.LocastSyncStatusObserver.java
edu.mit.mobile.android.locast.sync.NotificationProgressListener.java
edu.mit.mobile.android.locast.sync.SyncColumns.java
edu.mit.mobile.android.locast.sync.SyncEngine.java
edu.mit.mobile.android.locast.sync.SyncableProvider.java
edu.mit.mobile.android.locast.sync.SyncableSimpleContentProvider.java
edu.mit.mobile.android.locast.sync.Syncable.java
edu.mit.mobile.android.locast.widget.RemoteTagsAdapter.java
edu.mit.mobile.android.locast.widget.TagButton.java
edu.mit.mobile.android.locast.widget.TagListView.java
edu.mit.mobile.android.locast.widget.TagList.java
edu.mit.mobile.android.locast.widget.TagsLoaderCallbacks.java
edu.mit.mobile.android.location.IncrementalLocator.java
se.fnord.android.layout.PredicateLayout.java