Add first draft of chat activity

This commit is contained in:
Paul Schaub 2019-04-22 04:54:02 +02:00
parent 28aaa3db73
commit 6c40b0030f
Signed by: vanitasvitae
GPG Key ID: 62BEE9264BF17311
23 changed files with 397 additions and 37 deletions

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="WizardSettings">
<option name="children">
<map>
<entry key="vectorWizard">
<value>
<PersistentState>
<option name="children">
<map>
<entry key="vectorAssetStep">
<value>
<PersistentState>
<option name="children">
<map>
<entry key="clipartAsset">
<value>
<PersistentState>
<option name="values">
<map>
<entry key="url" value="jar:file:/home/vanitas/.android-development/android-studio/plugins/android/lib/android.jar!/images/material_design_icons/content/ic_send_black_24dp.xml" />
</map>
</option>
</PersistentState>
</value>
</entry>
</map>
</option>
<option name="values">
<map>
<entry key="outputName" value="ic_send_black_24dp" />
<entry key="sourceFile" value="$USER_HOME$" />
</map>
</option>
</PersistentState>
</value>
</entry>
</map>
</option>
</PersistentState>
</value>
</entry>
</map>
</option>
</component>
</project>

View File

@ -69,6 +69,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'
annotationProcessor "android.arch.lifecycle:compiler:$archCompVersion"
annotationProcessor "android.arch.persistence.room:compiler:$archCompVersion"
@ -81,6 +83,7 @@ dependencies {
implementation "com.android.support:design:$supportLibVersion"
implementation "com.android.support:support-v4:$supportLibVersion"
implementation "com.android.support:support-vector-drawable:$supportLibVersion"
implementation "com.android.support:cardview-v7:$supportLibVersion"
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'

View File

@ -13,23 +13,25 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".view.MainActivity"
android:label="@string/title_activity_main"
android:theme="@style/AppTheme.NoActionBar">
<activity android:name=".ui.chat.ChatActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".view.MainActivity"
android:label="@string/title_activity_main"
android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity
android:name=".view.settings.SettingsActivity"
android:label="@string/title_activity_settings" />
<activity
android:name=".LoginActivity"
android:name=".view.LoginActivity"
android:label="@string/title_activity_login" />
<activity android:name=".view.LoginActivity" />
<service android:name=".service.XmppService" />
</application>

View File

@ -7,7 +7,7 @@ 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.AccountRepository;
import org.olomono.messenger.persistence.repository.account.AccountRepository;
import org.olomono.messenger.persistence.repository.RosterEntryRepository;
import org.olomono.messenger.view.MainActivity;

View File

@ -5,9 +5,9 @@ import android.app.Application;
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.AccountRepository;
import org.olomono.messenger.persistence.repository.account.AccountRepository;
import org.olomono.messenger.persistence.repository.RosterEntryRepository;
import org.olomono.messenger.persistence.repository.impl.AccountRepositoryImpl;
import org.olomono.messenger.persistence.repository.account.AccountRepositoryImpl;
import org.olomono.messenger.persistence.repository.impl.RosterEntryRepositoryImpl;
import javax.inject.Singleton;

View File

@ -1,45 +1,57 @@
package org.olomono.messenger.persistence.database.model;
import android.arch.persistence.room.ColumnInfo;
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;
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 {
public class AccountModel implements Account {
@PrimaryKey
@ColumnInfo(name = "id")
public int id;
@TypeConverters(EntityBareJidConverter.class)
@ColumnInfo(name = "jid")
private EntityBareJid jid;
@ColumnInfo(name = "password")
private String password;
@ColumnInfo(name = "enabled")
private boolean enabled;
@Override
public EntityBareJid getJid() {
return jid;
}
@Override
public void setJid(EntityBareJid jid) {
this.jid = jid;
}
@Override
public String getPassword() {
return password;
}
@Override
public void setPassword(String password) {
this.password = password;
}
@Override
public boolean getEnabled() {
return enabled;
}
@Override
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}

View File

@ -0,0 +1,18 @@
package org.olomono.messenger.persistence.repository.account;
import org.jxmpp.jid.EntityBareJid;
public interface Account {
String getPassword();
void setPassword(String password);
EntityBareJid getJid();
void setJid(EntityBareJid jid);
boolean getEnabled();
void setEnabled(boolean enabled);
}

View File

@ -1,4 +1,4 @@
package org.olomono.messenger.persistence.repository;
package org.olomono.messenger.persistence.repository.account;
import android.arch.lifecycle.LiveData;

View File

@ -1,10 +1,9 @@
package org.olomono.messenger.persistence.repository.impl;
package org.olomono.messenger.persistence.repository.account;
import android.arch.lifecycle.LiveData;
import org.olomono.messenger.persistence.database.dao.AccountDao;
import org.olomono.messenger.persistence.database.model.AccountModel;
import org.olomono.messenger.persistence.repository.AccountRepository;
import java.util.List;

View File

@ -0,0 +1,20 @@
package org.olomono.messenger.ui.chat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import org.olomono.messenger.R;
public class ChatActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.container, ChatFragment.newInstance())
.commitNow();
}
}
}

View File

@ -0,0 +1,36 @@
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
}
}

View File

@ -0,0 +1,7 @@
package org.olomono.messenger.ui.chat;
import android.arch.lifecycle.ViewModel;
public class ChatViewModel extends ViewModel {
// TODO: Implement the ViewModel
}

View File

