рдХреНрдпреЛрдВ рдПрдХ рд▓реЗрдЦ
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореБрдЭреЗ рдЧреНрд░рд╛рдлрд╝рдХреЙрдХ рдореЗрдВ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЖрд░рдИрдПрд╕рдЯреА рдХреЗ рд╡рд┐рдкрд░реАрдд, рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдм рдХрд╛рдлреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИрдВредGraphQL рдХреНрдпрд╛ рд╣реИ
рдЧреНрд░рд╛рдлрдХреИрд▓ REST API рдХрд╛ рдПрдХ рдлреИрд╢рдиреЗрдмрд▓ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдХреНрд╡реЗрд░реА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рд╣реА рдорд┐рд▓рддрд╛ рд╣реИредрдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рд╕реНрдерд╛рдкрдирд╛
рд╣рдо рдЗрд╕ рд╕рдордп рдЧреНрд░рд╛рдлреЛрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреБрд╕реНрддрдХрд╛рд▓рдп - рдЕрдкреЛрд▓реЛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣реЗ рд╣реИрдВредрдЪрд▓реЛ рдХрд╛рдо рдкрд░ рд▓рдЧреЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЪрд▓реЛ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдЕрдкреЛрд▓реЛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╣рдо рдореБрдЦреНрдп build.gradle рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:classpath 'com.apollographql.apollo:apollo-gradle-plugin:2.0.0'
рдЕрдм рдЖрдкрдХреЛ рдРрдк рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд┐рд▓реНрдб.рдЧреНрд░реЗрдбрд▓ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:implementation("com.apollographql.apollo:apollo-runtime:2.0.0")
implementation "com.apollographql.apollo:apollo-android-support:2.0.0"
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд▓рдЧ-рдЗрди рдХрдиреЗрдХреНрд╢рди рдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╣реБрдд рдКрдкрд░ рд╕реЗ рдЬреЛрдбрд╝реЗрдВ:apply plugin: 'com.apollographql.apollo'
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рдЙрди рдореЙрдбрд▓реЛрдВ рдХреА рдХреЛрдб рдкреАрдврд╝реА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рд╣рдо рдЧреНрд░рд╛рдлрдХреНрдпреВрдПрд▓ рдкрд░ рдкреНрд░рд╢реНрди рдХрд░реЗрдВрдЧреЗредрдЖрдЗрдП рд╡рд┐рдХрд╛рд╕ рдХреЗ рдорд╛рд╣реМрд▓ рдХреЛ рдХрдо рдХрд░реЗрдВ рдФрд░ рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рдЦреЛрд▓реЗрдВред рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдВ:cd /Users/user/Desktop/ProjectName
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрднреА рддрдХ npm рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдбрдХрд░реЗрдВ рдЕрдкреЛрд▓реЛ-рдХреЛрдбрдЬреЗрди рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ - рдПрдХ рдЙрдкрдХрд░рдг рдЬреЛ рдЖрдкрдХреЛ рд╕реНрдХреАрдорд╛.рдЬреЙрди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдПрдХ рдлрд╛рдЗрд▓ рдЬреЛ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреЛрд▓реЛ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧреА:npm install apollo-codegen
рдбрд╛рдЙрдирд▓реЛрдб schema.json (рдЖрдкрдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд╣рд╛рдВ рдиреЛрдб_рдореЙрдбрд▓ рдлрд╝реЛрд▓реНрдбрд░ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛):node_modules/.bin/apollo-codegen download-schema https:// api/ --output schema.json
рдЕрдм рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рд╣рдо рд╕реНрдХреАрдорд╛.рдЬрд╕рди рдлрд╛рдЗрд▓ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрд╣ рдореЙрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреЛрд▓реЛ рдлрд╛рдЗрд▓реЗрдВ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВредрдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдРрдк рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдВ, рдлрд┐рд░ src -> mainред рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдПрдХ рдЧреНрд░рд╛рдлрдХреЙрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдЕрдкрдиреА .graphql рдлрд╛рдЗрд▓реНрд╕ рдЬреЛрдбрд╝реЗрдВрдЧреЗредрдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдирд╛рдП рдЧрдП рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ - schema.jsonрд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛрдб рдкрд░ рдЬрд╛рдПрдВрдореЙрдбрд▓ рдХреЛрдб рдЬрдирд░реЗрд╢рди
рдЪрд▓реЛ .graphql рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдпрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редGraphQL рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╢реНрди рд╣реИрдВ:рдХреНрд╡реЗрд░реА - GETрдореНрдпреВрдЯреЗрд╢рди рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ - POST / PUT / DELETE рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧрдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдЗрд╕ рд╣реЛрдЯрд▓ рдХреЗ рдкреНрд░рд╢рд╛рд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реЛрдЯрд▓ рдореЗрдВ рдПрдХ рдХрдорд░реЗ рдореЗрдВ рдореЗрд╣рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЖрд╡реЗрджрди 3 рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЙрдЧрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ (рдкреНрд░рд╢рд╛рд╕рдХ), рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдХрдорд░реЗ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдореЗрд╣рдорд╛рдиреЛрдВ рдХреЛ рдЖрдмрд╛рджрдХрд░реЗрдВ рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдРрдк / src / main / graphQL рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ loginUser.graphql рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдВред рдЗрд╕ рдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрдкреЛрд▓реЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛редрдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА:mutation loginUser($email:String!, $password:String!) {
login(
user: {
email: $email,
password: $password
}
){
email,
token,
refreshToken
}
}
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ getRoom.graphql рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреА рдорджрдж рд╕реЗ рд╣реЛрдЯрд▓ рдХреЗ рдХрдорд░реЗ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбрд▓ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:query getRoom($room_id: String) {
room(room_id: $room_id) {
title,
room_number,
cheked_in_family_name,
has_minibar
}
}
рдФрд░ рдЕрдВрддрд┐рдо рдлрд╝рд╛рдЗрд▓ checkUserIn.graphql рдЪреЗрдХ-рдЗрди рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:mutation checkInFamily($room_id: String!, $family_name: String!) {
room(
room: {
title: $family_name,
room_id: $room_id
}
){
room_id,
family_name,
minibar_products{
title,
weight
}
}
}
рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдРрдк рдореЗрдВ 3 рдЙрддреНрдкрдиреНрди рдореЙрдбрд▓ рджреЗрдЦрддреЗ рд╣реИрдВ / рдирд┐рд░реНрдорд╛рдг / рдЙрддреНрдкрдиреНрди / рд╕реНрд░реЛрдд / рдЕрдкреЛрд▓реЛ / рдбрд┐рдмрдЧ / рд╕реЗрд╡рд╛ рдлрд╝реЛрд▓реНрдбрд░: GetRoomQuery, CheckUserInMutation, LoginUserMutationрдХреНрд╡реЗрд░реА рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди
рдПрдХ рдПрдХрд▓ рдиреЗрдЯрд╡рд░реНрдХ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗрд╡рд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬреЛ рд╣рдореЗрдВ рдЕрдкреЛрд▓реЛ-рдХреНрд▓рд╛рдпрдВрдЯ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред рд╣рдо рдЗрд╕рдореЗрдВ 2 рддрд░реАрдХреЗ рдмрдирд╛рддреЗ рд╣реИрдВред getApolloClient () рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЯреЛрдХрди рдпрд╛ рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ getApolloClientWithTokenInterceptor (), рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЯреЛрдХрди рдлреЗрдВрдХ рджреЗрдВрдЧреЗ, рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП:import com.apollographql.apollo.ApolloClient
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.Request
class NetworkService {
fun getApolloClient(): ApolloClient {
val okHttp = OkHttpClient
.Builder()
.build()
return ApolloClient.builder()
.serverUrl(BASE_URL)
.okHttpClient(okHttp)
.build()
}
fun getApolloClientWithTokenInterceptor(token: String): ApolloClient {
val httpClient = OkHttpClient.Builder()
.addInterceptor(Interceptor { chain: Interceptor.Chain ->
val original: Request = chain.request()
val builder: Request.Builder = original
.newBuilder()
.method(original.method, original.body)
builder.header("Authorization", "Bearer $token")
return@Interceptor chain.proceed(builder.build())
})
.build()
return ApolloClient.builder()
.serverUrl(BASE_URL)
.okHttpClient(httpClient)
.build()
}
companion object {
private var mInstance: NetworkService? = null
fun getInstance(): NetworkService? {
if (mInstance == null) {
mInstance = NetworkService()
}
return mInstance
}
}
}
рдЕрдм рд╣рдо рдЕрдкрдиреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдпрд╛ рдЦрдВрдб рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рд╣рдо рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ: private fun loginUser() {
val client = NetworkService.getInstance()?.getApolloClient()
val loginMutation = LoginUserMutation
.builder()
.email(emailEdit.text.toString())
.password(passwordEdit.text.toString())
.build()
client
?.mutate(loginMutation)
?.enqueue(object : ApolloCall.Callback<LoginUserMutation.Data>() {
override fun onResponse(response: Response<LoginUserMutation.Data>) {
if (!response.hasErrors()) {
val token = response.data?.login()?.token()
val email = response.data?.login()?.email()
runOnUiThread {
}
}
}
override fun onFailure(e: ApolloException) {}
})
}
рдпрд╣ рдореНрдпреВрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рд╣рдордиреЗ рд╣реЗрдбрд░ рдореЗрдВ рдЯреЛрдХрди рдХреЗ рдмрд┐рдирд╛ рдпрд╣ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдерд╛ред рдЕрдм рдХреНрд╡реЗрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВ, рдХрдорд░реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдХрдорд░рд╛ рдХреЗрд╡рд▓ рдПрдХ рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ: private fun getRoom() {
val token = "123456"
val client = NetworkService.getInstance()
?.getApolloClientWithTokenIntercetor(token)
val roomId = "123"
val allRoomsQuery = GetRoomQuery(Input.fromNullable(roomId))
client
?.query(allRoomsQuery)
?.enqueue(object : ApolloCall.Callback<GetRoomQuery.Data>() {
override fun onResponse(response: Response<GetRoomQuery.Data>) {
if (!response.hasErrors()) {
val familyName = response.data?.room()?.family_name()
}
}
override fun onFailure(e: ApolloException) {}
})
}
рдПрдХ рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдореЗрд╣рдорд╛рдиреЛрдВ рдХреЛ рдмрд╕рд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВредрдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:Android
Github рдЕрдкреЛрд▓реЛ-рдХреНрд▓рд╛рдЗрдВрдЯ Android рдХреЗ рд▓рд┐рдП рдЕрдкреЛрд▓реЛ-рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рд▓реЗрдЦрди