1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.example.codelab.rssexample;
18
19import android.app.Activity;
20import android.content.Context;
21import android.content.Intent;
22import android.graphics.Typeface;
23import android.os.Bundle;
24import android.view.Menu;
25import android.view.View;
26import android.view.ViewGroup;
27import android.widget.ArrayAdapter;
28import android.widget.ListView;
29import android.widget.TextView;
30
31import java.util.ArrayList;
32import java.util.List;
33
34public class MyRssReader3 extends Activity{
35
36    private ArrayList<RssItem> mFeeds;
37    ListView mRssList;
38    ArrayAdapter mAdap;
39    private static final int ADD_ELEMENT_REQUEST = 1;
40
41    @Override
42    public void onCreate(Bundle savedInstanceState){
43        super.onCreate(savedInstanceState);
44
45        // Load screen layout.
46        setContentView(R.layout.main_screen2);
47
48       // Populate our list
49        mFeeds = initializeList();
50
51         // Populate ArrayAdapter and bind it to ListView
52        mRssList = (ListView)findViewById(R.id.rssListView);
53        mAdap = new RssDataAdapter<RssItem>(this, R.layout.list_element, mFeeds);
54        mRssList.setAdapter(mAdap);
55
56        // Set the last selected item.
57        // (icicle is only set if this is being restarted).
58        if(savedInstanceState != null && savedInstanceState.containsKey("lastIndexItem"))
59            mRssList.setSelection(savedInstanceState.getInteger("lastIndexItem"));
60    }
61
62    // Store our state before we are potentially bumped from memory.
63    // We'd like to store the current ListView selection.
64    @Override
65    protected void onSaveInstanceState(Bundle outState){
66        int index = mRssList.getSelectedItemIndex();
67        if(index > -1){
68            outState.putInteger("lastIndexItem", index);
69        }
70    }
71
72
73    // Add our initial menu options. We will tweak this menu when it's loaded swap out
74    // "start service" or "stop service", depending on whether the service is currently running.
75    @Override
76    public boolean onCreateOptionsMenu(Menu menu)
77    {
78        // Always call the superclass implementation to
79        // provide standard items.
80        super.onCreateOptionsMenu(menu);
81
82        menu.add(0, 0, R.string.menu_option_start, null);
83        menu.add(0, 1, R.string.menu_option_stop, null);
84        menu.add(0, 2, R.string.menu_option_add, null);
85        menu.add(0, 3, R.string.menu_option_delete, null);
86        menu.add(0, 4, R.string.menu_option_update, null);
87
88        return true;
89    }
90
91    // Toggle out start service/stop service depending on whether the service is running.
92    @Override
93    public boolean onPrepareOptionsMenu(Menu menu){
94        return true;
95    }
96
97    // Handle our menu clicks.
98    @Override
99    public boolean onOptionsItemSelected(Menu.Item item){
100        super.onOptionsItemSelected(item);
101
102        switch (item.getId()){
103            case 0:     // Start service
104                showAlert(null, "You clicked 'start'!", "ok", null, false, null);
105                break;
106            case 1:    // Stop service
107                showAlert(null, "You clicked stop!", "ok", null, false, null);
108                break;
109            case 2:     // Add Item
110                Intent addIntent = new Intent(AddRssItem.class);
111
112                // Use an ID so that if we create a "remove item" form we
113                // can tell which form is returning a value.
114                startActivityForResult(addIntent, ADD_ELEMENT_REQUEST);
115                break;
116            case 3:     // Delete item.
117                if(mRssList.hasFocus()){
118                    Object selectedItem = mRssList.getSelectedItem();
119                    mAdap.removeObject(mRssList.getSelectedItem());
120                }
121                break;
122            case 4:    // Update all
123                showAlert(null, "You clicked 'Update'!", "ok", null, false, null);
124                break;
125            default:
126                showAlert(null, "I have no idea what you clicked!", "ok", null, false, null);
127                break;
128        }
129        return true;
130    }
131
132    // Called by the "Add RSS Item" floating screen when it closes.
133    @Override
134    protected void onActivityResult(int requestCode, int resultCode, Intent data){
135        if(resultCode == RESULT_OK){
136            switch (requestCode){
137                case ADD_ELEMENT_REQUEST:
138                    RssItem newIt = new RssItem(
139                            data.getStringExtra("url").toString(),
140                            data.getStringExtra("title").toString());
141                    mAdap.addObject(newIt);
142                    mRssList.setSelection(mRssList.getCount() - 1);
143                break;
144                default:
145                    break;
146            }
147        }
148    }
149
150    // Our private ArrayAdapter implementation that returns a bold TextView for
151    // RSS items that are unread, or a normal TextView for items that have been read.
152    private class RssDataAdapter<T> extends ArrayAdapter<T> {
153        public RssDataAdapter(Context context, int resource, List objects) {
154            super(context, resource, objects);
155        }
156
157        // Here's our only important override--returning the list item.
158        @Override
159        public View getView(int position, View convertView, ViewGroup parent){
160
161            // Get the item from the underlying array,
162            // Create a TextView wrapper, and change the typeface, if necessary.
163            RssItem item = (RssItem)this.getItem(position);
164            TextView view = new TextView(parent.getContext());
165            view.setText(item.toString());
166
167            if(! item.hasBeenRead){
168                Typeface type = view.getTypeface();
169                view.setTypeface(Typeface.create(type, Typeface.BOLD_ITALIC));
170            }
171            return view;
172        }
173    }
174
175    // Method to initialize our list of RSS items.
176    private ArrayList<RssItem> initializeList(){
177      ArrayList<RssItem> list = new ArrayList<RssItem>();
178      list.add(new RssItem("http://www.sciam.com/xml/sciam.xml", "Scientific American"));
179      list.add(new RssItem("http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml", "BBC"));
180      list.add(new RssItem("http://feeds.theonion.com/theonion/daily", "The Onion"));
181      list.add(new RssItem("http://feeds.engadget.com/weblogsinc/engadget", "Engadget"));
182      return list;
183    }
184}
185