-
-
Save JamalAlsanabani/32fab775543cbdd046a162bae24e1956 to your computer and use it in GitHub Desktop.
Contract class for a weather application called Sunshine
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright (C) 2014 The Android Open Source Project | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package com.example.android.sunshine.app.data; | |
import android.content.ContentResolver; | |
import android.content.ContentUris; | |
import android.net.Uri; | |
import android.provider.BaseColumns; | |
import android.text.format.Time; | |
/** | |
* Defines table and column names for the weather database. | |
*/ | |
public class WeatherContract { | |
// The "Content authority" is a name for the entire content provider, similar to the | |
// relationship between a domain name and its website. A convenient string to use for the | |
// content authority is the package name for the app, which is guaranteed to be unique on the | |
// device. | |
public static final String CONTENT_AUTHORITY = "com.example.android.sunshine.app"; | |
// Use CONTENT_AUTHORITY to create the base of all URI's which apps will use to contact | |
// the content provider. | |
public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY); | |
// Possible paths (appended to base content URI for possible URI's) | |
// For instance, content://com.example.android.sunshine.app/weather/ is a valid path for | |
// looking at weather data. content://com.example.android.sunshine.app/givemeroot/ will fail, | |
// as the ContentProvider hasn't been given any information on what to do with "givemeroot". | |
// At least, let's hope not. Don't be that dev, reader. Don't be that dev. | |
public static final String PATH_WEATHER = "weather"; | |
public static final String PATH_LOCATION = "location"; | |
// To make it easy to query for the exact date, we normalize all dates that go into | |
// the database to the start of the the Julian day at UTC. | |
public static long normalizeDate(long startDate) { | |
// normalize the start date to the beginning of the (UTC) day | |
Time time = new Time(); | |
time.set(startDate); | |
int julianDay = Time.getJulianDay(startDate, time.gmtoff); | |
return time.setJulianDay(julianDay); | |
} | |
/* Inner class that defines the table contents of the location table */ | |
public static final class LocationEntry implements BaseColumns { | |
public static final Uri CONTENT_URI = | |
BASE_CONTENT_URI.buildUpon().appendPath(PATH_LOCATION).build(); | |
public static final String CONTENT_TYPE = | |
ContentResolver.CURSOR_DIR_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + PATH_LOCATION; | |
public static final String CONTENT_ITEM_TYPE = | |
ContentResolver.CURSOR_ITEM_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + PATH_LOCATION; | |
// Table name | |
public static final String TABLE_NAME = "location"; | |
// The location setting string is what will be sent to openweathermap | |
// as the location query. | |
public static final String COLUMN_LOCATION_SETTING = "location_setting"; | |
// Human readable location string, provided by the API. Because for styling, | |
// "Mountain View" is more recognizable than 94043. | |
public static final String COLUMN_CITY_NAME = "city_name"; | |
// In order to uniquely pinpoint the location on the map when we launch the | |
// map intent, we store the latitude and longitude as returned by openweathermap. | |
public static final String COLUMN_COORD_LAT = "coord_lat"; | |
public static final String COLUMN_COORD_LONG = "coord_long"; | |
public static Uri buildLocationUri(long id) { | |
return ContentUris.withAppendedId(CONTENT_URI, id); | |
} | |
} | |
/* Inner class that defines the table contents of the weather table */ | |
public static final class WeatherEntry implements BaseColumns { | |
public static final Uri CONTENT_URI = | |
BASE_CONTENT_URI.buildUpon().appendPath(PATH_WEATHER).build(); | |
public static final String CONTENT_TYPE = | |
ContentResolver.CURSOR_DIR_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + PATH_WEATHER; | |
public static final String CONTENT_ITEM_TYPE = | |
ContentResolver.CURSOR_ITEM_BASE_TYPE + "/" + CONTENT_AUTHORITY + "/" + PATH_WEATHER; | |
public static final String TABLE_NAME = "weather"; | |
// Column with the foreign key into the location table. | |
public static final String COLUMN_LOC_KEY = "location_id"; | |
// Date, stored as long in milliseconds since the epoch | |
public static final String COLUMN_DATE = "date"; | |
// Weather id as returned by API, to identify the icon to be used | |
public static final String COLUMN_WEATHER_ID = "weather_id"; | |
// Short description and long description of the weather, as provided by API. | |
// e.g "clear" vs "sky is clear". | |
public static final String COLUMN_SHORT_DESC = "short_desc"; | |
// Min and max temperatures for the day (stored as floats) | |
public static final String COLUMN_MIN_TEMP = "min"; | |
public static final String COLUMN_MAX_TEMP = "max"; | |
// Humidity is stored as a float representing percentage | |
public static final String COLUMN_HUMIDITY = "humidity"; | |
// Humidity is stored as a float representing percentage | |
public static final String COLUMN_PRESSURE = "pressure"; | |
// Windspeed is stored as a float representing windspeed mph | |
public static final String COLUMN_WIND_SPEED = "wind"; | |
// Degrees are meteorological degrees (e.g, 0 is north, 180 is south). Stored as floats. | |
public static final String COLUMN_DEGREES = "degrees"; | |
public static Uri buildWeatherUri(long id) { | |
return ContentUris.withAppendedId(CONTENT_URI, id); | |
} | |
/* | |
Student: This is the buildWeatherLocation function you filled in. | |
*/ | |
public static Uri buildWeatherLocation(String locationSetting) { | |
return CONTENT_URI.buildUpon().appendPath(locationSetting).build(); | |
} | |
public static Uri buildWeatherLocationWithStartDate( | |
String locationSetting, long startDate) { | |
long normalizedDate = normalizeDate(startDate); | |
return CONTENT_URI.buildUpon().appendPath(locationSetting) | |
.appendQueryParameter(COLUMN_DATE, Long.toString(normalizedDate)).build(); | |
} | |
public static Uri buildWeatherLocationWithDate(String locationSetting, long date) { | |
return CONTENT_URI.buildUpon().appendPath(locationSetting) | |
.appendPath(Long.toString(normalizeDate(date))).build(); | |
} | |
public static String getLocationSettingFromUri(Uri uri) { | |
return uri.getPathSegments().get(1); | |
} | |
public static long getDateFromUri(Uri uri) { | |
return Long.parseLong(uri.getPathSegments().get(2)); | |
} | |
public static long getStartDateFromUri(Uri uri) { | |
String dateString = uri.getQueryParameter(COLUMN_DATE); | |
if (null != dateString && dateString.length() > 0) | |
return Long.parseLong(dateString); | |
else | |
return 0; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment