UI рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Android рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдорд╛рд╣рд┐рд░ рдХрд░рдирд╛

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░ред рдПрдВрдбреНрд░реЙрдЗрдб рд╡рд┐рдХрд╛рд╕ рдкрд░ рдмреБрдирд┐рдпрд╛рджреА рдФрд░ рдЙрдиреНрдирдд рдкрд╛рдареНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдПрдХ рдирдП рд╕реЗрдЯ рдХреЗ рд▓реЙрдиреНрдЪ рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ , рд╣рдордиреЗ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред




рдмрдлрд╝рд░ рдореЗрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдЯреАрдо рдХреЗ рдХрд╛рдо рдХреЗ рдЕрдВрддрд┐рдо рд╡рд░реНрд╖ рдореЗрдВ, рд╣рдордиреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕реНрд╡рдЪреНрдЫрддрд╛ рдФрд░ рдЗрд╕рдХреА рд╕реНрдерд┐рд░рддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдмрд╛рддреЗрдВ рдХреАрдВред рдХрд╛рд░рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкрд░рд┐рдЪрдп () рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдкрддрд╛ рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рдкреНрд░рддрд┐рдЧрдорди рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рддреЗ рд╣реИрдВред рдФрд░ рдЕрдм, рдЬрдм рд╣рдо рдмрдлрд╝рд░ рдореЗрдВ рдирдП рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдпрд╣ рдЙрдирдХреЗ рдкрд╛рд╕ рдЖрдП рддреЛ рд╡рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд╛рдЧреВ рд╣реЛ - рдмрд╕ рддрд╛рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рдЬреИрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рди рд╣реЛрдВред

рдкреГрд╖реНрдарднреВрдорд┐


рдмрдлрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп, рд╣рдордиреЗ рд╣рдореЗрд╢рд╛ рдкрд░реАрдХреНрд╖рдг (рдЯреЗрд╕реНрдЯ-рдбреНрд░рд┐рд╡реЗрди-рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ - рдЗрд╕рдХреЗ рдмрд╛рдж рдЯреАрдбреАрдбреА) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдЕрднреНрдпрд╛рд╕ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рд╣реИред рдЯреАрдбреАрдбреА рдХреНрдпрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдлрд╛рдпрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рд╡реЗ рдХрд╣рд╛рдВ рд╕реЗ рдЖрддреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рд╕рдВрд╕рд╛рдзрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ:

  • рд╡рд┐рдХрд╛рд╕ рдХрд╛ рд╕рдордп рдХрдо рдХрд░ рджрд┐рдпрд╛
  • рд╕рд░рд▓, рдХреНрд▓реАрдирд░, рдФрд░ рдЕрдзрд┐рдХ рдмрдирд╛рдП рд░рдЦрдиреЗ рдпреЛрдЧреНрдп рдХреЛрдб
  • рд╣рдорд╛рд░реЗ рдХрд╛рдо рдореЗрдВ рдЕрдзрд┐рдХ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдХреЛрдбред
  • рдЙрдЪреНрдЪ рдкрд░реАрдХреНрд╖рдг рдХрд╡рд░реЗрдЬ (рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ)

рд▓реЗрдХрд┐рди рд╣рд╛рд▓ рддрдХ рддрдХ, рд╣рдордиреЗ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЯреАрдбреАрдбреА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдерд╛ рдЬреЛ рдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдереЗ рдЬреЛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдереЗ ...



рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ ... рд╣рдореЗрдВ рд╣рдореЗрд╢рд╛ рдпреВрдЖрдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреА рдЖрджрдд рдереА рдЬреЛ рдХрд┐ рдкреВрд░реА рд╣реЛ рдЧрдИ рдереАред - рдФрд░ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд╣рдордиреЗ рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдЯреАрдбреАрдбреА рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреА, рддрд╛рдХрд┐ рд╣рдо рдЬреЛ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ рд╡рд╣ рдЙрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рд╣рдо рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдереЛрдбрд╝рд╛ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реИ, рдФрд░ рдХреБрдЫ рдорд╛рдпрдиреЛрдВ рдореЗрдВ рдпрд╣ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ TDD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рдпрд╣рд╛рдВ рдореИрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ, рдФрд░ рд╣рдо рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдкрд╣рд▓реА рдЬрдЧрд╣ рдореЗрдВ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреНрдпреЛрдВ рджреЗрддреЗ рд╣реИрдВ?

рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдореМрдЬреВрджрд╛ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдХрдард┐рди рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХреИрд╕реЗ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдкреВрд░реНрдг рдмрд╣рд╛рдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдХрдИ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ, рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпрд╛рдВ рдФрд░ рдХрд░реАрдмреА рд╕рдВрдмрдВрдз рдЙрдиреНрд╣реЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдЬреЛ рдирдИ рдЧрддрд┐рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реАрдВ, рдЖрджрдд рд╕реЗ рдмрд╛рд╣рд░, рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рд╣рдореЗрд╢рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рдж рдпреВрдЖрдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрд╛ - рдЖрджрдд рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреНрдп рдХрд╛рд░рдг рдирд╣реАрдВ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рд╣рдорд╛рд░рд╛ рдЦрд╛рдХрд╛ рдХреЛрдб рддреИрдпрд╛рд░ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рддреЛ рдореИрдВрдиреЗ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ред рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреА рдХрд┐ рдпрд╣ рдЖрджрдд рдЯреВрдЯ рдЧрдИ рд╣реИ, рдФрд░ рдЕрдм рд╣рдо рдЦреБрдж рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпреВрдЖрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЯреАрдбреАрдбреА рдХреА рдЦреЛрдЬ рдХрд░ рд░рд╣реЗ рд╣реИрдВ

рдкрд╣рд▓рд╛ рдЪрд░рдг


рд╣рдо рдпрд╣рд╛рдВ рдкрд░ рдЬреЛ рдЦреЛрдЬ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдХрд╛рдлреА рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рддрд╛рдХрд┐ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдФрд░ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛ - рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХреБрдЫ рдлрд╛рдпрджреЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рд╣рдо рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдЕрдкрдирд╛ UI рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд╕рдХреЗрдВ - рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╕реЗрдЯрдЕрдк рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЖрдзрд╛рд░ рд╣реИ, рди рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ред рдпрд╣рд╛рдВ рд╣рдорд╛рд░реА рдмреБрдирд┐рдпрд╛рджреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреНрдпрд╛ рд╣реИ:

class LoginActivity: AppCompatActivity(), LoginContract.View {

    @Inject lateinit var loginPresenter: LoginContract.Presenter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login)
    }

    override fun setPresenter(presenter: LoginContract.Presenter) {
        loginPresenter = presenter
    }

    override fun showServerErrorMessage() {
        TODO("not implemented")
    }

    override fun showGeneralErrorMessage() {
        TODO("not implemented")
    }

    override fun showProgress() {
        TODO("not implemented")
    }

    override fun hideProgress() {
        TODO("not implemented")
    }

    override fun showInvalidEmailMessage() {
        TODO("not implemented")
    }

    override fun hideInvalidEmailMessage() {
        TODO("not implemented")
    }

    override fun showInvalidPasswordMessage() {
        TODO("not implemented")
    }

    override fun hideInvalidPasswordMessage() {
        TODO("not implemented")
    }

}

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯрдЕрдк, рдЬреЛ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдСрдирдХреНрд░рд┐рдПрдЯ () рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рд╡реНрдпреВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд▓рд┐рдВрдХ рднреА рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИред

рдПрд╕реНрдкреНрд░реЗрд╕реЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╣рдореЗрдВ рдЬреЛ рд╕рдмрд╕реЗ рдЖрдо рдЪреАрдЬреЗрдВ рдорд┐рд▓рддреА рд╣реИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдкрд╛рдП рдЧрдП рд╕рдВрд╕рд╛рдзрди рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрдн рд╡рд┐рдЪрд╛рд░ рдФрд░ рддрд╛рд░ред рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЕрдкрдиреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдЖрдЙрдЯ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рджрд╛рди рдХрд░рдиреА рд╣реЛрдЧреАред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐: рдП) рд╣рдорд╛рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рджреМрд░рд╛рди рд▓реЗрдЖрдЙрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдЖрдЙрдЯ рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдмреА) рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдИрдбреА рджреГрд╢реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪрд▓реЛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реА рд▓реЙрдЧрд┐рди рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд▓реЗрдЖрдЙрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/input_email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/input_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

рдпрд╣рд╛рдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рд╢реИрд▓реА рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рдереЗ, рдпрд╛рдж рд░рдЦреЗрдВ - рдЬрдм рд╣рдо рдиреАрдВрд╡ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ , рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВред

рдФрд░ рд╕реЗрдЯрдЕрдк рдХреЗ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдПрдВрдЧреАред рдлрд┐рд░ рд╕реЗ, рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рдЬрдм рддрдХ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ XML рд▓реЗрдЖрдЙрдЯ рдпрд╛ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╡рд░реНрдЧ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ, рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ strings.xmlред

