14ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira/*
24ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Copyright (C) 2011 The Android Open Source Project
34ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira *
44ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Licensed under the Apache License, Version 2.0 (the "License");
54ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * you may not use this file except in compliance with the License.
64ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * You may obtain a copy of the License at
74ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira *
84ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira *      http://www.apache.org/licenses/LICENSE-2.0
94ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira *
104ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Unless required by applicable law or agreed to in writing, software
114ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * distributed under the License is distributed on an "AS IS" BASIS,
124ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * See the License for the specific language governing permissions and
144ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * limitations under the License.
154ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira */
164ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
174ea24bff40770c987add689970c64cf63077dd3fBruno Oliveirapackage com.example.android.newsreader;
184ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
194ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.os.Bundle;
204ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.support.v4.app.ListFragment;
214ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.view.View;
224ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.widget.AdapterView;
234ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.widget.AdapterView.OnItemClickListener;
244ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.widget.ArrayAdapter;
254ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.widget.ListView;
264ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
274ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport java.util.ArrayList;
284ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport java.util.List;
294ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
304ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira/**
314ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Fragment that displays the news headlines for a particular news category.
324ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira *
334ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * This Fragment displays a list with the news headlines for a particular news category.
344ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * When an item is selected, it notifies the configured listener that a headlines was selected.
354ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira */
364ea24bff40770c987add689970c64cf63077dd3fBruno Oliveirapublic class HeadlinesFragment extends ListFragment implements OnItemClickListener {
374ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    // The list of headlines that we are displaying
384ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    List<String> mHeadlinesList = new ArrayList<String>();
394ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
404ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    // The list adapter for the list we are displaying
414ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    ArrayAdapter<String> mListAdapter;
424ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
434ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    // The listener we are to notify when a headline is selected
444ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    OnHeadlineSelectedListener mHeadlineSelectedListener = null;
454ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
464ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    /**
474ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     * Represents a listener that will be notified of headline selections.
484ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     */
494ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    public interface OnHeadlineSelectedListener {
504ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        /**
514ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira         * Called when a given headline is selected.
524ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira         * @param index the index of the selected headline.
534ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira         */
544ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        public void onHeadlineSelected(int index);
554ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    }
564ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
574ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    /**
584ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     * Default constructor required by framework.
594ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     */
604ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    public HeadlinesFragment() {
614ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        super();
624ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    }
634ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
644ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    @Override
654ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    public void onStart() {
664ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        super.onStart();
674ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        setListAdapter(mListAdapter);
684ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        getListView().setOnItemClickListener(this);
694ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        loadCategory(0);
704ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    }
714ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
724ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    @Override
734ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    public void onCreate(Bundle savedInstanceState) {
744ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        super.onCreate(savedInstanceState);
754ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        mListAdapter = new ArrayAdapter<String>(getActivity(), R.layout.headline_item,
764ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira                mHeadlinesList);
774ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    }
784ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
794ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    /**
804ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     * Sets the listener that should be notified of headline selection events.
814ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     * @param listener the listener to notify.
824ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     */
834ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    public void setOnHeadlineSelectedListener(OnHeadlineSelectedListener listener) {
844ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        mHeadlineSelectedListener = listener;
854ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    }
864ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
874ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    /**
884ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     * Load and display the headlines for the given news category.
894ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     * @param categoryIndex the index of the news category to display.
904ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     */
914ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    public void loadCategory(int categoryIndex) {
924ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        mHeadlinesList.clear();
934ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        int i;
944ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        NewsCategory cat = NewsSource.getInstance().getCategory(categoryIndex);
954ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        for (i = 0; i < cat.getArticleCount(); i++) {
964ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira            mHeadlinesList.add(cat.getArticle(i).getHeadline());
974ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        }
984ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        mListAdapter.notifyDataSetChanged();
994ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    }
1004ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
1014ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    /**
1024ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     * Handles a click on a headline.
1034ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     *
1044ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     * This causes the configured listener to be notified that a headline was selected.
1054ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     */
1064ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    @Override
1074ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
1084ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        if (null != mHeadlineSelectedListener) {
1094ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira            mHeadlineSelectedListener.onHeadlineSelected(position);
1104ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        }
1114ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    }
1124ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira
1134ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    /** Sets choice mode for the list
1144ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     *
1154ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     * @param selectable whether list is to be selectable.
1164ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira     */
1174ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    public void setSelectable(boolean selectable) {
1184ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        if (selectable) {
1194ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
1204ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        }
1214ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        else {
1224ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira            getListView().setChoiceMode(ListView.CHOICE_MODE_NONE);
1234ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira        }
1244ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira    }
1254ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira}
126