1 /* 2 * Copyright (C) 2011 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.android.weatherlistwidget; 18 19 import android.appwidget.AppWidgetManager; 20 import android.appwidget.AppWidgetProvider; 21 import android.content.ContentProvider; 22 import android.content.ContentValues; 23 import android.content.Context; 24 import android.content.Intent; 25 import android.content.res.Resources; 26 import android.database.Cursor; 27 import android.database.MatrixCursor; 28 import android.net.Uri; 29 30 import java.util.ArrayList; 31 32 /** 33 * A dummy class that we are going to use internally to store weather data. Generally, this data 34 * will be stored in an external and persistent location (ie. File, Database, SharedPreferences) so 35 * that the data can persist if the process is ever killed. For simplicity, in this sample the 36 * data will only be stored in memory. 37 */ 38 class WeatherDataPoint { 39 String day; 40 int degrees; 41 42 WeatherDataPoint(String d, int deg) { 43 day = d; 44 degrees = deg; 45 } 46 } 47 48 /** 49 * The AppWidgetProvider for our sample weather widget. 50 */ 51 public class WeatherDataProvider extends ContentProvider { 52 public static final Uri CONTENT_URI = 53 Uri.parse("content://com.example.android.weatherlistwidget.provider"); 54 public static class Columns { 55 public static final String ID = "_id"; 56 public static final String DAY = "day"; 57 public static final String TEMPERATURE = "temperature"; 58 } 59 60 /** 61 * Generally, this data will be stored in an external and persistent location (ie. File, 62 * Database, SharedPreferences) so that the data can persist if the process is ever killed. 63 * For simplicity, in this sample the data will only be stored in memory. 64 */ 65 private static final ArrayList<WeatherDataPoint> sData = new ArrayList<WeatherDataPoint>(); 66 67 @Override 68 public boolean onCreate() { 69 // We are going to initialize the data provider with some default values 70 sData.add(new WeatherDataPoint("Monday", 13)); 71 sData.add(new WeatherDataPoint("Tuesday", 1)); 72 sData.add(new WeatherDataPoint("Wednesday", 7)); 73 sData.add(new WeatherDataPoint("Thursday", 4)); 74 sData.add(new WeatherDataPoint("Friday", 22)); 75 sData.add(new WeatherDataPoint("Saturday", -10)); 76 sData.add(new WeatherDataPoint("Sunday", -13)); 77 sData.add(new WeatherDataPoint("Monday", 8)); 78 sData.add(new WeatherDataPoint("Tuesday", 11)); 79 sData.add(new WeatherDataPoint("Wednesday", -1)); 80 sData.add(new WeatherDataPoint("Thursday", 27)); 81 sData.add(new WeatherDataPoint("Friday", 27)); 82 sData.add(new WeatherDataPoint("Saturday", 27)); 83 sData.add(new WeatherDataPoint("Sunday", 27)); 84 return true; 85 } 86 87 @Override 88 public synchronized Cursor query(Uri uri, String[] projection, String selection, 89 String[] selectionArgs, String sortOrder) { 90 assert(uri.getPathSegments().isEmpty()); 91 92 // In this sample, we only query without any parameters, so we can just return a cursor to 93 // all the weather data. 94 final MatrixCursor c = new MatrixCursor( 95 new String[]{ Columns.ID, Columns.DAY, Columns.TEMPERATURE }); 96 for (int i = 0; i < sData.size(); ++i) { 97 final WeatherDataPoint data = sData.get(i); 98 c.addRow(new Object[]{ new Integer(i), data.day, new Integer(data.degrees) }); 99 } 100 return c; 101 } 102 103 @Override 104 public String getType(Uri uri) { 105 return "vnd.android.cursor.dir/vnd.weatherlistwidget.temperature"; 106 } 107 108 @Override 109 public Uri insert(Uri uri, ContentValues values) { 110 // This example code does not support inserting 111 return null; 112 } 113 114 @Override 115 public int delete(Uri uri, String selection, String[] selectionArgs) { 116 // This example code does not support deleting 117 return 0; 118 } 119 120 @Override 121 public synchronized int update(Uri uri, ContentValues values, String selection, 122 String[] selectionArgs) { 123 assert(uri.getPathSegments().size() == 1); 124 125 // In this sample, we only update the content provider individually for each row with new 126 // temperature values. 127 final int index = Integer.parseInt(uri.getPathSegments().get(0)); 128 final MatrixCursor c = new MatrixCursor( 129 new String[]{ Columns.ID, Columns.DAY, Columns.TEMPERATURE }); 130 assert(0 <= index && index < sData.size()); 131 final WeatherDataPoint data = sData.get(index); 132 data.degrees = values.getAsInteger(Columns.TEMPERATURE); 133 134 // Notify any listeners that the data backing the content provider has changed, and return 135 // the number of rows affected. 136 getContext().getContentResolver().notifyChange(uri, null); 137 return 1; 138 } 139 140 } 141