<string name="error_message_invalid_emailтАЭ>тАж</string>
<string name="error_message_invalid_passwordтАЭ>тАж</string>

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╕реЗрдЯрдЕрдк рдореЗрдВ рд╣рдо рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдФрд░ рдЗрд╕рдХреЗ рд▓реЗрдЖрдЙрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реА рдЧрддрд┐рд╡рд┐рдзрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЦреБрд▓рддреА рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬрд┐рд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдм рдЬрдмрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдиреНрдпреВрдирддрдо рд╣реИ, рдЪрд▓реЛ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдФрд░ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝реЗрдВред

рдЯреЗрд╕реНрдЯ рдЬреЛрдбрд╝рдирд╛


рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреАрди рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

  • рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдИрдореЗрд▓ рдЗрдирдкреБрдЯ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рдЕрдорд╛рдиреНрдп рдИрдореЗрд▓ рдкрддрд╛ рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рддреЛ, рд╣рдо рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдпрд╣ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред
  • рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд┐рд░ рд╕реЗ рдИрдореЗрд▓ рдЗрдирдкреБрдЯ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрдкрд░реЛрдХреНрдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
  • рдЕрдВрдд рдореЗрдВ, рдЬрдм рдПрдкреАрдЖрдИ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрд╡рд╛рдж рдмреЙрдХреНрд╕ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рднреА рдЬреЛрдбрд╝реЗрдВрдЧреЗред

@Test
fun invalidEmailErrorHidesWhenUserTypes() {
    activity.launchActivity(null)

    onView(withId(R.id.button_login))
            .perform(click())

    onView(withId(R.id.input_email))
            .perform(typeText("j"))

    onView(withText(R.string.error_message_invalid_email))
            .check(doesNotExist())
}

@Test
fun invalidPasswordErrorDisplayed() {
    activity.launchActivity(null)

    onView(withId(R.id.button_login))
            .perform(click())

    onView(withText(R.string.error_message_invalid_password))
            .check(matches(isDisplayed()))
}

@Test
fun serverErrorMessageDisplays() {
    val response = ConnectResponseFactory.makeConnectResponseForError()
    stubConnectRepositorySignIn(Single.just(response))
    activity.launchActivity(null)

    onView(withId(R.id.input_email))
            .perform(typeText("joe@example.com"))

    onView(withId(R.id.input_password))
            .perform(typeText(DataFactory.randomUuid()))

    onView(withId(R.id.button_login))
            .perform(click())

    onView(withText(response.message))
            .check(matches(isDisplayed()))
}

рдареАрдХ рд╣реИ, рдЕрдм рд╣рдордиреЗ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрд╛ рд╣реИ - рдЪрд▓реЛ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЪрд▓рд╛рдПрдВред



рдФрд░ рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдЕрд╕рдлрд▓ рд░рд╣реЗ - рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рддрдХ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрдореНрдореАрдж рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рдЕрднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рд▓ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП!

рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдореЗрдВ рдЯреЗрд╕реНрдЯ рдкрд╛рд╕ рд╣реЛрдиреЗ рддрдХ рдЕрдкрдиреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдХреЗрдВрджреНрд░рд┐рдд рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!), рд╣рдо рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝ рдкрд╛рдПрдВрдЧреЗ рдФрд░ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рд╣рд░реЗ рд░рдВрдЧ рдореЗрдВ рдмрджрд▓ рдкрд╛рдПрдВрдЧреЗред

рддреЛ, рдЪрд▓рд┐рдП рдЕрд╕рдлрд▓ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЕрдорд╛рдиреНрдпрдкрд╛рд╕рд░реЛрдбрд░рдкреНрд▓реЗрд╕реНрдб () рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде ред рд╣рдо рдХреБрдЫ рдмрд╛рддреЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ:

  • , , , , :

private fun setupLoginButtonClickListener() {
    button_login.setOnClickListener {
        loginPresenter.performSignIn(input_email.text.toString(),
                input_password.text.toString()) }
}

  • , . TextInputLayout, , :

override fun showInvalidPasswordMessage() {
    layout_input_password.error = getString(R.string.error_message_invalid_password)
}

рдЕрдм рд╣рдордиреЗ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдХреЛ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ, рдЪрд▓реЛ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ!



рдорд╣рд╛рди, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪреЗрдХ invalidPassworrdErrorDisplays()рд╕рдлрд▓ рд░рд╣рд╛ред рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рддрдХ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рджреЛ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓реЙрдЧрд┐рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрди рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдЧрд▓рд╛, рд╣рдо рдкрд░реАрдХреНрд╖рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ serverErrorMessageDisplays()ред рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдПрдкреАрдЖрдИ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддрд╛ рд╣реИ (рдФрд░ рд╣рдорд╛рд░реЗ рдиреЗрдЯрд╡рд░реНрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ), рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢ рдмреЙрдХреНрд╕ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рд╕рдВрд╡рд╛рдж рдкрд╛рда рдореЗрдВ рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╡рд╛рдж рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

override fun showServerErrorMessage(message: String) {
    DialogFactory.createSimpleInfoDialog(this, R.string.error_message_login_title, message, 
            R.string.error_message_login_ok).show()
}

рдЪрд▓реЛ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ:



рд╣реБрд░реНрд░реЗ! рд╣рдо рдЖрдЧреЗ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдмрдЪрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдкрд░реАрдХреНрд╖рд╛ рд╣реИ invalidEmailErrorHidesWhenUserTypes()ред рдлрд┐рд░, рдпрд╣ рдПрдХ рд╕рд░рд▓ рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЗрдП рдЗрд╕реЗ рджреЗрдЦреЗрдВ:

  • рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдИрдореЗрд▓ рдкрддрд╛ рдЧрд╛рдпрдм рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдИрдореЗрд▓ рдкрддрд╛ рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рд╣реИ
  • рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд┐рд░ рд╕реЗ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЛ рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдм рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдХреА рдкрд╛рда рд╕рд╛рдордЧреНрд░реА рдмрджрд▓рддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╕реБрдирдирд╛ рд╣реЛрдЧрд╛:

private fun setupOnEmailTextChangedListener() {
    input_email.addTextChangedListener(object : TextWatcher {

        override fun afterTextChanged(s: Editable) {}

        override fun beforeTextChanged(s: CharSequence, start: Int,
                                       count: Int, after: Int) {
        }

        override fun onTextChanged(s: CharSequence, start: Int,
                                   before: Int, count: Int) {
            loginPresenter.handleEmailTextChanged(s)
        }
    })
}

рдЕрдм рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЗрдирдкреБрдЯ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп рд╣рдорд╛рд░рд╛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЫрд┐рдкрд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ:



рдорд╣рд╛рди! рд╣рдорд╛рд░реА рдкрд░реАрдХреНрд╖рдг рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рд╣рд░реЗ рд░рдВрдЧ рдХреА рд░реЛрд╢рдиреА рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ

рдирд┐рд╖реНрдХрд░реНрд╖


рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЬрд┐рд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЯреАрдбреАрдбреА рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╡рд╣ рдЕрддреНрдпрдВрдд рдЖрджрд┐рдо рд╣реИред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдЬрдЯрд┐рд▓ рд╕реНрдХреНрд░реАрди рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╕рд╛рдордЧреНрд░реА рдлрд╝реАрдб, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдлрд╝реАрдб рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдмрдлрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ) - рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдо рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рджреА рдЧрдИ рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред / рдЯреБрдХрдбрд╝рд╛ред рдпреЗ рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрд╣рд╛рдВ рдпреВрдЖрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЯреАрдбреАрдбреА рдХреЛ рдФрд░ рднреА рдЕрдзрд┐рдХ рдкреНрд░рдХрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЙрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЛ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рджрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рд╕реЗ рд╕реАрдЦреЗ рдЧрдП рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛:

  • , , TDD . , . , Espresso (/, ), . activity, , , . .
  • , , , , , , , . , , , , , ( , !). - . , , , - .
  • , Ui- , , . , , , , , , .
  • , . , тАФ , , , - .
  • рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЯреАрдбреАрдбреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рдЖрдк рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рдж, рдпреВрдЖрдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдЖрдк рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рдХреА рдУрд░ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВред рдЯреАрдбреАрдбреА рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рдХрджрдо рд╕реЗ рдЖрдк рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВрдЧреЗ, рдЖрдзреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдирд╣реАрдВред

рдХреНрдпрд╛ рдЖрдк рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдЯреЗрд╕реНрдЯ рд▓рд┐рдЦрддреЗ рд╕рдордп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА TDD рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ? рдпрд╛ рдЖрдк рдХреБрдЫ рдФрд░ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рд╕рд╡рд╛рд▓ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдиреАрдЪреЗ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ рдпрд╛ рд╣рдореЗрдВ рдЯреНрд╡реАрдЯ рдХрд░реЗрдВ @bufferdevs

ред рд╣рдо рдкрд╛рдареНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЖрдкрдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:


All Articles