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