Last active
June 24, 2017 07:33
-
-
Save imrankst1221/113b3328564dc0b14072e6b792dab6a2 to your computer and use it in GitHub Desktop.
Programing Test for Cookpad Inc.
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
This Git made for Programing Test for Cookpad Inc. I use GitHub for manage version control system, but I use Gist for the first time. At first, I complete my project in GitHub after that I upload Gist. | |
Forgave me if I make any mistakes, I try my best. I Choose Android project and I share my code and detail bellow, | |
build.gradle: | |
I use some trusted library to make easier development and manage the project. Inside this file, you can see the list of library use in this project. | |
I try to develop simple and user-friendly UI. It's a single Activity project. I try to touch your all requirement in one page. dimens.xml is the value of text and other content sizes. | |
HomeActivity.java (activity_home.xml): | |
HomeActivity is the main solution page. I try to develop userfriendly and simple UI. | |
getWeatherAPI() is API call for reading data, initially, show a demo location's ("Dhaka") weather. The user can change location by using search option which can suggest city locations. | |
Use RxJava and RxAndroid books for Observable multitasking, OkHttpClient library for reading API and get value. Gson library to generate plain Old Java Objects from JSON format. | |
setCurrentWeather() is set all weather data for Activity and load image using Picasso. get the image from API. | |
setSearch() is getting offline .json file to suggest user locations. Read.java is getting the .json file from assets folder and return list of cities. citys.json is some demo citys name. | |
WeatherAdapter.java (layout_weather.xml) showing 7 dayes weather update bellow of activity with weekly name and image. | |
I also share all schemas that's use into my project. | |
If you have any query let me know, | |
Thnak you. | |
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
<?xml version="1.0" encoding="utf-8"?> | |
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | |
xmlns:app="http://schemas.android.com/apk/res-auto" | |
xmlns:tools="http://schemas.android.com/tools" | |
android:layout_width="fill_parent" | |
android:layout_height="fill_parent" | |
android:fitsSystemWindows="true" | |
tools:context="imrankst1221.weatherapp.ui.HomeActivity"> | |
<View | |
android:layout_width="match_parent" | |
android:layout_height="match_parent" | |
android:background="@drawable/bg_gradient"/> | |
<RelativeLayout | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:layout_margin="@dimen/margin.3"> | |
<AutoCompleteTextView | |
android:id="@+id/txt_search" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:minHeight="?attr/actionBarSize" | |
android:paddingLeft="@dimen/margin.2" | |
android:paddingRight="@dimen/margin.2" | |
android:layout_margin="@dimen/margin.1" | |
android:drawablePadding="@dimen/margin.3" | |
android:drawableLeft="@drawable/ic_search" | |
android:drawableRight="@drawable/ic_close" | |
android:textColor="@color/text.white" | |
android:textColorHint="@color/text.white" | |
android:inputType="text" | |
android:background="@color/white.transparent" | |
android:completionThreshold="2" | |
android:textSize="@dimen/text.size.medium" | |
android:imeOptions="actionDone" | |
android:hint="Search"/> | |
<TextView | |
android:id="@+id/txt_location" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:textStyle="bold" | |
android:layout_below="@+id/txt_search" | |
android:textSize="@dimen/text.size.7xl" | |
android:layout_centerHorizontal="true" | |
android:textColor="@color/text.white" | |
android:drawablePadding="@dimen/margin.2" | |
android:drawableLeft="@drawable/ic_location" | |
android:layout_marginTop="@dimen/margin.2" | |
android:gravity="center" | |
android:text="Dhaka"/> | |
<ImageView | |
android:id="@+id/img_weather" | |
android:layout_width="140dp" | |
android:layout_height="110dp" | |
android:layout_marginLeft="@dimen/margin.4" | |
android:layout_below="@id/txt_location" | |
android:src="@drawable/demo_weather"/> | |
<TextView | |
android:id="@+id/txt_detail" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_below="@+id/img_weather" | |
android:minEms="8" | |
android:layout_marginLeft="@dimen/margin.3" | |
android:textSize="@dimen/text.size.xl" | |
android:textColor="@color/text.white" | |
android:text="heavy intensity rain"/> | |
<RelativeLayout | |
android:id="@+id/layout_location" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_below="@id/txt_location" | |
android:layout_alignParentRight="true" | |
android:layout_margin="@dimen/margin.5"> | |
<TextView | |
android:id="@+id/txt_main" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:textSize="@dimen/text.size.7xl" | |
android:textColor="@color/text.white" | |
android:minEms="3" | |
android:gravity="center" | |
android:layout_alignParentRight="true" | |
android:textStyle="bold" | |
android:text="Drizzle"/> | |
<LinearLayout | |
android:id="@+id/layout_level" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_alignParentRight="true" | |
android:layout_below="@+id/txt_main" | |
android:orientation="horizontal"> | |
<TextView | |
android:id="@+id/txt_temp_min" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:textStyle="bold" | |
android:textSize="@dimen/text.size.4xl" | |
android:textColor="@color/text.white" | |
android:text="-09"/> | |
<TextView | |
android:id="@+id/txt_divider" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:textStyle="bold" | |
android:textSize="@dimen/text.size.4xl" | |
android:textColor="@color/text.white" | |
android:text=" / "/> | |
<TextView | |
android:id="@+id/txt_temp_max" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:textStyle="bold" | |
android:textSize="@dimen/text.size.4xl" | |
android:textColor="@color/text.white" | |
tools:text="09"/> | |
<TextView | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:textStyle="bold" | |
android:textSize="@dimen/text.size.4xl" | |
android:textColor="@color/text.white" | |
android:text=" \u00B0 C"/> | |
</LinearLayout> | |
<TextView | |
android:id="@+id/txt_time" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_below="@+id/layout_level" | |
android:minEms="5" | |
android:gravity="center" | |
android:layout_alignParentRight="true" | |
android:textSize="@dimen/text.size.xl" | |
android:textColor="@color/text.white" | |
android:text="12:02:34"/> | |
<TextView | |
android:id="@+id/txt_date" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_below="@+id/txt_time" | |
android:minEms="5" | |
android:gravity="center" | |
android:layout_alignParentRight="true" | |
android:textSize="@dimen/text.size.xl" | |
android:textColor="@color/text.white" | |
android:text="09/02/2017"/> | |
</RelativeLayout> | |
<RelativeLayout | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_centerHorizontal="true" | |
android:layout_marginTop="@dimen/margin.1" | |
android:layout_below="@id/layout_location"> | |
<TextView | |
android:id="@+id/txt_temp" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:textStyle="bold" | |
android:textSize="@dimen/text.size.superxXl" | |
android:textColor="@color/text.white" | |
android:text="-09"/> | |
<TextView | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:textStyle="bold" | |
android:gravity="right" | |
android:layout_toRightOf="@+id/txt_temp" | |
android:textSize="@dimen/text.size.superXl" | |
android:textColor="@color/text.white" | |
android:text=" \u00B0 C"/> | |
</RelativeLayout> | |
</RelativeLayout> | |
<android.support.v7.widget.RecyclerView | |
android:id="@+id/list_weather" | |
android:layout_width="match_parent" | |
android:layout_height="wrap_content" | |
android:layout_alignParentBottom="true" | |
android:layout_margin="@dimen/margin.3" | |
android:overScrollMode="always" /> | |
</RelativeLayout> |
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
<?xml version="1.0" encoding="utf-8"?> | |
<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
package="imrankst1221.weatherapp"> | |
<uses-permission android:name="android.permission.INTERNET" /> | |
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> | |
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> | |
<application | |
android:allowBackup="true" | |
android:icon="@mipmap/ic_launcher" | |
android:label="@string/app_name" | |
android:roundIcon="@mipmap/ic_launcher_round" | |
android:supportsRtl="true" | |
android:theme="@style/AppTheme"> | |
<activity android:name=".MainActivity"> | |
<intent-filter> | |
<action android:name="android.intent.action.MAIN" /> | |
<category android:name="android.intent.category.LAUNCHER" /> | |
</intent-filter> | |
</activity> | |
<activity android:name=".ui.HomeActivity" | |
android:windowSoftInputMode="stateAlwaysHidden|adjustPan" /> | |
</application> | |
</manifest> |
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
package imrankst1221.weatherapp.api.response_layer; | |
/** | |
* Created by [email protected] | |
*/ | |
public class APIResponse { | |
private int responseCode; | |
public String getResponseMessage() { | |
return responseMessage; | |
} | |
public void setResponseMessage(String responseMessage) { | |
this.responseMessage = responseMessage; | |
} | |
private String responseMessage; | |
public String getResponse() { | |
return response; | |
} | |
public void setResponse(String response) { | |
this.response = response; | |
} | |
public int getResponseCode() { | |
return responseCode; | |
} | |
public void setResponseCode(int responseCode) { | |
this.responseCode = responseCode; | |
//setMessage(responseCode); | |
} | |
public boolean isError() { | |
return isError; | |
} | |
public void setError(boolean error) { | |
isError = error; | |
} | |
public boolean isError; | |
private String response; | |
} |
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
package imrankst1221.weatherapp.api; | |
import android.util.Log; | |
import com.google.gson.Gson; | |
import com.google.gson.GsonBuilder; | |
import imrankst1221.weatherapp.Constants; | |
import imrankst1221.weatherapp.api.response_layer.APIResponse; | |
import imrankst1221.weatherapp.api.response_layer.WeatherResponse; | |
import imrankst1221.weatherapp.api.response_layer.WeeklyWeatherResponse; | |
import imrankst1221.weatherapp.api.response_layer.current_weather.Weather; | |
import imrankst1221.weatherapp.api.response_layer.weekly_weather.Weathers; | |
import imrankst1221.weatherapp.setting.NetworkTimeoutException; | |
import imrankst1221.weatherapp.utility.Utils; | |
import rx.Observable; | |
import rx.Subscriber; | |
/** | |
* Created by [email protected] | |
*/ | |
public class ApiService { | |
static final String TAG = "---API"; | |
//get current weather | |
public static Observable<WeatherResponse> getWeatherAPI(final String location) { | |
return Observable.create(new Observable.OnSubscribe<WeatherResponse>() { | |
String response = ""; | |
@Override | |
public void call(Subscriber<? super WeatherResponse> subscriber) { | |
try { | |
//String url = Utils.urlBuilder(Constants.API_GET_HOME_STATUS,params); | |
APIResponse apiResponse = ApiWorker.executeGETPublic("weather?q="+location+"&units=metric"); | |
if(apiResponse.getResponseCode() != Constants.NOT_FOUND) { | |
response = apiResponse.getResponse(); // Optional Check | |
WeatherResponse mResponse = new WeatherResponse(); | |
mResponse.setError(apiResponse.isError()); | |
if(!apiResponse.isError()) { | |
GsonBuilder builder = new GsonBuilder(); | |
builder.excludeFieldsWithoutExposeAnnotation(); | |
Gson gson = builder.create(); | |
Weather result = gson.fromJson(apiResponse.getResponse(), Weather.class); | |
mResponse.setWeather(result); | |
} else { | |
mResponse.setResponseMessage(apiResponse.getResponseMessage()); | |
} | |
if (!subscriber.isUnsubscribed()) { | |
subscriber.onNext(mResponse); | |
subscriber.onCompleted(); | |
} | |
} else { | |
if (!subscriber.isUnsubscribed()) { | |
NetworkTimeoutException networkTimeoutException = | |
new NetworkTimeoutException("Please check your internet connection"); | |
subscriber.onError(networkTimeoutException); | |
} | |
} | |
} catch (Exception e) { | |
Log.d(TAG, "-e "+e); | |
if (!subscriber.isUnsubscribed()) { | |
Utils.printLog(TAG+" API_RESPONSE", response); | |
e.printStackTrace(); | |
Utils.printLog(TAG+" ERROR", e.getMessage()); | |
subscriber.onError(e); | |
} | |
} | |
} | |
}); | |
} | |
//get weekly weather | |
public static Observable<WeeklyWeatherResponse> getWeeklyWeatherAPI(final String location) { | |
return Observable.create(new Observable.OnSubscribe<WeeklyWeatherResponse>() { | |
String response = ""; | |
@Override | |
public void call(Subscriber<? super WeeklyWeatherResponse> subscriber) { | |
try { | |
//String url = Utils.urlBuilder(Constants.API_GET_HOME_STATUS,params); | |
APIResponse apiResponse = ApiWorker.executeGETPublic("forecast/daily?q="+location+"&units=metric"+"&cnt=7"); | |
if(apiResponse.getResponseCode() != Constants.NOT_FOUND) { | |
response = apiResponse.getResponse(); // Optional Check | |
WeeklyWeatherResponse mResponse = new WeeklyWeatherResponse(); | |
mResponse.setError(apiResponse.isError()); | |
if(!apiResponse.isError()) { | |
GsonBuilder builder = new GsonBuilder(); | |
builder.excludeFieldsWithoutExposeAnnotation(); | |
Gson gson = builder.create(); | |
Weathers result = gson.fromJson(apiResponse.getResponse(), Weathers.class); | |
mResponse.setWeathers(result); | |
} else { | |
mResponse.setResponseMessage(apiResponse.getResponseMessage()); | |
} | |
if (!subscriber.isUnsubscribed()) { | |
subscriber.onNext(mResponse); | |
subscriber.onCompleted(); | |
} | |
} else { | |
if (!subscriber.isUnsubscribed()) { | |
NetworkTimeoutException networkTimeoutException = | |
new NetworkTimeoutException("Please check your internet connection"); | |
subscriber.onError(networkTimeoutException); | |
} | |
} | |
} catch (Exception e) { | |
if (!subscriber.isUnsubscribed()) { | |
Utils.printLog(TAG+" API_RESPONSE", response); | |
e.printStackTrace(); | |
Utils.printLog(TAG+" ERROR", e.getMessage()); | |
subscriber.onError(e); | |
} | |
} | |
} | |
}); | |
} | |
} |
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
package imrankst1221.weatherapp.api; | |
import android.text.TextUtils; | |
import java.io.IOException; | |
import java.security.KeyManagementException; | |
import java.security.NoSuchAlgorithmException; | |
import java.util.concurrent.TimeUnit; | |
import imrankst1221.weatherapp.Constants; | |
import imrankst1221.weatherapp.api.response_layer.APIResponse; | |
import imrankst1221.weatherapp.utility.Utils; | |
import okhttp3.MediaType; | |
import okhttp3.OkHttpClient; | |
import okhttp3.Request; | |
import okhttp3.RequestBody; | |
import okhttp3.Response; | |
/** | |
* Created by [email protected] | |
*/ | |
public class ApiWorker { | |
//OkHttpClient | |
private static OkHttpClient mClient = null; | |
private static String TAG = "--REQUEST URL = "; | |
//MediaType | |
private static final MediaType MEDIA_TYPE = MediaType.parse(Constants.API_CONTENT_TYPE); | |
public static OkHttpClient getClient() throws NoSuchAlgorithmException, KeyManagementException { | |
if (mClient == null) { | |
OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder(); | |
httpBuilder | |
.connectTimeout(15, TimeUnit.SECONDS) // Connection Timeout | |
.readTimeout(20, TimeUnit.SECONDS); // Read Timeout | |
/*//Stetho | |
if (BuildConfig.DEBUG) { | |
httpBuilder.addNetworkInterceptor(new StethoInterceptor()); | |
}*/ | |
mClient = httpBuilder.build(); | |
} | |
return mClient; | |
} | |
public static APIResponse executeGETPublic(String url) { | |
Utils.printLog(TAG, Constants.API_BASE_PATH + url +"&appid="+Constants.AUTHENTICATION_KEY); | |
APIResponse apiResponse = new APIResponse(); | |
try { | |
OkHttpClient client = ApiWorker.getClient(); | |
Request request; | |
if(TextUtils.isEmpty(url)) { | |
request = new Request.Builder() | |
.url(Constants.API_BASE_PATH) | |
.get() | |
.build(); | |
} else { | |
request = new Request.Builder() | |
.url(Constants.API_BASE_PATH + url +"&appid="+Constants.AUTHENTICATION_KEY) | |
.get() | |
.build(); | |
} | |
Response response = client.newCall(request).execute(); | |
apiResponse.setResponseCode(response.code()); | |
if(response.body().toString().isEmpty()) { | |
apiResponse.setResponse(null); | |
} else { | |
apiResponse.setResponse(response.body().string()); | |
} | |
apiResponse.setResponseCode(response.code()); | |
return apiResponse; | |
} catch (NoSuchAlgorithmException e) { | |
e.printStackTrace(); | |
apiResponse.setError(true); | |
String errorMessage = e.getMessage(); | |
if(TextUtils.isEmpty(errorMessage)) { | |
errorMessage = "NoSuchAlgorithmException"; | |
} | |
apiResponse.setResponseMessage(errorMessage); | |
apiResponse.setResponseCode(404);// Default = Not Found | |
return apiResponse; | |
} catch (KeyManagementException e) { | |
e.printStackTrace(); | |
apiResponse.setError(true); | |
String errorMessage = e.getMessage(); | |
if(TextUtils.isEmpty(errorMessage)) { | |
errorMessage = "KeyManagementException"; | |
} | |
apiResponse.setResponseMessage(errorMessage); | |
apiResponse.setResponseCode(404);// Default = Not Found | |
return apiResponse; | |
} catch (IOException e) { | |
e.printStackTrace(); | |
apiResponse.setError(true); | |
String errorMessage = e.getMessage(); | |
if(TextUtils.isEmpty(errorMessage)) { | |
errorMessage = "IOException"; | |
} | |
apiResponse.setResponseMessage(errorMessage); | |
apiResponse.setResponseCode(404);// Default = Not Found | |
return apiResponse; | |
} catch (Exception e) { | |
e.printStackTrace(); | |
apiResponse.setError(true); | |
String errorMessage = e.getMessage(); | |
if(TextUtils.isEmpty(errorMessage)) { | |
errorMessage = "Unknown Exception"; | |
} | |
apiResponse.setResponseMessage(errorMessage); | |
apiResponse.setResponseCode(404);// Default = Not Found | |
return apiResponse; | |
} | |
} | |
} |
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
<?xml version="1.0" encoding="utf-8"?> | |
<shape xmlns:android="http://schemas.android.com/apk/res/android"> | |
<gradient | |
android:angle="225" | |
android:endColor="@color/colorPrimary" | |
android:startColor="@color/colorAccent" /> | |
</shape> |
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
apply plugin: 'com.android.application' | |
apply plugin: 'com.neenbedankt.android-apt' | |
android { | |
compileSdkVersion 25 | |
buildToolsVersion "25.0.3" | |
defaultConfig { | |
applicationId "imrankst1221.weatherapp" | |
minSdkVersion 16 | |
targetSdkVersion 25 | |
versionCode 1 | |
versionName "1.0" | |
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" | |
} | |
buildTypes { | |
release { | |
minifyEnabled false | |
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' | |
} | |
} | |
} | |
dependencies { | |
compile fileTree(dir: 'libs', include: ['*.jar']) | |
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { | |
exclude group: 'com.android.support', module: 'support-annotations' | |
}) | |
compile 'com.android.support:appcompat-v7:25.3.1' | |
testCompile 'junit:junit:4.12' | |
///libraries that's used in the project. | |
compile 'com.android.support:recyclerview-v7:25.3.1' | |
compile 'com.android.support:appcompat-v7:25.3.1' | |
compile 'com.android.support:cardview-v7:25.3.1' | |
compile 'com.android.support:design:25.3.1' | |
compile 'com.jakewharton:butterknife:8.4.0' | |
apt 'com.jakewharton:butterknife-compiler:8.4.0' | |
compile 'com.squareup.picasso:picasso:2.3.2' | |
compile 'com.google.code.gson:gson:2.7' | |
compile 'com.squareup.okhttp3:okhttp:3.3.0' | |
compile 'io.reactivex:rxandroid:1.0.1' | |
compile 'io.reactivex:rxjava:1.0.15' | |
} |
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
{ | |
"citys": [{ | |
"name": "Hurzuf" | |
}, { | |
"name": "Novinki" | |
}, { | |
"name": "Dhaka" | |
}, { | |
"name": "Gorkhā" | |
}, { | |
"name": "State of Haryāna" | |
}, { | |
"name": "Holubynka" | |
}, { | |
"name": "Bāgmatī Zone" | |
}, { | |
"name": "Mar’ina Roshcha" | |
}, { | |
"name": "Republic of India" | |
}, { | |
"name": "Kathmandu" | |
}, { | |
"name": "Laspi" | |
}, { | |
"name": "Merida" | |
}, { | |
"name": "Vinogradovo" | |
}, { | |
"name": "Qarah Gawl al ‘Ulyā" | |
}, { | |
"name": "Cherkizovo" | |
}, { | |
"name": "Alupka" | |
}, { | |
"name": "Lichtenrade" | |
}, { | |
"name": "Zavety Il’icha" | |
}, { | |
"name": "‘Azriqam" | |
}, { | |
"name": "Ghūra" | |
}, { | |
"name": "Tyuzler" | |
}, { | |
"name": "Zaponor’ye" | |
}, { | |
"name": "Il’ichëvka" | |
}, { | |
"name": "Partyzans’ke" | |
}, { | |
"name": "Yurevichi" | |
}, { | |
"name": "Gumist’a" | |
}, { | |
"name": "Ptitsefabrika" | |
}, { | |
"name": "Orekhovo" | |
}, { | |
"name": "Birim" | |
}, { | |
"name": "Priiskovyy" | |
}, { | |
"name": "Dzhaga" | |
}, { | |
"name": "Tret’ya Rota" | |
}, { | |
"name": "Ruislip" | |
}, { | |
"name": "Karow" | |
}, { | |
"name": "Gatow" | |
}, { | |
"name": "Mkuze" | |
}, { | |
"name": "Lhasa" | |
}, { | |
"name": "İstanbul" | |
}, { | |
"name": "Mao" | |
}, { | |
"name": "Russian Federation" | |
}, { | |
"name": "De-Friz" | |
}, { | |
"name": "Rumbak" | |
}, { | |
"name": "Vavibet" | |
}, { | |
"name": "Surtagān Chib" | |
}, { | |
"name": "Rīgas Rajons" | |
}, { | |
"name": "Verkhneye Shchekotikhino" | |
}, { | |
"name": "Bucha" | |
}, { | |
"name": "Republic of Poland" | |
}, { | |
"name": "Kuchary" | |
}, { | |
"name": "North America" | |
}, { | |
"name": "Brumaire" | |
}, { | |
"name": "Ishikawa-ken" | |
}, { | |
"name": "Matoba" | |
}, { | |
"name": "Pya" | |
}, { | |
"name": "Kalanac" | |
}, { | |
"name": "Federal Republic of Germany" | |
}, { | |
"name": "Land Nordrhein-Westfalen" | |
}, { | |
"name": "Mutaykutan" | |
}, { | |
"name": "Nalchik" | |
}, { | |
"name": "Kolganov" | |
}, { | |
"name": "Rybatskiy" | |
}, { | |
"name": "Bellara" | |
}, { | |
"name": "Bartlett" | |
}, { | |
"name": "Rietfontein" | |
}, { | |
"name": "Hardap" | |
}, { | |
"name": "Botswana" | |
}, { | |
"name": "El Destierro" | |
}, { | |
"name": "Jones Crossroads" | |
}, { | |
"name": "Vernon Parish" | |
}, { | |
"name": "Pennick" | |
}, { | |
"name": "Black Bear Spring" | |
}, { | |
"name": "Bee House" | |
}, { | |
"name": "Morden" | |
}, { | |
"name": "Nasirotu" | |
}, { | |
"name": "Sisali" | |
}, { | |
"name": "Puntan" | |
}, { | |
"name": "Tsiémé-Mandiélé" | |
}, { | |
"name": "Masama" | |
}, { | |
"name": "Purukcahu" | |
}, { | |
"name": "Néméyong II" | |
}, { | |
"name": "Pondok Genteng" | |
}, { | |
"name": "Mbongoté" | |
}, { | |
"name": "Amiling" | |
}, { | |
"name": "Kélkoto" | |
}, { | |
"name": "Angetu" | |
}, { | |
"name": "Massa" | |
}, { | |
"name": "Tumko" | |
}, { | |
"name": "Moskva" | |
}, { | |
"name": "Japan" | |
}, { | |
"name": "Hokkaidō" | |
}, { | |
"name": "Sanggrahan" | |
}, { | |
"name": "Karangmangle" | |
}, { | |
"name": "Sheremetyevskiy" | |
}, { | |
"name": "Yershovo" | |
}, { | |
"name": "Znamenka" | |
}, { | |
"name": "Lisbon" | |
}, { | |
"name": "Walbrzych" | |
}, { | |
"name": "Naklo nad Notecia" | |
}, { | |
"name": "Zhengzhou" | |
}, { | |
"name": "Tonyrefail" | |
}, { | |
"name": "Bankra" | |
}, { | |
"name": "Europe" | |
}, { | |
"name": "Moskovskaya Oblast’" | |
}, { | |
"name": "Provo" | |
}, { | |
"name": "Tejon" | |
}, { | |
"name": "Guliston" | |
}, { | |
"name": "Ciciler" | |
}, { | |
"name": "Bilmece" | |
}, { | |
"name": "Provincia de Pontevedra" | |
}, { | |
"name": "Carmarthenshire" | |
}, { | |
"name": "Helsinki" | |
}, { | |
"name": "Gemeente Wervershoof" | |
}, { | |
"name": "Forville" | |
}, { | |
"name": "Tall ‘Alāwī" | |
}, { | |
"name": "La Portanière" | |
}, { | |
"name": "East Portlemouth" | |
}, { | |
"name": "Whyalla" | |
}, { | |
"name": "Terrace End" | |
}, { | |
"name": "Hashimoto" | |
}, { | |
"name": "Tsukuba-kenkyūgakuen-toshi" | |
}, { | |
"name": "Higashi-asahimachi" | |
}, { | |
"name": "Hanabatachō" | |
}, { | |
"name": "Senzaki" | |
}, { | |
"name": "Sakaki" | |
}, { | |
"name": "Daisen" | |
}, { | |
"name": "Ikaruga" | |
}, { | |
"name": "Matsuzaki" | |
}, { | |
"name": "Noboribetsu" | |
}, { | |
"name": "Grandate" | |
}, { | |
"name": "Biella" | |
}, { | |
"name": "Soverato" | |
}, { | |
"name": "Pinerolo" | |
}, { | |
"name": "Dundee City" | |
}, { | |
"name": "Nuneaton and Bedworth District" | |
}, { | |
"name": "Rhyl" | |
}, { | |
"name": "Foulridge" | |
}, { | |
"name": "Hermitage" | |
}, { | |
"name": "Golcar" | |
}, { | |
"name": "Thornbury" | |
}, { | |
"name": "Peterhof" | |
}, { | |
"name": "Grebnevo" | |
}, { | |
"name": "Centro Habana" | |
}, { | |
"name": "Carolina" | |
}, { | |
"name": "Gustavia" | |
}, { | |
"name": "Xianju" | |
}, { | |
"name": "Tōkyō-to" | |
}, { | |
"name": "Washington" | |
}, { | |
"name": "San Dimas" | |
}, { | |
"name": "Culfa" | |
}, { | |
"name": "Bandar Emām Khomeynī" | |
}, { | |
"name": "Shāhrūd" | |
}, { | |
"name": "Bo" | |
}, { | |
"name": "Daché" | |
}, { | |
"name": "Département de l'Ouest" | |
}, { | |
"name": "Montescudo" | |
}, { | |
"name": "San Pedro" | |
}, { | |
"name": "Wels(Stadt)" | |
}, { | |
"name": "Palmerston" | |
}, { | |
"name": "Telmankend" | |
}, { | |
"name": "Neftcala" | |
}, { | |
"name": "Pushkino" | |
}, { | |
"name": "Visé" | |
}] | |
} |
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
package imrankst1221.weatherapp.api.response_layer.current_weather; | |
import com.google.gson.annotations.Expose; | |
import com.google.gson.annotations.SerializedName; | |
public class Clouds { | |
@SerializedName("all") | |
@Expose | |
private Long all; | |
public Long getAll() { | |
return all; | |
} | |
public void setAll(Long all) { | |
this.all = all; | |
} | |
} |
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
package imrankst1221.weatherapp.api.response_layer.current_weather; | |
import com.google.gson.annotations.Expose; | |
import com.google.gson.annotations.SerializedName; | |
public class Coord { | |
@SerializedName("lon") | |
@Expose | |
private Double lon; | |
@SerializedName("lat") | |
@Expose | |
private Double lat; | |
public Double getLon() { | |
return lon; | |
} | |
public void setLon(Double lon) { | |
this.lon = lon; | |
} | |
public Double getLat() { | |
return lat; | |
} | |
public void setLat(Double lat) { | |
this.lat = lat; | |
} | |
} |
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
<resources> | |
<!-- Default screen margins, per the Android Design guidelines. --> | |
<dimen name="activity_horizontal_margin">16dp</dimen> | |
<dimen name="activity_vertical_margin">16dp</dimen> | |
<dimen name="tabsHeight">48dp</dimen> | |
<dimen name="fab_margin">8dp</dimen> | |
<!--Default value for margin Created imrankst1221 --> | |
<dimen name="margin.1">4dp</dimen> | |
<dimen name="margin.2">8dp</dimen> | |
<dimen name="margin.3">12dp</dimen> | |
<dimen name="margin.4">16dp</dimen> | |
<dimen name="margin.5">20dp</dimen> | |
<dimen name="margin.6">24dp</dimen> | |
<dimen name="margin.7">28dp</dimen> | |
<dimen name="margin.8">32dp</dimen> | |
<!--Default size for content--> | |
<dimen name="content.size.micro">60dp</dimen> | |
<dimen name="content.size.mini">80dp</dimen> | |
<dimen name="content.size.small">110dp</dimen> | |
<dimen name="content.size.regular">120dp</dimen> | |
<dimen name="content.size.medium">140dp</dimen> | |
<dimen name="content.size.large">160dp</dimen> | |
<!--Default width size for content--> | |
<dimen name="content.size.width.micro">140dp</dimen> | |
<dimen name="content.size.width.small">160dp</dimen> | |
<dimen name="content.size.width.regular">180dp</dimen> | |
<dimen name="content.size.width.medium">220dp</dimen> | |
<dimen name="content.size.width.large">250dp</dimen> | |
<dimen name="content.size.width.extra">320dp</dimen> | |
<!-- Text sizes --> | |
<dimen name="text.size.nano">7sp</dimen> | |
<dimen name="text.size.micro">9sp</dimen> | |
<dimen name="text.size.small">10sp</dimen> | |
<dimen name="text.size.regular">12sp</dimen> | |
<dimen name="text.size.medium">14sp</dimen> | |
<dimen name="text.size.large">16sp</dimen> | |
<dimen name="text.size.xl">18sp</dimen> | |
<dimen name="text.size.2xl">20sp</dimen> | |
<dimen name="text.size.3xl">22sp</dimen> | |
<dimen name="text.size.4xl">24sp</dimen> | |
<dimen name="text.size.5xl">26sp</dimen> | |
<dimen name="text.size.6xl">28sp</dimen> | |
<dimen name="text.size.7xl">30sp</dimen> | |
<dimen name="text.size.superXl">40sp</dimen> | |
<dimen name="text.size.superxXl">100sp</dimen> | |
<dimen name="text.size.tab">@dimen/text.size.medium</dimen> | |
<dimen name="text.size.title">@dimen/text.size.3xl</dimen> | |
<dimen name="text.size.subTitle">@dimen/text.size.xl</dimen> | |
<dimen name="height.dashboard.item">140dp</dimen> | |
<dimen name="width.dashboard.item">100dp</dimen> | |
<dimen name="height.image.item">50dp</dimen> | |
</resources> |
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
package imrankst1221.weatherapp.ui; | |
import android.app.ProgressDialog; | |
import android.content.Context; | |
import android.os.Handler; | |
import android.os.Looper; | |
import android.support.v7.app.AppCompatActivity; | |
import android.os.Bundle; | |
import android.support.v7.widget.LinearLayoutManager; | |
import android.support.v7.widget.RecyclerView; | |
import android.util.Log; | |
import android.view.KeyEvent; | |
import android.view.View; | |
import android.view.inputmethod.EditorInfo; | |
import android.widget.AdapterView; | |
import android.widget.ArrayAdapter; | |
import android.widget.AutoCompleteTextView; | |
import android.widget.ImageView; | |
import android.widget.TextView; | |
import com.squareup.picasso.Picasso; | |
import java.io.IOException; | |
import java.io.OutputStreamWriter; | |
import java.sql.Date; | |
import java.text.SimpleDateFormat; | |
import java.util.ArrayList; | |
import java.util.List; | |
import butterknife.BindView; | |
import butterknife.ButterKnife; | |
import imrankst1221.weatherapp.Constants; | |
import imrankst1221.weatherapp.R; | |
import imrankst1221.weatherapp.api.ApiService; | |
import imrankst1221.weatherapp.api.response_layer.WeatherResponse; | |
import imrankst1221.weatherapp.api.response_layer.WeeklyWeatherResponse; | |
import imrankst1221.weatherapp.api.response_layer.current_weather.Weather; | |
import imrankst1221.weatherapp.api.response_layer.weekly_weather.Weathers; | |
import imrankst1221.weatherapp.common.CustomProgressDialog; | |
import imrankst1221.weatherapp.common.MyCustomDialog; | |
import imrankst1221.weatherapp.common.Read; | |
import imrankst1221.weatherapp.common.citys.City; | |
import imrankst1221.weatherapp.setting.NetworkTimeoutException; | |
import imrankst1221.weatherapp.utility.UtilMethods; | |
import imrankst1221.weatherapp.utility.Utils; | |
import rx.Subscriber; | |
import rx.android.schedulers.AndroidSchedulers; | |
import rx.schedulers.Schedulers; | |
public class HomeActivity extends AppCompatActivity { | |
private Context mContext; | |
private String TAG = "---HomeActivity"; | |
private String demoLocation = "Dhaka"; | |
private ProgressDialog progress; | |
private MyCustomDialog myCustomDialog; | |
private WeatherAdapter weatherAdapter; | |
private ArrayAdapter searchAdapter; | |
private ArrayList<City> cities; | |
@BindView(R.id.txt_location) | |
TextView txtLocation; | |
@BindView(R.id.txt_main) | |
TextView txtMain; | |
@BindView(R.id.txt_temp_min) | |
TextView txtTempMin; | |
@BindView(R.id.txt_temp_max) | |
TextView txtTempMax; | |
@BindView(R.id.txt_temp) | |
TextView txtTemp; | |
@BindView(R.id.txt_date) | |
TextView txtDate; | |
@BindView(R.id.txt_time) | |
TextView txtTime; | |
@BindView(R.id.txt_detail) | |
TextView txtDetail; | |
@BindView(R.id.txt_search) | |
AutoCompleteTextView txtSearch; | |
@BindView(R.id.img_weather) | |
ImageView imgWeather; | |
@BindView(R.id.list_weather) | |
RecyclerView listWeather; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_home); | |
mContext = this; | |
ButterKnife.bind(this); | |
progress = new CustomProgressDialog(mContext); | |
myCustomDialog = new MyCustomDialog(); | |
//initially get demo location data | |
getWeatherAPI(demoLocation); | |
//initial search values | |
setSearch(); | |
} | |
private void setSearch() { | |
//get offline .json city name | |
Read mRead = new Read(mContext); | |
cities = mRead.loadCitys().getCityses(); | |
Log.d(TAG, ""+cities.size()); | |
final List<String> items = new ArrayList(); | |
for(City item : cities){ | |
items.add(item.getName()); | |
} | |
searchAdapter = new ArrayAdapter<String>(this, | |
android.R.layout.simple_list_item_1, items); | |
txtSearch.setAdapter(searchAdapter); | |
//search suggestion adapter item on click action | |
txtSearch.setOnItemClickListener(new AdapterView.OnItemClickListener() { | |
@Override | |
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { | |
int index; | |
txtSearch.setText(""); | |
UtilMethods.hideSoftKeyboard(HomeActivity.this); | |
index = cities.indexOf(parent.getItemAtPosition(position)); | |
Log.d(TAG, parent.getItemAtPosition(position)+" "+index); | |
getWeatherAPI(parent.getItemAtPosition(position).toString()); | |
} | |
}); | |
//if not found in suggestion then keyboard's done button action | |
txtSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() { | |
@Override | |
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { | |
if( actionId== EditorInfo.IME_ACTION_DONE) { | |
getWeatherAPI(txtSearch.getText().toString()); | |
txtSearch.setText(""); | |
UtilMethods.hideSoftKeyboard(HomeActivity.this); | |
} | |
return true; | |
} | |
}); | |
} | |
public void setCurrentWeather(Weather mWeather) { | |
try{ | |
txtLocation.setText(mWeather.getName()); | |
txtTemp.setText(mWeather.getMain().getTemp().toString()); | |
txtTempMax.setText(mWeather.getMain().getTempMax().toString()); | |
txtTempMin.setText(mWeather.getMain().getTempMin().toString()); | |
txtTime.setText(new SimpleDateFormat("HH:mm:ss").format(new Date(mWeather.getDt() * 1000L))); | |
txtDate.setText(new SimpleDateFormat("MM/dd/yyyy").format(new Date(mWeather.getDt() * 1000L))); | |
txtMain.setText(mWeather.getWeather().get(0).getMain()); | |
txtDetail.setText(mWeather.getWeather().get(0).getDescription()); | |
Picasso.with(mContext).load(Constants.API_IMAGE_PATH + mWeather.getWeather().get(0).getIcon()+".png"). | |
placeholder(R.drawable.ic_placeholder).error(R.drawable.ic_placeholder).into(imgWeather); | |
}catch (Exception ex){ | |
Log.e(TAG, "--"+ex); | |
} | |
} | |
private void setWeekltWeather(Weathers mWeathers) { | |
weatherAdapter = new WeatherAdapter(mContext, mWeathers.getList()); | |
listWeather.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false)); | |
listWeather.setAdapter(weatherAdapter); | |
} | |
private void getWeatherAPI(String location) { | |
if(Utils.internetCheck(mContext)) { | |
showProgressDialog(); | |
ApiService.getWeatherAPI(location) | |
.subscribeOn(Schedulers.newThread()) | |
.observeOn(AndroidSchedulers.mainThread()) | |
.subscribe(new Subscriber<WeatherResponse>() { | |
@Override | |
public void onCompleted() { | |
} | |
@Override | |
public void onError(Throwable e) { | |
dismisProgressDialog(); | |
if(e instanceof NetworkTimeoutException) { | |
NetworkTimeoutException networkTimeoutException = (NetworkTimeoutException) e; | |
myCustomDialog.myDialog(mContext, "Network Error", networkTimeoutException.getMessage()); | |
} else { | |
myCustomDialog.myDialog(mContext, "Error", "Sorry! Please enter current City name."); | |
} | |
} | |
@Override | |
public void onNext(WeatherResponse mResponse) { | |
if(mResponse.isError()) { | |
dismisProgressDialog(); | |
myCustomDialog.myDialog(mContext, "Error", mResponse.getResponseMessage()); | |
} else { | |
Weather mWeather = mResponse.getWeather(); | |
if(mWeather.getName()!=null){ | |
dismisProgressDialog(); | |
setCurrentWeather(mWeather); | |
getWeeklyWeatherAPI(demoLocation); | |
}else { | |
dismisProgressDialog(); | |
myCustomDialog.myDialog(mContext, "Error-II", "Sorry! Please try later."); | |
} | |
} | |
} | |
}); | |
}else { | |
myCustomDialog.myDialog(mContext, "Error", getString(R.string.massage_nointernet)); | |
} | |
} | |
private void getWeeklyWeatherAPI(String location) { | |
if(Utils.internetCheck(mContext)) { | |
ApiService.getWeeklyWeatherAPI(location) | |
.subscribeOn(Schedulers.newThread()) | |
.observeOn(AndroidSchedulers.mainThread()) | |
.subscribe(new Subscriber<WeeklyWeatherResponse>() { | |
@Override | |
public void onCompleted() { | |
} | |
@Override | |
public void onError(Throwable e) { | |
dismisProgressDialog(); | |
if(e instanceof NetworkTimeoutException) { | |
NetworkTimeoutException networkTimeoutException = (NetworkTimeoutException) e; | |
myCustomDialog.myDialog(mContext, "Network Error", networkTimeoutException.getMessage()); | |
} else { | |
myCustomDialog.myDialog(mContext, "Error-", "Sorry! Please try later."); | |
} | |
} | |
@Override | |
public void onNext(WeeklyWeatherResponse mResponse) { | |
dismisProgressDialog(); | |
if(mResponse.isError()) { | |
myCustomDialog.myDialog(mContext, "Error--", mResponse.getResponseMessage()); | |
} else { | |
Weathers mWeathers = mResponse.getWeathers(); | |
if(mWeathers.getCity()!=null){ | |
setWeekltWeather(mWeathers); | |
}else { | |
myCustomDialog.myDialog(mContext, "Error-II", "Sorry! Please try later."); | |
} | |
} | |
} | |
}); | |
}else { | |
myCustomDialog.myDialog(mContext, "Error", getString(R.string.massage_nointernet)); | |
} | |
} | |
//method for dialog show and dismis | |
private void showProgressDialog() { | |
Handler mainHandler = new Handler(Looper.getMainLooper()); | |
Runnable myRunnable = new Runnable() { | |
@Override | |
public void run() { | |
progress.show(); | |
} | |
}; | |
mainHandler.post(myRunnable); | |
} | |
private void dismisProgressDialog() { | |
progress.dismiss(); | |
} | |
} |
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
<?xml version="1.0" encoding="utf-8"?> | |
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" | |
xmlns:card_view="http://schemas.android.com/apk/res-auto" | |
xmlns:tools="http://schemas.android.com/tools" | |
android:id="@+id/card_view_top" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_alignParentTop="true" | |
android:layout_centerHorizontal="true" | |
android:foreground="?android:attr/selectableItemBackground" | |
card_view:cardBackgroundColor="@color/colorPrimary" | |
card_view:cardCornerRadius="@dimen/margin.3" | |
card_view:contentPaddingLeft="@dimen/margin.3" | |
card_view:contentPaddingRight="@dimen/margin.3" | |
card_view:cardPreventCornerOverlap="false" | |
card_view:cardUseCompatPadding="true" | |
tools:context=".ui.HomeActivity"> | |
<RelativeLayout | |
android:layout_width="@dimen/width.dashboard.item" | |
android:layout_height="@dimen/height.dashboard.item" | |
android:clickable="false" | |
android:layout_gravity="center"> | |
<TextView | |
android:id="@+id/txt_day" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:textStyle="bold" | |
android:layout_centerHorizontal="true" | |
android:layout_marginTop="@dimen/margin.1" | |
android:textSize="@dimen/text.size.xl" | |
android:textColor="@color/text.white" | |
android:text="Sunday"/> | |
<ImageView | |
android:id="@+id/img_weather" | |
android:layout_width="@dimen/height.image.item" | |
android:layout_height="@dimen/height.image.item" | |
android:adjustViewBounds="true" | |
android:layout_below="@+id/txt_day" | |
android:layout_centerHorizontal="true" | |
android:src="@drawable/demo_weather" /> | |
<TextView | |
android:id="@+id/txt_weather" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_centerHorizontal="true" | |
android:layout_below="@+id/img_weather" | |
android:textSize="@dimen/text.size.xl" | |
android:textColor="@color/text.white" | |
android:text="Drizzle"/> | |
<LinearLayout | |
android:id="@+id/layout_level" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:layout_centerHorizontal="true" | |
android:layout_alignParentBottom="true" | |
android:layout_below="@id/txt_weather" | |
android:layout_marginBottom="@dimen/margin.3" | |
android:orientation="horizontal"> | |
<TextView | |
android:id="@+id/txt_temp_min" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:textStyle="bold" | |
android:textSize="@dimen/text.size.xl" | |
android:textColor="@color/text.white" | |
android:text="-09"/> | |
<TextView | |
android:id="@+id/txt_divider" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:textStyle="bold" | |
android:textSize="@dimen/text.size.xl" | |
android:textColor="@color/text.white" | |
android:text=" / "/> | |
<TextView | |
android:id="@+id/txt_temp_max" | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:textStyle="bold" | |
android:textSize="@dimen/text.size.xl" | |
android:textColor="@color/text.white" | |
tools:text="09"/> | |
<TextView | |
android:layout_width="wrap_content" | |
android:layout_height="wrap_content" | |
android:textStyle="bold" | |
android:textSize="@dimen/text.size.xl" | |
android:textColor="@color/text.white" | |
android:text=" \u00B0 C"/> | |
</LinearLayout> | |
</RelativeLayout> | |
</android.support.v7.widget.CardView> |
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
package imrankst1221.weatherapp.api.response_layer.current_weather; | |
import com.google.gson.annotations.Expose; | |
import com.google.gson.annotations.SerializedName; | |
public class Main { | |
@SerializedName("temp") | |
@Expose | |
private Long temp; | |
@SerializedName("pressure") | |
@Expose | |
private Long pressure; | |
@SerializedName("humidity") | |
@Expose | |
private Long humidity; | |
@SerializedName("temp_min") | |
@Expose | |
private Long tempMin; | |
@SerializedName("temp_max") | |
@Expose | |
private Long tempMax; | |
public Long getTemp() { | |
return temp; | |
} | |
public void setTemp(Long temp) { | |
this.temp = temp; | |
} | |
public Long getPressure() { | |
return pressure; | |
} | |
public void setPressure(Long pressure) { | |
this.pressure = pressure; | |
} | |
public Long getHumidity() { | |
return humidity; | |
} | |
public void setHumidity(Long humidity) { | |
this.humidity = humidity; | |
} | |
public Long getTempMin() { | |
return tempMin; | |
} | |
public void setTempMin(Long tempMin) { | |
this.tempMin = tempMin; | |
} | |
public Long getTempMax() { | |
return tempMax; | |
} | |
public void setTempMax(Long tempMax) { | |
this.tempMax = tempMax; | |
} | |
} |
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
package imrankst1221.weatherapp.setting; | |
/** | |
* Created by [email protected] | |
*/ | |
public class NetworkTimeoutException extends Exception { | |
@Override | |
public String getMessage() { | |
return message; | |
} | |
public void setMessage(String message) { | |
this.message = message; | |
} | |
String message; | |
public NetworkTimeoutException(String message) { | |
this.message = message; | |
} | |
} |
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
package imrankst1221.weatherapp.common; | |
import android.content.Context; | |
import android.util.Log; | |
import com.google.gson.Gson; | |
import com.google.gson.GsonBuilder; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import imrankst1221.weatherapp.common.citys.Citys; | |
public class Read { | |
Context mContext; | |
public Read(Context mContext){ | |
this.mContext = mContext; | |
} | |
public Citys loadCitys() { | |
Citys items = new Citys(); | |
String json = null; | |
try { | |
InputStream is = mContext.getAssets().open("citys.json"); | |
int size = is.available(); | |
byte[] buffer = new byte[size]; | |
is.read(buffer); | |
is.close(); | |
json = new String(buffer, "UTF-8"); | |
} catch (IOException ex) { | |
ex.printStackTrace(); | |
return null; | |
} | |
try { | |
GsonBuilder builder = new GsonBuilder(); | |
builder.excludeFieldsWithoutExposeAnnotation(); | |
Gson gson = builder.create(); | |
items = gson.fromJson(json, Citys.class); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
return items; | |
} | |
} |
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
<resources> | |
<!-- Base application theme. --> | |
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> | |
<!-- Customize your theme here. --> | |
<item name="colorPrimary">@color/colorPrimary</item> | |
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> | |
<item name="colorAccent">@color/accent</item> | |
</style> | |
<!--theme for progress bar--> | |
<style name="CircularProgress" parent="Theme.AppCompat.Light"> | |
<item name="colorAccent">@color/white</item> | |
</style> | |
</resources> |
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
package imrankst1221.weatherapp.api.response_layer.current_weather; | |
import com.google.gson.annotations.Expose; | |
import com.google.gson.annotations.SerializedName; | |
public class Sys { | |
@SerializedName("type") | |
@Expose | |
private Long type; | |
@SerializedName("id") | |
@Expose | |
private Long id; | |
@SerializedName("message") | |
@Expose | |
private Double message; | |
@SerializedName("country") | |
@Expose | |
private String country; | |
@SerializedName("sunrise") | |
@Expose | |
private Long sunrise; | |
@SerializedName("sunset") | |
@Expose | |
private Long sunset; | |
public Long getType() { | |
return type; | |
} | |
public void setType(Long type) { | |
this.type = type; | |
} | |
public Long getId() { | |
return id; | |
} | |
public void setId(Long id) { | |
this.id = id; | |
} | |
public Double getMessage() { | |
return message; | |
} | |
public void setMessage(Double message) { | |
this.message = message; | |
} | |
public String getCountry() { | |
return country; | |
} | |
public void setCountry(String country) { | |
this.country = country; | |
} | |
public Long getSunrise() { | |
return sunrise; | |
} | |
public void setSunrise(Long sunrise) { | |
this.sunrise = sunrise; | |
} | |
public Long getSunset() { | |
return sunset; | |
} | |
public void setSunset(Long sunset) { | |
this.sunset = sunset; | |
} | |
} |
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
package imrankst1221.weatherapp.api.response_layer.current_weather; | |
import java.util.List; | |
import com.google.gson.annotations.Expose; | |
import com.google.gson.annotations.SerializedName; | |
public class Weather { | |
@SerializedName("coord") | |
@Expose | |
private Coord coord; | |
@SerializedName("weather") | |
@Expose | |
private List<WeatherItem> weather = null; | |
@SerializedName("base") | |
@Expose | |
private String base; | |
@SerializedName("main") | |
@Expose | |
private Main main; | |
@SerializedName("visibility") | |
@Expose | |
private Long visibility; | |
@SerializedName("wind") | |
@Expose | |
private Wind wind; | |
@SerializedName("clouds") | |
@Expose | |
private Clouds clouds; | |
@SerializedName("dt") | |
@Expose | |
private Long dt; | |
@SerializedName("sys") | |
@Expose | |
private Sys sys; | |
@SerializedName("id") | |
@Expose | |
private Long id; | |
@SerializedName("name") | |
@Expose | |
private String name; | |
@SerializedName("cod") | |
@Expose | |
private Long cod; | |
public Coord getCoord() { | |
return coord; | |
} | |
public void setCoord(Coord coord) { | |
this.coord = coord; | |
} | |
public List<WeatherItem> getWeather() { | |
return weather; | |
} | |
public void setWeather(List<WeatherItem> weather) { | |
this.weather = weather; | |
} | |
public String getBase() { | |
return base; | |
} | |
public void setBase(String base) { | |
this.base = base; | |
} | |
public Main getMain() { | |
return main; | |
} | |
public void setMain(Main main) { | |
this.main = main; | |
} | |
public Long getVisibility() { | |
return visibility; | |
} | |
public void setVisibility(Long visibility) { | |
this.visibility = visibility; | |
} | |
public Wind getWind() { | |
return wind; | |
} | |
public void setWind(Wind wind) { | |
this.wind = wind; | |
} | |
public Clouds getClouds() { | |
return clouds; | |
} | |
public void setClouds(Clouds clouds) { | |
this.clouds = clouds; | |
} | |
public Long getDt() { | |
return dt; | |
} | |
public void setDt(Long dt) { | |
this.dt = dt; | |
} | |
public Sys getSys() { | |
return sys; | |
} | |
public void setSys(Sys sys) { | |
this.sys = sys; | |
} | |
public Long getId() { | |
return id; | |
} | |
public void setId(Long id) { | |
this.id = id; | |
} | |
public String getName() { | |
return name; | |
} | |
public void setName(String name) { | |
this.name = name; | |
} | |
public Long getCod() { | |
return cod; | |
} | |
public void setCod(Long cod) { | |
this.cod = cod; | |
} | |
} |
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
package imrankst1221.weatherapp.ui; | |
import android.content.Context; | |
import android.support.v7.widget.RecyclerView; | |
import android.util.Log; | |
import android.view.LayoutInflater; | |
import android.view.View; | |
import android.view.ViewGroup; | |
import android.widget.ImageView; | |
import android.widget.TextView; | |
import com.squareup.picasso.Picasso; | |
import java.sql.Date; | |
import java.text.SimpleDateFormat; | |
import java.util.ArrayList; | |
import butterknife.BindView; | |
import butterknife.ButterKnife; | |
import imrankst1221.weatherapp.Constants; | |
import imrankst1221.weatherapp.R; | |
import imrankst1221.weatherapp.api.response_layer.weekly_weather.WeatherList; | |
/** | |
* Created by Imran-PC | |
*/ | |
public class WeatherAdapter extends RecyclerView.Adapter<WeatherAdapter.TeamViewHolder> { | |
private String TAG = "---WeatherAdapter"; | |
private Context mContext; | |
private ArrayList<WeatherList> itemList; | |
public WeatherAdapter(Context context, ArrayList<WeatherList> itemList) { | |
mContext = context; | |
this.itemList = itemList; | |
} | |
@Override | |
public TeamViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { | |
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_weather, null); | |
TeamViewHolder vh = new TeamViewHolder(v); | |
return vh; | |
} | |
@Override | |
public void onBindViewHolder(TeamViewHolder holder, int position) { | |
try{ | |
holder.txtTempMax.setText(itemList.get(position).getTemp().getMax().toString()); | |
holder.txtTempMin.setText(itemList.get(position).getTemp().getMin().toString()); | |
holder.txtDay.setText(new SimpleDateFormat("EEEE").format( | |
new Date(itemList.get(position).getDt() * 1000L))); | |
holder.txtWeather.setText(itemList.get(position).getWeather().get(0).getMain().toString()); | |
Picasso.with(mContext).load(Constants.API_IMAGE_PATH + itemList.get(position).getWeather().get(0).getIcon()+".png"). | |
placeholder(R.drawable.ic_placeholder).error(R.drawable.ic_placeholder).into(holder.itemImgView); | |
}catch (Exception ex){ | |
Log.e(TAG, ex.getMessage()); | |
} | |
} | |
@Override | |
public int getItemCount() { | |
return itemList.size(); | |
} | |
class TeamViewHolder extends RecyclerView.ViewHolder { | |
@BindView(R.id.img_weather) | |
ImageView itemImgView; | |
@BindView(R.id.txt_temp_min) | |
TextView txtTempMin; | |
@BindView(R.id.txt_temp_max) | |
TextView txtTempMax; | |
@BindView(R.id.txt_day) | |
TextView txtDay; | |
@BindView(R.id.txt_weather) | |
TextView txtWeather; | |
public TeamViewHolder(View itemView) { | |
super(itemView); | |
ButterKnife.bind(this,itemView); | |
} | |
} | |
} |
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
package imrankst1221.weatherapp.api.response_layer.current_weather; | |
import com.google.gson.annotations.Expose; | |
import com.google.gson.annotations.SerializedName; | |
public class WeatherItem { | |
@SerializedName("id") | |
@Expose | |
private Long id; | |
@SerializedName("main") | |
@Expose | |
private String main; | |
@SerializedName("description") | |
@Expose | |
private String description; | |
@SerializedName("icon") | |
@Expose | |
private String icon; | |
public Long getId() { | |
return id; | |
} | |
public void setId(Long id) { | |
this.id = id; | |
} | |
public String getMain() { | |
return main; | |
} | |
public void setMain(String main) { | |
this.main = main; | |
} | |
public String getDescription() { | |
return description; | |
} | |
public void setDescription(String description) { | |
this.description = description; | |
} | |
public String getIcon() { | |
return icon; | |
} | |
public void setIcon(String icon) { | |
this.icon = icon; | |
} | |
} |
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
package imrankst1221.weatherapp.api.response_layer; | |
import imrankst1221.weatherapp.api.response_layer.current_weather.Weather; | |
/** | |
* Created by [email protected] | |
*/ | |
public class WeatherResponse extends APIResponse{ | |
Weather weather; | |
public Weather getWeather() { | |
return weather; | |
} | |
public void setWeather(Weather weather) { | |
this.weather = weather; | |
} | |
} |
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
package imrankst1221.weatherapp.api.response_layer; | |
import imrankst1221.weatherapp.api.response_layer.weekly_weather.Weathers; | |
/** | |
* Created by [email protected] | |
*/ | |
public class WeeklyWeatherResponse extends APIResponse{ | |
Weathers weathers; | |
public Weathers getWeathers() { | |
return weathers; | |
} | |
public void setWeathers(Weathers weathers) { | |
this.weathers = weathers; | |
} | |
} |
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
package imrankst1221.weatherapp.api.response_layer.current_weather; | |
import com.google.gson.annotations.Expose; | |
import com.google.gson.annotations.SerializedName; | |
public class Wind { | |
@SerializedName("speed") | |
@Expose | |
private Double speed; | |
@SerializedName("deg") | |
@Expose | |
private Long deg; | |
public Double getSpeed() { | |
return speed; | |
} | |
public void setSpeed(Double speed) { | |
this.speed = speed; | |
} | |
public Long getDeg() { | |
return deg; | |
} | |
public void setDeg(Long deg) { | |
this.deg = deg; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment