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