From aad9854fb77b1cee99c58eeb6465bbffe76e30f3 Mon Sep 17 00:00:00 2001 From: Gavriil Sitnikov Date: Fri, 30 Jun 2017 17:40:11 +0300 Subject: [PATCH] Code of sample of AAC + DB added --- LICENSE | 201 ++++++++++++++++++ app/.gitignore | 1 + app/build.gradle | 32 +++ app/src/main/AndroidManifest.xml | 20 ++ .../aacplusdbtest/AacPlusDbTestApp.java | 35 +++ .../aacplusdbtest/ProfileActivity.java | 50 +++++ .../aacplusdbtest/ProfileRepository.java | 82 +++++++ .../aacplusdbtest/ProfileViewModel.java | 61 ++++++ .../utils/LifecycleLiveDataField.java | 72 +++++++ .../aacplusdbtest/utils/LiveDataField.java | 58 +++++ .../aacplusdbtest/utils/TextField.java | 45 ++++ app/src/main/res/layout/activity_profile.xml | 46 ++++ .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 10486 bytes app/src/main/res/values/resources.xml | 7 + build.gradle | 16 ++ gradle.properties | 17 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 160 ++++++++++++++ gradlew.bat | 90 ++++++++ settings.gradle | 1 + 21 files changed, 1000 insertions(+) create mode 100644 LICENSE create mode 100644 app/.gitignore create mode 100644 app/build.gradle create mode 100644 app/src/main/AndroidManifest.xml create mode 100644 app/src/main/java/touchin/aacplusdbtest/AacPlusDbTestApp.java create mode 100644 app/src/main/java/touchin/aacplusdbtest/ProfileActivity.java create mode 100644 app/src/main/java/touchin/aacplusdbtest/ProfileRepository.java create mode 100644 app/src/main/java/touchin/aacplusdbtest/ProfileViewModel.java create mode 100644 app/src/main/java/touchin/aacplusdbtest/utils/LifecycleLiveDataField.java create mode 100644 app/src/main/java/touchin/aacplusdbtest/utils/LiveDataField.java create mode 100644 app/src/main/java/touchin/aacplusdbtest/utils/TextField.java create mode 100644 app/src/main/res/layout/activity_profile.xml create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/values/resources.xml create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..7458f83 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,32 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 25 + buildToolsVersion "25.0.3" + defaultConfig { + applicationId "touchin.aacplusdbtest" + minSdkVersion 16 + targetSdkVersion 25 + versionCode 1 + versionName "1.0" + } + + buildTypes { + release { + minifyEnabled false + } + } + + dataBinding { + enabled = true + } +} + +dependencies { + + compile 'com.android.support:appcompat-v7:25.3.1' + + compile "android.arch.lifecycle:runtime:1.0.0-alpha3" + compile "android.arch.lifecycle:extensions:1.0.0-alpha3" + annotationProcessor "android.arch.lifecycle:compiler:1.0.0-alpha3" +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..579d00b --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/touchin/aacplusdbtest/AacPlusDbTestApp.java b/app/src/main/java/touchin/aacplusdbtest/AacPlusDbTestApp.java new file mode 100644 index 0000000..c303c1d --- /dev/null +++ b/app/src/main/java/touchin/aacplusdbtest/AacPlusDbTestApp.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2017 Touch Instinct + * + * This file is sample project file. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package touchin.aacplusdbtest; + +import android.app.Application; + +public class AacPlusDbTestApp extends Application { + private ProfileRepository profileRepository; + + public ProfileRepository getProfileRepository() { + return profileRepository; + } + + @Override + public void onCreate() { + super.onCreate(); + profileRepository = new ProfileRepository(this); + } +} diff --git a/app/src/main/java/touchin/aacplusdbtest/ProfileActivity.java b/app/src/main/java/touchin/aacplusdbtest/ProfileActivity.java new file mode 100644 index 0000000..65500a7 --- /dev/null +++ b/app/src/main/java/touchin/aacplusdbtest/ProfileActivity.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2017 Touch Instinct + * + * This file is sample project file. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package touchin.aacplusdbtest; + +import android.arch.lifecycle.LifecycleActivity; +import android.arch.lifecycle.ViewModelProviders; +import android.databinding.DataBindingUtil; +import android.os.Bundle; + +import touchin.aacplusdbtest.databinding.ActivityProfileBinding; + +// наследуем от LifecycleActivity, так как это может понадобиться для LiveData. +// LiveData будет активироваться, когда эта активити будет в состоянии started. +public class ProfileActivity extends LifecycleActivity { + private ActivityProfileBinding binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // инициализируем байндинг + binding = DataBindingUtil.setContentView(this, R.layout.activity_profile); + // устанавливаем ViewModel для байндинга + ProfileViewModel profileViewModel = ViewModelProviders.of(this).get(ProfileViewModel.class); + binding.setProfileViewModel(profileViewModel); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + binding.setProfileViewModel(null); + binding.executePendingBindings(); + } + +} \ No newline at end of file diff --git a/app/src/main/java/touchin/aacplusdbtest/ProfileRepository.java b/app/src/main/java/touchin/aacplusdbtest/ProfileRepository.java new file mode 100644 index 0000000..1e585f5 --- /dev/null +++ b/app/src/main/java/touchin/aacplusdbtest/ProfileRepository.java @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2017 Touch Instinct + * + * This file is sample project file. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package touchin.aacplusdbtest; + + +import android.arch.lifecycle.LiveData; +import android.content.Context; +import android.content.SharedPreferences; + +import java.util.ArrayList; +import java.util.List; + +public class ProfileRepository { + private SharedPreferences preferences; + // подписчики на обновление авторизованного пользователя + private List updateListeners = new ArrayList<>(); + + public ProfileRepository(Context context) { + preferences = context.getSharedPreferences("prefs", Context.MODE_PRIVATE); + } + + public void login(String login) { + preferences.edit().putString("login", login).apply(); + for (UserUpdateListener listener : updateListeners) { + listener.update(login); + } + } + + public void logout() { + preferences.edit().putString("login", null).apply(); + for (UserUpdateListener listener : updateListeners) { + listener.update(null); + } + } + + private interface UserUpdateListener { + void update(String login); + } + + // возвращает LiveData для отслеживание текущего авторизованного пользователя + public LiveData getLoggedInUser() { return new LoginLiveData(); } + + private class LoginLiveData extends LiveData implements UserUpdateListener { + + @Override + // postValue запрашивает обновление на UI-потоке + // используем, так как мы не уверены, с какого потока будет обновлен логин + // для немедленного обновления на UI-потоке можно использовать метод setValue + public void update(String login) { postValue(login); } + + @Override + // этот метод вызовется, когда на LiveData будет хоть один подписчик, + // а также объект жизненного цикла этого подписчика будет в состоянии started + protected void onActive() { + super.onActive(); + updateListeners.add(this); + update(preferences.getString("login", null)); + } + + @Override + protected void onInactive() { + super.onInactive(); + updateListeners.remove(this); + } + } +} diff --git a/app/src/main/java/touchin/aacplusdbtest/ProfileViewModel.java b/app/src/main/java/touchin/aacplusdbtest/ProfileViewModel.java new file mode 100644 index 0000000..e550bcd --- /dev/null +++ b/app/src/main/java/touchin/aacplusdbtest/ProfileViewModel.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2017 Touch Instinct + * + * This file is sample project file. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package touchin.aacplusdbtest; + + +import android.app.Application; +import android.arch.core.util.Function; +import android.arch.lifecycle.AndroidViewModel; +import android.arch.lifecycle.LiveData; +import android.arch.lifecycle.Transformations; +import android.databinding.ObservableField; + +import touchin.aacplusdbtest.utils.LifecycleLiveDataField; +import touchin.aacplusdbtest.utils.TextField; + +public class ProfileViewModel extends AndroidViewModel { + private ProfileRepository profileRepository; + + // представляет логин авторизованного пользователя или null + public final ObservableField userLogin; + // представляет авторизован ли пользователь + public final ObservableField isUserLoggedIn; + // представляет логин, введенный пользователем с клавиатуры + public final TextField inputLogin = new TextField(); + + public ProfileViewModel(Application application) { + super(application); + profileRepository = ((AacPlusDbTestApp) application).getProfileRepository(); + LiveData loggedInUserLiveData = profileRepository.getLoggedInUser(); + userLogin = new LifecycleLiveDataField<>(loggedInUserLiveData); + isUserLoggedIn = new LifecycleLiveDataField<>(Transformations.map(loggedInUserLiveData, + new Function() { + public Boolean apply(String login) { return login!= null; } + })); + } + + public void login() { + // используем введенный пользователем логин + if (inputLogin.get() != null) { + profileRepository.login(inputLogin.get()); + } + } + + public void logout() { profileRepository.logout(); } +} \ No newline at end of file diff --git a/app/src/main/java/touchin/aacplusdbtest/utils/LifecycleLiveDataField.java b/app/src/main/java/touchin/aacplusdbtest/utils/LifecycleLiveDataField.java new file mode 100644 index 0000000..f700c57 --- /dev/null +++ b/app/src/main/java/touchin/aacplusdbtest/utils/LifecycleLiveDataField.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2017 Touch Instinct + * + * This file is sample project file. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package touchin.aacplusdbtest.utils; + + +import android.arch.lifecycle.LifecycleActivity; +import android.arch.lifecycle.LiveData; +import android.arch.lifecycle.Observer; +import android.databinding.ObservableField; +import android.databinding.ViewDataBinding; +import android.util.Log; + +import java.lang.ref.WeakReference; +import java.lang.reflect.Field; + +// наследуем от ObservableField +public class LifecycleLiveDataField extends ObservableField { + private LiveData source; + // отслеживаем количество подписчиков на этот ObservableField + private int observersCount; + // Observer — класс из библиотеки Android Architecture Components + // подписчик LiveData — прокидывает значения из LiveData в ObservableField + private Observer observer = new Observer() { + public void onChanged(T value) { LifecycleLiveDataField.this.set(value); } + }; + + public LifecycleLiveDataField(LiveData source) { this.source = source; } + + @Override + public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) { + super.addOnPropertyChangedCallback(callback); + try { + Field callbackListenerField = callback.getClass().getDeclaredField("mListener"); + callbackListenerField.setAccessible(true); + WeakReference callbackListener = (WeakReference) callbackListenerField.get(callback); + LifecycleActivity activity = (LifecycleActivity) callbackListener.get().getRoot().getContext(); + + observersCount++; + if (observersCount == 1) { + source.observe(activity, observer); + } + } catch (Exception bindingException) { + Log.e("BINDING", bindingException.getMessage()); + } + } + + @Override + public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) { + super.removeOnPropertyChangedCallback(callback); + observersCount--; + if (observersCount == 0) { + // отписываемся от LiveData, когда все view отбайндились от ObservableField + source.removeObserver(observer); + } + } +} diff --git a/app/src/main/java/touchin/aacplusdbtest/utils/LiveDataField.java b/app/src/main/java/touchin/aacplusdbtest/utils/LiveDataField.java new file mode 100644 index 0000000..3ffdd5a --- /dev/null +++ b/app/src/main/java/touchin/aacplusdbtest/utils/LiveDataField.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2017 Touch Instinct + * + * This file is sample project file. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package touchin.aacplusdbtest.utils; + + +import android.arch.lifecycle.LiveData; +import android.arch.lifecycle.Observer; +import android.databinding.ObservableField; + +// наследуем от ObservableField +public class LiveDataField extends ObservableField { + private LiveData source; + // отслеживаем количество подписчиков на этот ObservableField + private int observersCount; + // Observer — класс из библиотеки Android Architecture Components + // подписчик LiveData — прокидывает значения из LiveData в ObservableField + private Observer observer = new Observer() { + public void onChanged(T value) { LiveDataField.this.set(value); } + }; + + public LiveDataField(LiveData source) { this.source = source; } + + @Override + public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) { + super.addOnPropertyChangedCallback(callback); + observersCount++; + if (observersCount == 1) { + // подписываемся на LiveData, когда к ObservableField прибайндивается первая view + source.observeForever(observer); + } + } + + @Override + public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) { + super.removeOnPropertyChangedCallback(callback); + observersCount--; + if (observersCount == 0) { + // отписываемся от LiveData, когда все view отбайндились от ObservableField + source.removeObserver(observer); + } + } +} diff --git a/app/src/main/java/touchin/aacplusdbtest/utils/TextField.java b/app/src/main/java/touchin/aacplusdbtest/utils/TextField.java new file mode 100644 index 0000000..5569cea --- /dev/null +++ b/app/src/main/java/touchin/aacplusdbtest/utils/TextField.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2017 Touch Instinct + * + * This file is sample project file. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package touchin.aacplusdbtest.utils; + + +import android.databinding.ObservableField; +import android.text.Editable; +import android.text.TextWatcher; + +public class TextField extends ObservableField implements TextWatcher { + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + //do nothing + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + //do nothing + } + + @Override + public void afterTextChanged(Editable text) { + if (!text.toString().equals(get())) { + set(text.toString()); + } + } + +} diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml new file mode 100644 index 0000000..2bcb5c1 --- /dev/null +++ b/app/src/main/res/layout/activity_profile.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + +