Home | History | Annotate | Download | only in rssexample
      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 
     17 package com.example.codelab.rssexample;
     18 
     19 import android.app.Activity;
     20 import android.content.Context;
     21 import android.content.Intent;
     22 import android.graphics.Typeface;
     23 import android.os.Bundle;
     24 import android.view.Menu;
     25 import android.view.View;
     26 import android.view.ViewGroup;
     27 import android.widget.ArrayAdapter;
     28 import android.widget.ListView;
     29 import android.widget.TextView;
     30 
     31 import java.util.ArrayList;
     32 import java.util.List;
     33 
     34 public 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