@ -1,8 +1,8 @@
package org.olomono.messenger.view;
import android.support.v7.app.AppCompatActivity;
import android.arch.lifecycle.ViewModelProviders;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
@ -15,6 +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;
/**
* A login screen that offers login via email/password.
@ -36,17 +37,10 @@ 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);
mJidView.setOnEditorActionListener(this);
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) {
loginDetailsEntered();
return true;
}
return false;
}
});
mPasswordView.setOnEditorActionListener(this);
Button mEmailSignInButton = findViewById(R.id.sign_in_button);
mEmailSignInButton.setOnClickListener(new OnClickListener() {

View File

@ -9,19 +9,16 @@ import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import org.jxmpp.jid.impl.JidCreate;
import org.jxmpp.stringprep.XmppStringprepException;
import org.olomono.messenger.R;
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.RoomModule;
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.AccountRepository;
import org.olomono.messenger.persistence.repository.account.AccountRepository;
import org.olomono.messenger.persistence.repository.RosterEntryRepository;
import org.olomono.messenger.view.settings.SettingsActivity;
@ -29,8 +26,6 @@ import java.util.List;
import javax.inject.Inject;
import dagger.internal.DaggerCollections;
public class MainActivity extends AppCompatActivity {
@Inject

View File

@ -0,0 +1,25 @@
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<DisplayableCredentials> credentials;
void setJid(String jid) {
}
void setPassword(String password) {
}
static class DisplayableCredentials {
}
}

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24.0" android:viewportWidth="24.0"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/>
</vector>

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z"/>
</vector>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.chat.ChatActivity" />

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/chat"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.chat.ChatFragment">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/recycler_view_item_1">
</android.support.v7.widget.RecyclerView>
<FrameLayout
android:id="@+id/container_chat"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<include layout="@layout/view_chat_field"/>
</FrameLayout>
</android.support.constraint.ConstraintLayout>

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageView2"
android:layout_width="50dp"
android:layout_height="50dp"
tools:src="@tools:sample/avatars"
app:layout_constraintStart_toStartOf="parent"
android:layout_marginStart="8dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="@tools:sample/full_names"
android:textSize="20sp"
android:textColor="@android:color/black"
app:layout_constraintTop_toTopOf="@+id/imageView2"
app:layout_constraintStart_toEndOf="@+id/imageView2"
android:layout_marginStart="8dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="@+id/textView2" />
<TextView
android:id="@+id/textView2"
android:layout_width="285dp"
android:layout_height="20dp"
tools:text="@tools:sample/lorem[4:10]"
app:layout_constraintBottom_toBottomOf="@+id/imageView2"
app:layout_constraintStart_toEndOf="@+id/imageView2"
android:layout_marginStart="8dp"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="8dp"
app:layout_constraintHorizontal_bias="0.050" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="@tools:sample/date/hhmm"
app:layout_constraintTop_toTopOf="@+id/imageView2"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="8dp" />
</android.support.constraint.ConstraintLayout>

View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@null">
<android.support.design.widget.FloatingActionButton
android:id="@+id/floatingActionButton"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
android:scaleType="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="1.0"
app:srcCompat="@drawable/ic_add_white_24dp" />
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:minHeight="48dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/floatingActionButton"
app:layout_constraintTop_toTopOf="parent"
card_view:cardCornerRadius="24dp"
card_view:cardElevation="6dp"
app:cardUseCompatPadding="true">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/editText"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:inputType="textMultiLine|textAutoCorrect"
android:maxLines="6"
card_view:layout_constraintBottom_toBottomOf="parent"
card_view:layout_constraintEnd_toStartOf="@+id/appCompatImageButton"
card_view:layout_constraintStart_toStartOf="parent"
card_view:layout_constraintTop_toTopOf="parent"
tools:text="Open Protocols!" />
<android.support.v7.widget.AppCompatImageButton
android:id="@+id/appCompatImageButton"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@null"
android:tint="@color/colorAccent"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@drawable/ic_send_black_24dp"
card_view:layout_constraintBottom_toBottomOf="parent" />
</android.support.constraint.ConstraintLayout>
</android.support.v7.widget.CardView>
</android.support.constraint.ConstraintLayout>

View File

@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorPrimary">#008577</color>
<color name="colorPrimaryDark">#00574B</color>
<color name="colorAccent">#D81B60</color>
<color name="colorPrimary">#38445e</color>
<color name="colorPrimaryDark">#0f1d34</color>
<color name="colorAccent">#636f8b</color>
<color name="background">#ECEFF1</color>
</resources>

View File

@ -1,20 +1,43 @@
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<style name="AppTheme" parent="Theme.AppCompat.Light">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:colorBackground">@color/background</item>
<item name="editTextBackground">@null</item>
<item name="actionBarStyle">@style/AppTheme.AppBarOverlay</item>
</style>
<!-- Theme for Activities that either have their own, or no toolbar at all -->
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<!-- Theme for the Toolbar -->
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.ActionBar">
<item name="android:windowTitleStyle">@style/AppTheme.AppBarOverlay.TitleStyle</item>
</style>
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
<!-- Theme for menu entry popups of the toolbars menu -->
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat" />
<style name="AppTheme.AppBarOverlay.TitleStyle" parent="Theme.AppCompat.Light">
<item name="android:textColorPrimary">#fff</item>
</style>
<style name="AppTheme.ChatTextField" parent="Theme.AppCompat.NoActionBar">
</style>
<style name="AppTheme.ChatText" parent="AppTheme">
</style>
</resources>