From 0d7884c674c3f4025154f06db770f927de0993f6 Mon Sep 17 00:00:00 2001 From: Paul Schaub Date: Sat, 4 May 2019 00:27:02 +0200 Subject: [PATCH] Temp commit --- .idea/codeStyles/Project.xml | 29 ------- .idea/encodings.xml | 4 + .idea/gradle.xml | 6 ++ .idea/misc.xml | 37 ++++++++- app/build.gradle | 14 +++- app/src/main/AndroidManifest.xml | 19 +++-- .../messenger/MessengerApplication.java | 37 +++++++++ .../messenger/di/component/AppComponent.java | 48 ++++++++---- .../messenger/di/component/package-info.java | 4 + .../messenger/di/module/AppModule.java | 8 +- .../messenger/di/module/RepositoryModule.java | 29 +++++++ .../messenger/di/module/RoomModule.java | 30 +++----- .../messenger/di/module/package-info.java | 9 +++ .../persistence/database/Executor.java | 12 --- .../persistence/database/dao/AccountDao.java | 16 +++- .../account => database/model}/Account.java | 2 +- .../database/model/AccountModel.java | 5 +- .../database/model/RosterEntryModel.java | 1 + .../repository/account/AccountRepository.java | 2 +- .../account/AccountRepositoryImpl.java | 39 +++++++++- .../impl/RosterEntryRepositoryImpl.java | 22 ------ .../{ => roster}/RosterEntryRepository.java | 10 ++- .../roster/RosterEntryRepositoryImpl.java | 26 +++++++ .../service/XmppConnectionHolder.java | 27 +++++++ .../messenger/service/XmppService.java | 17 ++++- .../messenger/{view => ui}/MainActivity.java | 37 +++++---- .../messenger/ui/chat/ChatActivity.java | 2 +- .../messenger/ui/chat/ChatFragment.java | 36 --------- .../messenger/ui/chat/ChatInputFragment.java | 76 +++++++++++++++++++ .../messenger/ui/chat/ChatInputViewModel.java | 11 +++ .../messenger/ui/chat/ChatViewModel.java | 13 +++- .../{view => ui/login}/LoginActivity.java | 23 +++++- .../messenger/ui/login/LoginViewModel.java | 40 ++++++++++ .../roster/RosterFragment.java} | 38 ++++++---- .../roster/RosterRecyclerViewAdapter.java} | 10 +-- .../messenger/ui/roster/RosterViewModel.java | 33 ++++++++ .../settings/AppCompatPreferenceActivity.java | 2 +- .../settings/SettingsActivity.java | 2 +- .../view/viewmodel/LoginViewModel.java | 25 ------ .../viewmodel/RosterEntryListViewModel.java | 48 ------------ app/src/main/res/layout/activity_login.xml | 2 +- app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/layout/content_main.xml | 2 +- app/src/main/res/layout/fragment_chat.xml | 2 +- .../res/layout/fragment_roster_entry_list.xml | 2 +- app/src/main/res/layout/view_chat_field.xml | 28 +++---- app/src/main/res/menu/menu_main.xml | 14 +++- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_headers.xml | 6 +- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 +- version.gradle | 2 +- 52 files changed, 604 insertions(+), 312 deletions(-) delete mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/encodings.xml create mode 100644 app/src/main/java/org/olomono/messenger/MessengerApplication.java create mode 100644 app/src/main/java/org/olomono/messenger/di/component/package-info.java create mode 100644 app/src/main/java/org/olomono/messenger/di/module/RepositoryModule.java create mode 100644 app/src/main/java/org/olomono/messenger/di/module/package-info.java delete mode 100644 app/src/main/java/org/olomono/messenger/persistence/database/Executor.java rename app/src/main/java/org/olomono/messenger/persistence/{repository/account => database/model}/Account.java (81%) delete mode 100644 app/src/main/java/org/olomono/messenger/persistence/repository/impl/RosterEntryRepositoryImpl.java rename app/src/main/java/org/olomono/messenger/persistence/repository/{ => roster}/RosterEntryRepository.java (54%) create mode 100644 app/src/main/java/org/olomono/messenger/persistence/repository/roster/RosterEntryRepositoryImpl.java create mode 100644 app/src/main/java/org/olomono/messenger/service/XmppConnectionHolder.java rename app/src/main/java/org/olomono/messenger/{view => ui}/MainActivity.java (78%) delete mode 100644 app/src/main/java/org/olomono/messenger/ui/chat/ChatFragment.java create mode 100644 app/src/main/java/org/olomono/messenger/ui/chat/ChatInputFragment.java create mode 100644 app/src/main/java/org/olomono/messenger/ui/chat/ChatInputViewModel.java rename app/src/main/java/org/olomono/messenger/{view => ui/login}/LoginActivity.java (82%) create mode 100644 app/src/main/java/org/olomono/messenger/ui/login/LoginViewModel.java rename app/src/main/java/org/olomono/messenger/{view/roster/RosterEntryListFragment.java => ui/roster/RosterFragment.java} (54%) rename app/src/main/java/org/olomono/messenger/{view/roster/RosterEntryListRecyclerViewAdapter.java => ui/roster/RosterRecyclerViewAdapter.java} (83%) create mode 100644 app/src/main/java/org/olomono/messenger/ui/roster/RosterViewModel.java rename app/src/main/java/org/olomono/messenger/{view => ui}/settings/AppCompatPreferenceActivity.java (98%) rename app/src/main/java/org/olomono/messenger/{view => ui}/settings/SettingsActivity.java (99%) delete mode 100644 app/src/main/java/org/olomono/messenger/view/viewmodel/LoginViewModel.java delete mode 100644 app/src/main/java/org/olomono/messenger/view/viewmodel/RosterEntryListViewModel.java diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 30aa626..0000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..15a15b2 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 2996d53..f43d428 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -8,6 +8,12 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index 703e5d4..422a406 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,7 +5,42 @@ - + + + + + diff --git a/app/build.gradle b/app/build.gradle index 1814542..6fd7fa1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,16 +2,18 @@ apply plugin: 'com.android.application' apply plugin: 'checkstyle' android { - compileSdkVersion 27 + compileSdkVersion 28 defaultConfig { applicationId "org.olomono.messenger" minSdkVersion 19 - targetSdkVersion 27 + targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true + multiDexEnabled true } + buildTypes { release { minifyEnabled false @@ -29,6 +31,10 @@ android { sourceCompatibility 1.8 targetCompatibility 1.8 } + + dataBinding { + enabled true + } } checkstyle { @@ -69,8 +75,8 @@ dependencies { // architecture components for database and lifecycle management implementation "android.arch.lifecycle:extensions:$archCompVersion" implementation "android.arch.persistence.room:runtime:$archCompVersion" - implementation 'com.android.support:appcompat-v7:27.1.1' - implementation 'android.arch.lifecycle:extensions:1.1.1' + implementation "android.arch.lifecycle:extensions:$archCompVersion" + annotationProcessor "android.arch.lifecycle:compiler:$archCompVersion" annotationProcessor "android.arch.persistence.room:compiler:$archCompVersion" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ce6ae21..6ad667f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,25 +12,28 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/AppTheme"> + android:theme="@style/AppTheme" + android:name=".MessengerApplication"> + + + + - - diff --git a/app/src/main/java/org/olomono/messenger/MessengerApplication.java b/app/src/main/java/org/olomono/messenger/MessengerApplication.java new file mode 100644 index 0000000..f1e2625 --- /dev/null +++ b/app/src/main/java/org/olomono/messenger/MessengerApplication.java @@ -0,0 +1,37 @@ +package org.olomono.messenger; + +import android.app.Application; + +import org.olomono.messenger.di.component.AppComponent; +import org.olomono.messenger.di.component.DaggerAppComponent; +import org.olomono.messenger.di.module.AppModule; +import org.olomono.messenger.di.module.RepositoryModule; +import org.olomono.messenger.di.module.RoomModule; + +public class MessengerApplication extends Application { + + private static MessengerApplication INSTANCE; + AppComponent appComponent; + + public static MessengerApplication getApplication() { + return INSTANCE; + } + + @Override + public void onCreate() { + super.onCreate(); + + INSTANCE = this; + appComponent = DaggerAppComponent.builder() + .appModule(new AppModule(this)) + .roomModule(new RoomModule(this)) + .repositoryModule(new RepositoryModule()) + .build(); + + appComponent.inject(this); + } + + public AppComponent getAppComponent() { + return appComponent; + } +} diff --git a/app/src/main/java/org/olomono/messenger/di/component/AppComponent.java b/app/src/main/java/org/olomono/messenger/di/component/AppComponent.java index eadffbc..bb4a784 100644 --- a/app/src/main/java/org/olomono/messenger/di/component/AppComponent.java +++ b/app/src/main/java/org/olomono/messenger/di/component/AppComponent.java @@ -1,35 +1,53 @@ package org.olomono.messenger.di.component; -import android.app.Application; - +import org.olomono.messenger.MessengerApplication; import org.olomono.messenger.di.module.AppModule; +import org.olomono.messenger.di.module.RepositoryModule; import org.olomono.messenger.di.module.RoomModule; -import org.olomono.messenger.persistence.database.AppDatabase; -import org.olomono.messenger.persistence.database.dao.AccountDao; -import org.olomono.messenger.persistence.database.dao.RosterEntryDao; -import org.olomono.messenger.persistence.repository.account.AccountRepository; -import org.olomono.messenger.persistence.repository.RosterEntryRepository; -import org.olomono.messenger.view.MainActivity; +import org.olomono.messenger.service.XmppService; +import org.olomono.messenger.ui.MainActivity; +import org.olomono.messenger.ui.chat.ChatActivity; +import org.olomono.messenger.ui.chat.ChatInputFragment; +import org.olomono.messenger.ui.chat.ChatInputViewModel; +import org.olomono.messenger.ui.chat.ChatViewModel; +import org.olomono.messenger.ui.login.LoginActivity; +import org.olomono.messenger.ui.login.LoginViewModel; +import org.olomono.messenger.ui.roster.RosterFragment; +import org.olomono.messenger.ui.roster.RosterViewModel; import javax.inject.Singleton; import dagger.Component; @Singleton -@Component(dependencies = {}, modules = {AppModule.class, RoomModule.class}) +@Component(dependencies = {}, modules = {AppModule.class, RoomModule.class, RepositoryModule.class}) public interface AppComponent { + // Application + + void inject(MessengerApplication messengerApplication); + + // Views + void inject(MainActivity mainActivity); - AccountDao accountDao(); + void inject(LoginActivity loginActivity); - RosterEntryDao rosterEntryDao(); + void inject(ChatActivity chatActivity); - AccountRepository accountRepository(); + void inject(ChatInputFragment chatInputFragment); - RosterEntryRepository rosterEntryRepository(); + // ViewModels - AppDatabase appDatabase(); + void inject(RosterViewModel rosterViewModel); - Application application(); + void inject(ChatViewModel chatViewModel); + + void inject(ChatInputViewModel chatInputViewModel); + + void inject(LoginViewModel loginViewModel); + + // Services + + void inject(XmppService service); } diff --git a/app/src/main/java/org/olomono/messenger/di/component/package-info.java b/app/src/main/java/org/olomono/messenger/di/component/package-info.java new file mode 100644 index 0000000..8eb63d4 --- /dev/null +++ b/app/src/main/java/org/olomono/messenger/di/component/package-info.java @@ -0,0 +1,4 @@ +/** + * The Component specifies which classes can be injected from the module. + */ +package org.olomono.messenger.di.component; diff --git a/app/src/main/java/org/olomono/messenger/di/module/AppModule.java b/app/src/main/java/org/olomono/messenger/di/module/AppModule.java index d352ece..2db7bed 100644 --- a/app/src/main/java/org/olomono/messenger/di/module/AppModule.java +++ b/app/src/main/java/org/olomono/messenger/di/module/AppModule.java @@ -1,6 +1,6 @@ package org.olomono.messenger.di.module; -import android.app.Application; +import org.olomono.messenger.MessengerApplication; import javax.inject.Singleton; @@ -10,15 +10,15 @@ import dagger.Provides; @Module public class AppModule { - Application mApplication; + private MessengerApplication mApplication; - public AppModule(Application application) { + public AppModule(MessengerApplication application) { this.mApplication = application; } @Provides @Singleton - Application provideApplication() { + MessengerApplication provideApplication() { return mApplication; } } diff --git a/app/src/main/java/org/olomono/messenger/di/module/RepositoryModule.java b/app/src/main/java/org/olomono/messenger/di/module/RepositoryModule.java new file mode 100644 index 0000000..c5a82c8 --- /dev/null +++ b/app/src/main/java/org/olomono/messenger/di/module/RepositoryModule.java @@ -0,0 +1,29 @@ +package org.olomono.messenger.di.module; + +import org.olomono.messenger.persistence.database.dao.AccountDao; +import org.olomono.messenger.persistence.database.dao.RosterEntryDao; +import org.olomono.messenger.persistence.repository.account.AccountRepository; +import org.olomono.messenger.persistence.repository.account.AccountRepositoryImpl; +import org.olomono.messenger.persistence.repository.roster.RosterEntryRepository; +import org.olomono.messenger.persistence.repository.roster.RosterEntryRepositoryImpl; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; + +@Module +public class RepositoryModule { + + @Singleton + @Provides + AccountRepository provideAccountRepository(AccountDao dao) { + return new AccountRepositoryImpl(dao); + } + + @Singleton + @Provides + RosterEntryRepository provideRosterEntryRepository(RosterEntryDao dao) { + return new RosterEntryRepositoryImpl(dao); + } +} diff --git a/app/src/main/java/org/olomono/messenger/di/module/RoomModule.java b/app/src/main/java/org/olomono/messenger/di/module/RoomModule.java index 7d4fe9d..8dae3fa 100644 --- a/app/src/main/java/org/olomono/messenger/di/module/RoomModule.java +++ b/app/src/main/java/org/olomono/messenger/di/module/RoomModule.java @@ -1,26 +1,26 @@ package org.olomono.messenger.di.module; -import android.app.Application; - +import org.olomono.messenger.MessengerApplication; import org.olomono.messenger.persistence.database.AppDatabase; import org.olomono.messenger.persistence.database.dao.AccountDao; import org.olomono.messenger.persistence.database.dao.RosterEntryDao; -import org.olomono.messenger.persistence.repository.account.AccountRepository; -import org.olomono.messenger.persistence.repository.RosterEntryRepository; -import org.olomono.messenger.persistence.repository.account.AccountRepositoryImpl; -import org.olomono.messenger.persistence.repository.impl.RosterEntryRepositoryImpl; +import javax.inject.Inject; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; +/** + * Provides the {@link AppDatabase}, DAOs and Repositories. + */ @Module public class RoomModule { private AppDatabase mAppDatabase; - public RoomModule(Application application) { + @Inject + public RoomModule(MessengerApplication application) { mAppDatabase = AppDatabase.getDatabase(application); } @@ -32,14 +32,8 @@ public class RoomModule { @Singleton @Provides - AccountDao provideAccountDao(AppDatabase appDatabase) { - return appDatabase.accountDao(); - } - - @Singleton - @Provides - AccountRepository provideAccountRepository(AccountDao dao) { - return new AccountRepositoryImpl(dao); + AccountDao provideAccountDao() { + return mAppDatabase.accountDao(); } @Singleton @@ -47,10 +41,4 @@ public class RoomModule { RosterEntryDao provideRosterEntryDao() { return mAppDatabase.rosterEntryDao(); } - - @Singleton - @Provides - RosterEntryRepository provideRosterEntryRepository(RosterEntryDao dao) { - return new RosterEntryRepositoryImpl(dao); - } } diff --git a/app/src/main/java/org/olomono/messenger/di/module/package-info.java b/app/src/main/java/org/olomono/messenger/di/module/package-info.java new file mode 100644 index 0000000..76a348c --- /dev/null +++ b/app/src/main/java/org/olomono/messenger/di/module/package-info.java @@ -0,0 +1,9 @@ +/** + * Modules define the methods that return the objects you’ll need to inject in your classes. + * If a method is dependent on passing in a parameter, then you need to define an additional + * method that will return the object to be passed into the original method. The module will + * know which method to run in order to obtain the object being injected. + * + * @see The Simples Dagger2 Dependency Injection Sample App + */ +package org.olomono.messenger.di.module; diff --git a/app/src/main/java/org/olomono/messenger/persistence/database/Executor.java b/app/src/main/java/org/olomono/messenger/persistence/database/Executor.java deleted file mode 100644 index c55b7a7..0000000 --- a/app/src/main/java/org/olomono/messenger/persistence/database/Executor.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.olomono.messenger.persistence.database; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class Executor { - - public static void IOThread(Runnable runnable) { - ExecutorService executorService = Executors.newSingleThreadExecutor(); - executorService.execute(runnable); - } -} diff --git a/app/src/main/java/org/olomono/messenger/persistence/database/dao/AccountDao.java b/app/src/main/java/org/olomono/messenger/persistence/database/dao/AccountDao.java index 8abeeba..18a5930 100644 --- a/app/src/main/java/org/olomono/messenger/persistence/database/dao/AccountDao.java +++ b/app/src/main/java/org/olomono/messenger/persistence/database/dao/AccountDao.java @@ -6,7 +6,10 @@ import android.arch.persistence.room.Delete; import android.arch.persistence.room.Insert; import android.arch.persistence.room.Query; import android.arch.persistence.room.TypeConverters; +import android.arch.persistence.room.Update; +import android.support.annotation.WorkerThread; +import org.jxmpp.jid.EntityBareJid; import org.olomono.messenger.persistence.database.model.AccountModel; import org.olomono.messenger.persistence.database.type_converter.EntityBareJidConverter; @@ -16,6 +19,7 @@ import static android.arch.persistence.room.OnConflictStrategy.REPLACE; @Dao @TypeConverters(EntityBareJidConverter.class) +@WorkerThread public interface AccountDao { /** @@ -25,7 +29,7 @@ public interface AccountDao { * @return live updating account list */ @Query("select * from AccountModel") - LiveData> getAllAcounts(); + LiveData> getAllAccounts(); /** * Return the {@link AccountModel Account} which is identified by the given id. @@ -34,11 +38,17 @@ public interface AccountDao { * @return account or null */ @Query("select * from AccountModel where id = :id") - LiveData getAccountById(String id); + LiveData getAccountById(long id); - @Insert(onConflict = REPLACE) + @Query("select * from AccountModel where jid = :jid") + LiveData getAccountByJid(EntityBareJid jid); + + @Insert void insertAccount(AccountModel account); + @Update + void updateAccount(AccountModel account); + @Delete void deleteAccount(AccountModel account); } diff --git a/app/src/main/java/org/olomono/messenger/persistence/repository/account/Account.java b/app/src/main/java/org/olomono/messenger/persistence/database/model/Account.java similarity index 81% rename from app/src/main/java/org/olomono/messenger/persistence/repository/account/Account.java rename to app/src/main/java/org/olomono/messenger/persistence/database/model/Account.java index f76e4a1..6afaf5b 100644 --- a/app/src/main/java/org/olomono/messenger/persistence/repository/account/Account.java +++ b/app/src/main/java/org/olomono/messenger/persistence/database/model/Account.java @@ -1,4 +1,4 @@ -package org.olomono.messenger.persistence.repository.account; +package org.olomono.messenger.persistence.database.model; import org.jxmpp.jid.EntityBareJid; diff --git a/app/src/main/java/org/olomono/messenger/persistence/database/model/AccountModel.java b/app/src/main/java/org/olomono/messenger/persistence/database/model/AccountModel.java index ea94729..ce0fe30 100644 --- a/app/src/main/java/org/olomono/messenger/persistence/database/model/AccountModel.java +++ b/app/src/main/java/org/olomono/messenger/persistence/database/model/AccountModel.java @@ -7,14 +7,13 @@ import android.arch.persistence.room.TypeConverters; import org.jxmpp.jid.EntityBareJid; import org.olomono.messenger.persistence.database.type_converter.EntityBareJidConverter; -import org.olomono.messenger.persistence.repository.account.Account; @Entity public class AccountModel implements Account { - @PrimaryKey + @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") - public int id; + public long id; @TypeConverters(EntityBareJidConverter.class) @ColumnInfo(name = "jid") diff --git a/app/src/main/java/org/olomono/messenger/persistence/database/model/RosterEntryModel.java b/app/src/main/java/org/olomono/messenger/persistence/database/model/RosterEntryModel.java index 9d62811..7c0f14f 100644 --- a/app/src/main/java/org/olomono/messenger/persistence/database/model/RosterEntryModel.java +++ b/app/src/main/java/org/olomono/messenger/persistence/database/model/RosterEntryModel.java @@ -2,6 +2,7 @@ package org.olomono.messenger.persistence.database.model; import android.arch.persistence.room.Entity; import android.arch.persistence.room.ForeignKey; +import android.arch.persistence.room.Index; import android.arch.persistence.room.PrimaryKey; import android.arch.persistence.room.TypeConverters; diff --git a/app/src/main/java/org/olomono/messenger/persistence/repository/account/AccountRepository.java b/app/src/main/java/org/olomono/messenger/persistence/repository/account/AccountRepository.java index 5bf0420..76e0f50 100644 --- a/app/src/main/java/org/olomono/messenger/persistence/repository/account/AccountRepository.java +++ b/app/src/main/java/org/olomono/messenger/persistence/repository/account/AccountRepository.java @@ -8,7 +8,7 @@ import java.util.List; public interface AccountRepository { - LiveData getAccount(String accountId); + LiveData getAccount(long accountId); LiveData> getAllAccounts(); diff --git a/app/src/main/java/org/olomono/messenger/persistence/repository/account/AccountRepositoryImpl.java b/app/src/main/java/org/olomono/messenger/persistence/repository/account/AccountRepositoryImpl.java index 0c7d5fd..5fbd435 100644 --- a/app/src/main/java/org/olomono/messenger/persistence/repository/account/AccountRepositoryImpl.java +++ b/app/src/main/java/org/olomono/messenger/persistence/repository/account/AccountRepositoryImpl.java @@ -1,6 +1,7 @@ package org.olomono.messenger.persistence.repository.account; import android.arch.lifecycle.LiveData; +import android.os.AsyncTask; import org.olomono.messenger.persistence.database.dao.AccountDao; import org.olomono.messenger.persistence.database.model.AccountModel; @@ -19,17 +20,49 @@ public class AccountRepositoryImpl implements AccountRepository { } @Override - public LiveData getAccount(String accountId) { + public LiveData getAccount(long accountId) { return accountDao.getAccountById(accountId); } @Override public LiveData> getAllAccounts() { - return accountDao.getAllAcounts(); + return accountDao.getAllAccounts(); } @Override public void insertAccount(AccountModel accountModel) { - accountDao.insertAccount(accountModel); + InsertAsyncTask task = new InsertAsyncTask(accountDao); + task.execute(accountModel); + } + + private static class InsertAsyncTask extends AsyncTask { + + private final AccountDao accountDao; + + private InsertAsyncTask(AccountDao accountDao) { + this.accountDao = accountDao; + } + + @Override + protected Void doInBackground(AccountModel... accountModels) { + for (AccountModel accountModel : accountModels) { + accountDao.insertAccount(accountModel); + } + return null; + } + } + + private static class QueryAsyncTask extends AsyncTask> { + + private final AccountDao accountDao; + + private QueryAsyncTask(AccountDao accountDao) { + this.accountDao = accountDao; + } + + @Override + protected LiveData doInBackground(Long... longs) { + return accountDao.getAccountById(longs[0]); + } } } diff --git a/app/src/main/java/org/olomono/messenger/persistence/repository/impl/RosterEntryRepositoryImpl.java b/app/src/main/java/org/olomono/messenger/persistence/repository/impl/RosterEntryRepositoryImpl.java deleted file mode 100644 index 855c884..0000000 --- a/app/src/main/java/org/olomono/messenger/persistence/repository/impl/RosterEntryRepositoryImpl.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.olomono.messenger.persistence.repository.impl; - -import android.arch.lifecycle.LiveData; - -import org.olomono.messenger.persistence.database.dao.RosterEntryDao; -import org.olomono.messenger.persistence.repository.RosterEntryRepository; -import org.olomono.messenger.view.viewmodel.RosterEntryListViewModel; - -public class RosterEntryRepositoryImpl implements RosterEntryRepository { - - private final RosterEntryDao rosterEntryDao; - - public RosterEntryRepositoryImpl(RosterEntryDao dao) { - this.rosterEntryDao = dao; - } - - @Override - public LiveData getRosterEntries() { - // TODO - return null; - } -} diff --git a/app/src/main/java/org/olomono/messenger/persistence/repository/RosterEntryRepository.java b/app/src/main/java/org/olomono/messenger/persistence/repository/roster/RosterEntryRepository.java similarity index 54% rename from app/src/main/java/org/olomono/messenger/persistence/repository/RosterEntryRepository.java rename to app/src/main/java/org/olomono/messenger/persistence/repository/roster/RosterEntryRepository.java index f336f8b..4817c8b 100644 --- a/app/src/main/java/org/olomono/messenger/persistence/repository/RosterEntryRepository.java +++ b/app/src/main/java/org/olomono/messenger/persistence/repository/roster/RosterEntryRepository.java @@ -1,17 +1,19 @@ -package org.olomono.messenger.persistence.repository; +package org.olomono.messenger.persistence.repository.roster; import android.arch.lifecycle.LiveData; import org.jivesoftware.smack.roster.RosterEntry; import org.olomono.messenger.persistence.database.model.RosterEntryModel; -import org.olomono.messenger.view.viewmodel.RosterEntryListViewModel; +import org.olomono.messenger.ui.roster.RosterViewModel; + +import java.util.List; public interface RosterEntryRepository { /** - * Return a {@link LiveData} object of a {@link RosterEntryListViewModel} which contains + * Return a {@link LiveData} object of a {@link RosterViewModel} which contains * {@link RosterEntryModel} for all {@link RosterEntry RosterEntries} in the users roster. * @return */ - LiveData getRosterEntries(); + LiveData> getAllRosterEntries(); } diff --git a/app/src/main/java/org/olomono/messenger/persistence/repository/roster/RosterEntryRepositoryImpl.java b/app/src/main/java/org/olomono/messenger/persistence/repository/roster/RosterEntryRepositoryImpl.java new file mode 100644 index 0000000..b6546b1 --- /dev/null +++ b/app/src/main/java/org/olomono/messenger/persistence/repository/roster/RosterEntryRepositoryImpl.java @@ -0,0 +1,26 @@ +package org.olomono.messenger.persistence.repository.roster; + +import android.arch.lifecycle.LiveData; + +import org.olomono.messenger.persistence.database.dao.RosterEntryDao; +import org.olomono.messenger.persistence.database.model.RosterEntryModel; +import org.olomono.messenger.persistence.repository.roster.RosterEntryRepository; +import org.olomono.messenger.ui.roster.RosterViewModel; + +import java.util.List; + +public class RosterEntryRepositoryImpl implements RosterEntryRepository { + + private final RosterEntryDao rosterEntryDao; + + public RosterEntryRepositoryImpl(RosterEntryDao dao) { + this.rosterEntryDao = dao; + } + + @Override + public LiveData> getAllRosterEntries() { + return rosterEntryDao.getAllRosterEntries(); + } + + +} diff --git a/app/src/main/java/org/olomono/messenger/service/XmppConnectionHolder.java b/app/src/main/java/org/olomono/messenger/service/XmppConnectionHolder.java new file mode 100644 index 0000000..e2fd9bd --- /dev/null +++ b/app/src/main/java/org/olomono/messenger/service/XmppConnectionHolder.java @@ -0,0 +1,27 @@ +package org.olomono.messenger.service; + +import android.util.LongSparseArray; + +import org.jivesoftware.smack.XMPPConnection; + +public class XmppConnectionHolder { + + private static XmppConnectionHolder INSTANCE; + + private final LongSparseArray connections = new LongSparseArray<>(); + + private XmppConnectionHolder() { + + } + + public static XmppConnectionHolder getInstance() { + if (INSTANCE == null) { + INSTANCE = new XmppConnectionHolder(); + } + return INSTANCE; + } + + public LongSparseArray getConnections() { + return connections; + } +} diff --git a/app/src/main/java/org/olomono/messenger/service/XmppService.java b/app/src/main/java/org/olomono/messenger/service/XmppService.java index 27cdab1..3565e92 100644 --- a/app/src/main/java/org/olomono/messenger/service/XmppService.java +++ b/app/src/main/java/org/olomono/messenger/service/XmppService.java @@ -4,16 +4,25 @@ import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.support.annotation.Nullable; +import android.util.LongSparseArray; import android.util.SparseArray; import org.jivesoftware.smack.XMPPConnection; +import org.olomono.messenger.MessengerApplication; import org.olomono.messenger.persistence.database.AppDatabase; +import java.util.HashMap; +import java.util.Map; +import java.util.WeakHashMap; + +import javax.inject.Inject; + public class XmppService extends Service { - private AppDatabase database; + @Inject + AppDatabase database; - private SparseArray connections = new SparseArray<>(); + private LongSparseArray connections = new LongSparseArray<>(); @Nullable @Override @@ -24,10 +33,10 @@ public class XmppService extends Service { @Override public void onCreate() { super.onCreate(); - this.database = AppDatabase.getDatabase(getApplicationContext()); + MessengerApplication.getApplication().getAppComponent().inject(this); } - public XMPPConnection getConnection(int accountId) { + public XMPPConnection getConnection(long accountId) { return connections.get(accountId); } diff --git a/app/src/main/java/org/olomono/messenger/view/MainActivity.java b/app/src/main/java/org/olomono/messenger/ui/MainActivity.java similarity index 78% rename from app/src/main/java/org/olomono/messenger/view/MainActivity.java rename to app/src/main/java/org/olomono/messenger/ui/MainActivity.java index becb2f7..05010d4 100644 --- a/app/src/main/java/org/olomono/messenger/view/MainActivity.java +++ b/app/src/main/java/org/olomono/messenger/ui/MainActivity.java @@ -1,4 +1,4 @@ -package org.olomono.messenger.view; +package org.olomono.messenger.ui; import android.content.Intent; import android.os.AsyncTask; @@ -11,6 +11,7 @@ import android.view.MenuItem; import android.view.View; import org.jxmpp.jid.impl.JidCreate; +import org.olomono.messenger.MessengerApplication; import org.olomono.messenger.R; import org.olomono.messenger.di.component.DaggerAppComponent; import org.olomono.messenger.di.module.AppModule; @@ -19,8 +20,10 @@ import org.olomono.messenger.persistence.database.AppDatabase; import org.olomono.messenger.persistence.database.model.AccountModel; import org.olomono.messenger.persistence.database.model.RosterEntryModel; import org.olomono.messenger.persistence.repository.account.AccountRepository; -import org.olomono.messenger.persistence.repository.RosterEntryRepository; -import org.olomono.messenger.view.settings.SettingsActivity; +import org.olomono.messenger.persistence.repository.roster.RosterEntryRepository; +import org.olomono.messenger.ui.chat.ChatActivity; +import org.olomono.messenger.ui.login.LoginActivity; +import org.olomono.messenger.ui.settings.SettingsActivity; import java.util.List; @@ -41,11 +44,7 @@ public class MainActivity extends AppCompatActivity { Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - DaggerAppComponent.builder() - .appModule(new AppModule(getApplication())) - .roomModule(new RoomModule(getApplication())) - .build() - .inject(this); + MessengerApplication.getApplication().getAppComponent().inject(this); FloatingActionButton fab = findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @@ -54,6 +53,7 @@ public class MainActivity extends AppCompatActivity { AccountModel account = new AccountModel(); account.setJid(JidCreate.entityBareFromOrThrowUnchecked("alice@wonderland.lit")); account.setPassword("swordfish"); + accountRepository.insertAccount(account); } }); @@ -68,15 +68,20 @@ public class MainActivity extends AppCompatActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { - // Handle action bar item clicks here. The action bar will - // automatically handle clicks on the Home/Up button, so long - // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); - //noinspection SimplifiableIfStatement - if (id == R.id.action_settings) { - startActivity(new Intent(getApplicationContext(), SettingsActivity.class)); - return true; + switch (id) { + case R.id.action_settings: + startActivity(new Intent(getApplicationContext(), SettingsActivity.class)); + return true; + + case R.id.action_login: + startActivity(new Intent(getApplicationContext(), LoginActivity.class)); + return true; + + case R.id.action_chat: + startActivity(new Intent(getApplicationContext(), ChatActivity.class)); + return true; } return super.onOptionsItemSelected(item); @@ -96,7 +101,7 @@ public class MainActivity extends AppCompatActivity { @Override protected Void doInBackground(Runnable... runnables) { - List accounts = database.accountDao().getAllAcounts().getValue(); + List accounts = database.accountDao().getAllAccounts().getValue(); if (accounts == null || accounts.size() == 0) { runnables[0].run(); } diff --git a/app/src/main/java/org/olomono/messenger/ui/chat/ChatActivity.java b/app/src/main/java/org/olomono/messenger/ui/chat/ChatActivity.java index 2649a5c..6b533aa 100644 --- a/app/src/main/java/org/olomono/messenger/ui/chat/ChatActivity.java +++ b/app/src/main/java/org/olomono/messenger/ui/chat/ChatActivity.java @@ -13,7 +13,7 @@ public class ChatActivity extends AppCompatActivity { setContentView(R.layout.activity_chat); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() - .replace(R.id.container, ChatFragment.newInstance()) + .replace(R.id.container, ChatInputFragment.newInstance()) .commitNow(); } } diff --git a/app/src/main/java/org/olomono/messenger/ui/chat/ChatFragment.java b/app/src/main/java/org/olomono/messenger/ui/chat/ChatFragment.java deleted file mode 100644 index d67c065..0000000 --- a/app/src/main/java/org/olomono/messenger/ui/chat/ChatFragment.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.olomono.messenger.ui.chat; - -import android.arch.lifecycle.ViewModelProviders; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import org.olomono.messenger.R; - -public class ChatFragment extends Fragment { - - private ChatViewModel mViewModel; - - public static ChatFragment newInstance() { - return new ChatFragment(); - } - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_chat, container, false); - } - - @Override - public void onActivityCreated(@Nullable Bundle savedInstanceState) { - super.onActivityCreated(savedInstanceState); - mViewModel = ViewModelProviders.of(this).get(ChatViewModel.class); - // TODO: Use the ViewModel - } - -} diff --git a/app/src/main/java/org/olomono/messenger/ui/chat/ChatInputFragment.java b/app/src/main/java/org/olomono/messenger/ui/chat/ChatInputFragment.java new file mode 100644 index 0000000..2740d97 --- /dev/null +++ b/app/src/main/java/org/olomono/messenger/ui/chat/ChatInputFragment.java @@ -0,0 +1,76 @@ +package org.olomono.messenger.ui.chat; + +import android.arch.lifecycle.Observer; +import android.arch.lifecycle.ViewModelProviders; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.design.widget.FloatingActionButton; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.EditText; +import android.widget.ImageButton; +import android.widget.Toast; + +import org.olomono.messenger.R; + +public class ChatInputFragment extends Fragment implements View.OnClickListener { + + private EditText textInput; + private FloatingActionButton addAttachement; + private ImageButton buttonSend; + + private ChatInputViewModel mViewModel; + + public static ChatInputFragment newInstance() { + return new ChatInputFragment(); + } + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.fragment_chat, container, false); + textInput = view.findViewById(R.id.chat_field__text_input); + addAttachement = view.findViewById(R.id.chat_field__fab_add); + buttonSend = view.findViewById(R.id.chat_field__button_send); + + addAttachement.setOnClickListener(this); + buttonSend.setOnClickListener(this); + return view; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mViewModel = ViewModelProviders.of(this).get(ChatInputViewModel.class); + // observeViewModel(mViewModel); + } + + private void observeViewModel(ChatInputViewModel viewModel) { + viewModel.getDraft().observe(ChatInputFragment.this, new Observer() { + @Override + public void onChanged(@Nullable String draft) { + textInput.setText(draft); + } + }); + } + + @Override + public void onClick(View view) { + switch (view.getId()) { + // Add media + case R.id.chat_field__fab_add: + Toast.makeText(getContext(), R.string.not_yet_implemented, Toast.LENGTH_SHORT).show(); + break; + + // Send message + case R.id.chat_field__button_send: + textInput.setText(null); + Toast.makeText(getContext(), "Send message clicked", Toast.LENGTH_SHORT).show(); + break; + } + } +} diff --git a/app/src/main/java/org/olomono/messenger/ui/chat/ChatInputViewModel.java b/app/src/main/java/org/olomono/messenger/ui/chat/ChatInputViewModel.java new file mode 100644 index 0000000..31a9a77 --- /dev/null +++ b/app/src/main/java/org/olomono/messenger/ui/chat/ChatInputViewModel.java @@ -0,0 +1,11 @@ +package org.olomono.messenger.ui.chat; + +import android.arch.lifecycle.MutableLiveData; +import android.arch.lifecycle.ViewModel; + +public class ChatInputViewModel extends ViewModel { + + public MutableLiveData getDraft() { + return null; + } +} diff --git a/app/src/main/java/org/olomono/messenger/ui/chat/ChatViewModel.java b/app/src/main/java/org/olomono/messenger/ui/chat/ChatViewModel.java index 8f5a3aa..b152f63 100644 --- a/app/src/main/java/org/olomono/messenger/ui/chat/ChatViewModel.java +++ b/app/src/main/java/org/olomono/messenger/ui/chat/ChatViewModel.java @@ -2,6 +2,17 @@ package org.olomono.messenger.ui.chat; import android.arch.lifecycle.ViewModel; +import org.jxmpp.jid.EntityBareJid; +import org.olomono.messenger.persistence.database.model.Account; + public class ChatViewModel extends ViewModel { - // TODO: Implement the ViewModel + + private Account account; + private EntityBareJid contact; + + public void init(Account account, EntityBareJid contact) { + this.account = account; + this.contact = contact; + } + } diff --git a/app/src/main/java/org/olomono/messenger/view/LoginActivity.java b/app/src/main/java/org/olomono/messenger/ui/login/LoginActivity.java similarity index 82% rename from app/src/main/java/org/olomono/messenger/view/LoginActivity.java rename to app/src/main/java/org/olomono/messenger/ui/login/LoginActivity.java index ce61ac7..033f079 100644 --- a/app/src/main/java/org/olomono/messenger/view/LoginActivity.java +++ b/app/src/main/java/org/olomono/messenger/ui/login/LoginActivity.java @@ -1,4 +1,4 @@ -package org.olomono.messenger.view; +package org.olomono.messenger.ui.login; import android.arch.lifecycle.ViewModelProviders; import android.os.Bundle; @@ -15,7 +15,7 @@ import android.widget.TextView; import org.jxmpp.jid.EntityBareJid; import org.jxmpp.jid.impl.JidCreate; import org.olomono.messenger.R; -import org.olomono.messenger.view.viewmodel.LoginViewModel; +import org.olomono.messenger.persistence.database.model.AccountModel; /** * A login screen that offers login via email/password. @@ -28,6 +28,8 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito private View mProgressView; private View mLoginFormView; + private LoginViewModel viewModel; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -37,7 +39,20 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito mJidView = findViewById(R.id.jid); mPasswordView = findViewById(R.id.password); - LoginViewModel viewModel = ViewModelProviders.of(this).get(LoginViewModel.class); + viewModel = ViewModelProviders.of(this).get(LoginViewModel.class); + viewModel.getAccount().observe(this, accountModel -> { + if (accountModel == null) { + return; + } + + if (accountModel.getJid() != null) { + mJidView.setText(accountModel.getJid().toString()); + } + + if (accountModel.getPassword() != null) { + mPasswordView.setText(accountModel.getPassword()); + } + }); mJidView.setOnEditorActionListener(this); mPasswordView.setOnEditorActionListener(this); @@ -69,6 +84,8 @@ public class LoginActivity extends AppCompatActivity implements TextView.OnEdito if (!isPasswordValid(password)) { mPasswordView.setError(getResources().getString(R.string.error_invalid_password)); } + + viewModel.login(); } /** diff --git a/app/src/main/java/org/olomono/messenger/ui/login/LoginViewModel.java b/app/src/main/java/org/olomono/messenger/ui/login/LoginViewModel.java new file mode 100644 index 0000000..16efbf6 --- /dev/null +++ b/app/src/main/java/org/olomono/messenger/ui/login/LoginViewModel.java @@ -0,0 +1,40 @@ +package org.olomono.messenger.ui.login; + +import android.arch.lifecycle.MutableLiveData; +import android.arch.lifecycle.ViewModel; +import android.support.annotation.NonNull; +import android.text.TextUtils; + +import org.olomono.messenger.persistence.database.model.AccountModel; +import org.olomono.messenger.persistence.repository.account.AccountRepository; + +import javax.inject.Inject; + + +public class LoginViewModel extends ViewModel { + + @Inject + AccountRepository accountRepository; + + private MutableLiveData account = new MutableLiveData<>(); + + public LoginViewModel() { + super(); + init(new AccountModel()); + } + + public void init(@NonNull AccountModel account) { + this.account.setValue(account); + } + + public MutableLiveData getAccount() { + return account; + } + + public void login() { + AccountModel account = getAccount().getValue(); + if (account != null && account.getJid() != null && !TextUtils.isEmpty(account.getPassword())) { + accountRepository.insertAccount(account); + } + } +} diff --git a/app/src/main/java/org/olomono/messenger/view/roster/RosterEntryListFragment.java b/app/src/main/java/org/olomono/messenger/ui/roster/RosterFragment.java similarity index 54% rename from app/src/main/java/org/olomono/messenger/view/roster/RosterEntryListFragment.java rename to app/src/main/java/org/olomono/messenger/ui/roster/RosterFragment.java index 5ab3dee..4b25ba0 100644 --- a/app/src/main/java/org/olomono/messenger/view/roster/RosterEntryListFragment.java +++ b/app/src/main/java/org/olomono/messenger/ui/roster/RosterFragment.java @@ -1,4 +1,4 @@ -package org.olomono.messenger.view.roster; +package org.olomono.messenger.ui.roster; import android.arch.lifecycle.Observer; import android.arch.lifecycle.ViewModelProviders; @@ -10,23 +10,26 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import org.olomono.messenger.MessengerApplication; import org.olomono.messenger.R; import org.olomono.messenger.persistence.database.model.RosterEntryModel; -import org.olomono.messenger.view.viewmodel.RosterEntryListViewModel; +import org.olomono.messenger.persistence.repository.roster.RosterEntryRepository; import java.util.ArrayList; import java.util.List; +import javax.inject.Inject; + /** * A placeholder fragment containing a simple view. */ -public class RosterEntryListFragment extends Fragment { +public class RosterFragment extends Fragment { - private RosterEntryListViewModel viewModel; - private RosterEntryListRecyclerViewAdapter recyclerViewAdapter; + private RosterViewModel rosterViewModel; + private RosterRecyclerViewAdapter recyclerViewAdapter; private RecyclerView recyclerView; - public RosterEntryListFragment() { + public RosterFragment() { } @@ -36,17 +39,24 @@ public class RosterEntryListFragment extends Fragment { View view = inflater.inflate(R.layout.fragment_roster_entry_list, container, false); recyclerView = view.findViewById(R.id.roster_entry_list__recycler_view); - recyclerViewAdapter = new RosterEntryListRecyclerViewAdapter(new ArrayList<>()); + recyclerViewAdapter = new RosterRecyclerViewAdapter(new ArrayList<>()); recyclerView.setAdapter(recyclerViewAdapter); - viewModel = ViewModelProviders.of(this).get(RosterEntryListViewModel.class); - viewModel.getRosterEntryList().observe(RosterEntryListFragment.this, new Observer>() { - @Override - public void onChanged(@Nullable List rosterEntryModels) { - recyclerViewAdapter.addItems(rosterEntryModels); - } - }); + rosterViewModel = ViewModelProviders.of(getActivity()).get(RosterViewModel.class); + observeViewModel(rosterViewModel); return view; } + + private void observeViewModel(RosterViewModel viewModel) { + viewModel.getRosterEntryList().observe(this, new Observer>() { + @Override + public void onChanged(@Nullable List rosterEntries) { + if (rosterEntries == null) { + return; + } + recyclerViewAdapter.setItems(rosterEntries); + } + }); + } } diff --git a/app/src/main/java/org/olomono/messenger/view/roster/RosterEntryListRecyclerViewAdapter.java b/app/src/main/java/org/olomono/messenger/ui/roster/RosterRecyclerViewAdapter.java similarity index 83% rename from app/src/main/java/org/olomono/messenger/view/roster/RosterEntryListRecyclerViewAdapter.java rename to app/src/main/java/org/olomono/messenger/ui/roster/RosterRecyclerViewAdapter.java index d7aa555..3460312 100644 --- a/app/src/main/java/org/olomono/messenger/view/roster/RosterEntryListRecyclerViewAdapter.java +++ b/app/src/main/java/org/olomono/messenger/ui/roster/RosterRecyclerViewAdapter.java @@ -1,4 +1,4 @@ -package org.olomono.messenger.view.roster; +package org.olomono.messenger.ui.roster; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; @@ -12,12 +12,12 @@ import org.olomono.messenger.persistence.database.model.RosterEntryModel; import java.util.List; -public class RosterEntryListRecyclerViewAdapter - extends RecyclerView.Adapter { +public class RosterRecyclerViewAdapter + extends RecyclerView.Adapter { private List entryModelList; - public RosterEntryListRecyclerViewAdapter(List entryModelList) { + public RosterRecyclerViewAdapter(List entryModelList) { this.entryModelList = entryModelList; } @@ -41,7 +41,7 @@ public class RosterEntryListRecyclerViewAdapter return entryModelList.size(); } - public void addItems(List rosterEntryModels) { + public void setItems(List rosterEntryModels) { this.entryModelList = rosterEntryModels; notifyDataSetChanged(); } diff --git a/app/src/main/java/org/olomono/messenger/ui/roster/RosterViewModel.java b/app/src/main/java/org/olomono/messenger/ui/roster/RosterViewModel.java new file mode 100644 index 0000000..ff4eb54 --- /dev/null +++ b/app/src/main/java/org/olomono/messenger/ui/roster/RosterViewModel.java @@ -0,0 +1,33 @@ +package org.olomono.messenger.ui.roster; + +import android.app.Application; +import android.arch.lifecycle.AndroidViewModel; +import android.arch.lifecycle.LiveData; +import android.support.annotation.NonNull; + +import org.olomono.messenger.MessengerApplication; +import org.olomono.messenger.persistence.database.model.RosterEntryModel; +import org.olomono.messenger.persistence.repository.roster.RosterEntryRepository; + +import java.util.List; + +import javax.inject.Inject; + +public class RosterViewModel extends AndroidViewModel { + + @Inject + RosterEntryRepository rosterEntryRepository; + + private final LiveData> rosterEntryList; + + @Inject + public RosterViewModel(@NonNull Application application) { + super(application); + MessengerApplication.getApplication().getAppComponent().inject(this); + this.rosterEntryList = rosterEntryRepository.getAllRosterEntries(); + } + + public LiveData> getRosterEntryList() { + return rosterEntryList; + } +} diff --git a/app/src/main/java/org/olomono/messenger/view/settings/AppCompatPreferenceActivity.java b/app/src/main/java/org/olomono/messenger/ui/settings/AppCompatPreferenceActivity.java similarity index 98% rename from app/src/main/java/org/olomono/messenger/view/settings/AppCompatPreferenceActivity.java rename to app/src/main/java/org/olomono/messenger/ui/settings/AppCompatPreferenceActivity.java index 4475616..592aa59 100644 --- a/app/src/main/java/org/olomono/messenger/view/settings/AppCompatPreferenceActivity.java +++ b/app/src/main/java/org/olomono/messenger/ui/settings/AppCompatPreferenceActivity.java @@ -1,4 +1,4 @@ -package org.olomono.messenger.view.settings; +package org.olomono.messenger.ui.settings; import android.content.res.Configuration; import android.os.Bundle; diff --git a/app/src/main/java/org/olomono/messenger/view/settings/SettingsActivity.java b/app/src/main/java/org/olomono/messenger/ui/settings/SettingsActivity.java similarity index 99% rename from app/src/main/java/org/olomono/messenger/view/settings/SettingsActivity.java rename to app/src/main/java/org/olomono/messenger/ui/settings/SettingsActivity.java index 4eb0d75..3a8eada 100644 --- a/app/src/main/java/org/olomono/messenger/view/settings/SettingsActivity.java +++ b/app/src/main/java/org/olomono/messenger/ui/settings/SettingsActivity.java @@ -1,4 +1,4 @@ -package org.olomono.messenger.view.settings; +package org.olomono.messenger.ui.settings; import android.annotation.TargetApi; import android.content.Context; diff --git a/app/src/main/java/org/olomono/messenger/view/viewmodel/LoginViewModel.java b/app/src/main/java/org/olomono/messenger/view/viewmodel/LoginViewModel.java deleted file mode 100644 index ccdca05..0000000 --- a/app/src/main/java/org/olomono/messenger/view/viewmodel/LoginViewModel.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.olomono.messenger.view.viewmodel; - -import android.arch.lifecycle.MutableLiveData; -import android.arch.lifecycle.ViewModel; - - -public class LoginViewModel extends ViewModel { - - public LoginViewModel() { - super(); - } - - public MutableLiveData credentials; - - void setJid(String jid) { - } - - void setPassword(String password) { - - } - - static class DisplayableCredentials { - - } -} diff --git a/app/src/main/java/org/olomono/messenger/view/viewmodel/RosterEntryListViewModel.java b/app/src/main/java/org/olomono/messenger/view/viewmodel/RosterEntryListViewModel.java deleted file mode 100644 index cc3328e..0000000 --- a/app/src/main/java/org/olomono/messenger/view/viewmodel/RosterEntryListViewModel.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.olomono.messenger.view.viewmodel; - -import android.app.Application; -import android.arch.lifecycle.AndroidViewModel; -import android.arch.lifecycle.LiveData; -import android.os.AsyncTask; -import android.support.annotation.NonNull; - -import org.olomono.messenger.persistence.database.AppDatabase; -import org.olomono.messenger.persistence.database.model.RosterEntryModel; - -import java.util.List; - -public class RosterEntryListViewModel extends AndroidViewModel { - - private final LiveData> rosterEntryList; - - private AppDatabase appDatabase; - - public RosterEntryListViewModel(@NonNull Application application) { - super(application); - this.appDatabase = AppDatabase.getDatabase(this.getApplication()); - this.rosterEntryList = appDatabase.rosterEntryDao().getAllRosterEntries(); - } - - public LiveData> getRosterEntryList() { - return rosterEntryList; - } - - public void deleteItem(RosterEntryModel entry) { - new deleteAsyncTask(appDatabase).execute(entry); - } - - private static class deleteAsyncTask extends AsyncTask { - - private AppDatabase db; - - deleteAsyncTask(AppDatabase appDatabase) { - this.db = appDatabase; - } - - @Override - protected Void doInBackground(final RosterEntryModel... params) { - db.rosterEntryDao().deleteRosterEntry(params[0]); - return null; - } - } -} diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index a90102e..1953340 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -9,7 +9,7 @@ android:paddingTop="@dimen/activity_vertical_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingBottom="@dimen/activity_vertical_margin" - tools:context=".view.LoginActivity"> + tools:context=".ui.login.LoginActivity"> + tools:context=".ui.MainActivity"> + tools:context=".ui.chat.ChatInputFragment"> + android:layout_height="match_parent" + android:minHeight="56dp"> + diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 820f04e..8670364 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -1,10 +1,22 @@ + tools:context="org.olomono.messenger.ui.MainActivity"> + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4da79a4..5cbd558 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,6 +11,7 @@ This password is incorrect This field is required Settings + Not yet implemented! diff --git a/app/src/main/res/xml/pref_headers.xml b/app/src/main/res/xml/pref_headers.xml index 0e50923..c2d3b1b 100644 --- a/app/src/main/res/xml/pref_headers.xml +++ b/app/src/main/res/xml/pref_headers.xml @@ -3,17 +3,17 @@
diff --git a/build.gradle b/build.gradle index e200fd5..fc9436b 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.2' + classpath 'com.android.tools.build:gradle:3.4.0' // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 72cb60e..cc5c237 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Apr 05 00:34:49 CEST 2019 +#Mon Apr 22 13:24:10 CEST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/version.gradle b/version.gradle index 14bb16a..8e24d66 100644 --- a/version.gradle +++ b/version.gradle @@ -42,5 +42,5 @@ ext { daggerVersion = "2.17" // Android Support Library - supportLibVersion = "27.1.1" + supportLibVersion = "28.0.0" } \ No newline at end of file