support navigation via nav bar

This commit is contained in:
kosyak 2024-07-14 15:01:05 +02:00
parent c145a6b8e5
commit 4453ad71ac
36 changed files with 573 additions and 93 deletions

View file

@ -1,5 +1,7 @@
package eu.siacs.conversations.ui; package eu.siacs.conversations.ui;
import static android.view.View.VISIBLE;
import android.content.ActivityNotFoundException; import android.content.ActivityNotFoundException;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@ -40,6 +42,9 @@ import eu.siacs.conversations.xmpp.XmppConnection;
import static eu.siacs.conversations.utils.PermissionUtils.allGranted; import static eu.siacs.conversations.utils.PermissionUtils.allGranted;
import static eu.siacs.conversations.utils.PermissionUtils.writeGranted; import static eu.siacs.conversations.utils.PermissionUtils.writeGranted;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;
public class ManageAccountActivity extends XmppActivity implements OnAccountUpdate, KeyChainAliasCallback, XmppConnectionService.OnAccountCreated, AccountAdapter.OnTglAccountState { public class ManageAccountActivity extends XmppActivity implements OnAccountUpdate, KeyChainAliasCallback, XmppConnectionService.OnAccountCreated, AccountAdapter.OnTglAccountState {
private final String STATE_SELECTED_ACCOUNT = "selected_account"; private final String STATE_SELECTED_ACCOUNT = "selected_account";
@ -68,9 +73,10 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
accountList.addAll(xmppConnectionService.getAccounts()); accountList.addAll(xmppConnectionService.getAccounts());
} }
ActionBar actionBar = getSupportActionBar(); ActionBar actionBar = getSupportActionBar();
boolean showNavBar = findViewById(R.id.bottom_navigation).getVisibility() == VISIBLE;
if (actionBar != null) { if (actionBar != null) {
actionBar.setHomeButtonEnabled(this.accountList.size() > 0); actionBar.setHomeButtonEnabled(this.accountList.size() > 0 && !showNavBar);
actionBar.setDisplayHomeAsUpEnabled(this.accountList.size() > 0); actionBar.setDisplayHomeAsUpEnabled(this.accountList.size() > 0 && !showNavBar);
} }
invalidateOptionsMenu(); invalidateOptionsMenu();
mAccountAdapter.notifyDataSetChanged(); mAccountAdapter.notifyDataSetChanged();
@ -100,6 +106,30 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
accountListView.setAdapter(this.mAccountAdapter); accountListView.setAdapter(this.mAccountAdapter);
accountListView.setOnItemClickListener((arg0, view, position, arg3) -> switchToAccount(accountList.get(position))); accountListView.setOnItemClickListener((arg0, view, position, arg3) -> switchToAccount(accountList.get(position)));
registerForContextMenu(accountListView); registerForContextMenu(accountListView);
BottomNavigationView bottomNavigationView=findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnItemSelectedListener(item -> {
switch (item.getItemId()) {
case R.id.chats -> {
startActivity(new Intent(getApplicationContext(), ConversationsActivity.class));
overridePendingTransition(R.animator.fade_in, R.animator.fade_out);
return true;
}
case R.id.contactslist -> {
Intent i = new Intent(getApplicationContext(), StartConversationActivity.class);
i.putExtra("show_nav_bar", true);
startActivity(i);
overridePendingTransition(R.animator.fade_in, R.animator.fade_out);
return true;
}
case R.id.manageaccounts -> {
return true;
}
default ->
throw new IllegalStateException("Unexpected value: " + item.getItemId());
}
});
} }
@Override @Override
@ -109,6 +139,15 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
if (this.mTheme != theme) { if (this.mTheme != theme) {
recreate(); recreate();
} }
BottomNavigationView bottomNavigationView=findViewById(R.id.bottom_navigation);
bottomNavigationView.setSelectedItemId(R.id.manageaccounts);
if (getBooleanPreference("show_nav_bar", R.bool.show_nav_bar) && getIntent().getBooleanExtra("show_nav_bar", false)) {
bottomNavigationView.setVisibility(VISIBLE);
} else {
bottomNavigationView.setVisibility(View.GONE);
}
} }
@Override @Override
@ -147,6 +186,18 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
menu.setHeaderTitle(this.selectedAccount.getJid().asBareJid().toEscapedString()); menu.setHeaderTitle(this.selectedAccount.getJid().asBareJid().toEscapedString());
} }
@Override
public void onBackPressed() {
if (findViewById(R.id.bottom_navigation).getVisibility() == VISIBLE) {
Intent intent = new Intent(this, ConversationsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent);
overridePendingTransition(R.animator.fade_in, R.animator.fade_out);
}
super.onBackPressed();
}
@Override @Override
void onBackendConnected() { void onBackendConnected() {
if (selectedAccountJid != null) { if (selectedAccountJid != null) {

View file

@ -1418,6 +1418,14 @@ public class ConversationFragment extends XmppFragment
menuTogglePinned.setTitle(R.string.add_to_favorites); menuTogglePinned.setTitle(R.string.add_to_favorites);
} }
} }
Fragment secondaryFragment = activity.getFragmentManager().findFragmentById(R.id.secondary_fragment);
if (secondaryFragment instanceof ConversationFragment) {
activity.showNavigationBar();
} else {
activity.hideNavigationBar();
}
super.onCreateOptionsMenu(menu, menuInflater); super.onCreateOptionsMenu(menu, menuInflater);
} }

View file

@ -31,6 +31,7 @@ package eu.siacs.conversations.ui;
import static eu.siacs.conversations.ui.ConversationFragment.REQUEST_DECRYPT_PGP; import static eu.siacs.conversations.ui.ConversationFragment.REQUEST_DECRYPT_PGP;
import static eu.siacs.conversations.utils.AccountUtils.MANAGE_ACCOUNT_ACTIVITY;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
@ -61,6 +62,9 @@ import androidx.appcompat.app.AlertDialog;
import androidx.core.app.ActivityCompat; import androidx.core.app.ActivityCompat;
import androidx.databinding.DataBindingUtil; import androidx.databinding.DataBindingUtil;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.navigation.NavigationBarView;
import org.openintents.openpgp.util.OpenPgpApi; import org.openintents.openpgp.util.OpenPgpApi;
import java.util.Arrays; import java.util.Arrays;
@ -397,6 +401,33 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
pendingViewIntent.push(intent); pendingViewIntent.push(intent);
setIntent(createLauncherIntent(this)); setIntent(createLauncherIntent(this));
} }
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnItemSelectedListener(item -> {
switch (item.getItemId()) {
case R.id.chats -> {
return true;
}
case R.id.contactslist -> {
Intent i = new Intent(getApplicationContext(), StartConversationActivity.class);
i.putExtra("show_nav_bar", true);
startActivity(i);
overridePendingTransition(R.animator.fade_in, R.animator.fade_out);
return true;
}
case R.id.manageaccounts -> {
Intent i = new Intent(getApplicationContext(), MANAGE_ACCOUNT_ACTIVITY);
i.putExtra("show_nav_bar", true);
startActivity(i);
overridePendingTransition(R.animator.fade_in, R.animator.fade_out);
return true;
}
default ->
throw new IllegalStateException("Unexpected value: " + item.getItemId());
}
});
} }
@Override @Override
@ -432,6 +463,24 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
} }
} }
public boolean navigationBarVisible() {
return findViewById(R.id.bottom_navigation).getVisibility() == View.VISIBLE;
}
public boolean showNavigationBar() {
if (!getBooleanPreference("show_nav_bar", R.bool.show_nav_bar)) {
findViewById(R.id.bottom_navigation).setVisibility(View.GONE);
return false;
}
findViewById(R.id.bottom_navigation).setVisibility(View.VISIBLE);
return true;
}
public void hideNavigationBar() {
findViewById(R.id.bottom_navigation).setVisibility(View.GONE);
}
@Nullable @Nullable
public View getFragmentHostView() { public View getFragmentHostView() {
if (binding.secondaryFragment != null) { if (binding.secondaryFragment != null) {
@ -611,6 +660,9 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
this.mSkipBackgroundBinding = false; this.mSkipBackgroundBinding = false;
} }
mRedirectInProcess.set(false); mRedirectInProcess.set(false);
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
bottomNavigationView.setSelectedItemId(R.id.chats);
} }
@Override @Override

View file

@ -422,6 +422,21 @@ public class ConversationsOverviewFragment extends XmppFragment {
} }
} }
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
boolean navBarVisible = activity instanceof ConversationsActivity && ((ConversationsActivity) activity).navigationBarVisible();
MenuItem manageAccount = menu.findItem(R.id.action_account);
MenuItem manageAccounts = menu.findItem(R.id.action_accounts);
if (navBarVisible) {
manageAccount.setVisible(false);
manageAccounts.setVisible(false);
} else {
AccountUtils.showHideMenuItems(menu);
}
}
@Override @Override
public void onStart() { public void onStart() {
super.onStart(); super.onStart();
@ -429,6 +444,16 @@ public class ConversationsOverviewFragment extends XmppFragment {
if (activity.xmppConnectionService != null) { if (activity.xmppConnectionService != null) {
refresh(); refresh();
} }
if (activity instanceof ConversationsActivity) {
boolean showed = ((ConversationsActivity) activity).showNavigationBar();
if (showed) {
this.binding.fab.setVisibility(View.GONE);
} else {
this.binding.fab.setVisibility(View.VISIBLE);
}
}
} }
@Override @Override

View file

@ -1,5 +1,9 @@
package eu.siacs.conversations.ui; package eu.siacs.conversations.ui;
import static android.view.View.VISIBLE;
import static eu.siacs.conversations.utils.AccountUtils.MANAGE_ACCOUNT_ACTIVITY;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Dialog; import android.app.Dialog;
@ -63,6 +67,7 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.viewpager.widget.PagerAdapter; import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager; import androidx.viewpager.widget.ViewPager;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.google.android.material.textfield.TextInputLayout; import com.google.android.material.textfield.TextInputLayout;
import com.leinardi.android.speeddial.SpeedDialActionItem; import com.leinardi.android.speeddial.SpeedDialActionItem;
import com.leinardi.android.speeddial.SpeedDialView; import com.leinardi.android.speeddial.SpeedDialView;
@ -374,6 +379,30 @@ public class StartConversationActivity extends XmppActivity implements XmppConne
} }
return false; return false;
}); });
BottomNavigationView bottomNavigationView=findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnItemSelectedListener(item -> {
switch (item.getItemId()) {
case R.id.chats -> {
startActivity(new Intent(getApplicationContext(), ConversationsActivity.class));
overridePendingTransition(R.animator.fade_in, R.animator.fade_out);
return true;
}
case R.id.contactslist -> {
return true;
}
case R.id.manageaccounts -> {
Intent i = new Intent(getApplicationContext(), MANAGE_ACCOUNT_ACTIVITY);
i.putExtra("show_nav_bar", true);
startActivity(i);
overridePendingTransition(R.animator.fade_in, R.animator.fade_out);
return true;
}
default ->
throw new IllegalStateException("Unexpected value: " + item.getItemId());
}
});
} }
private void inflateFab(final SpeedDialView speedDialView, final @MenuRes int menuRes) { private void inflateFab(final SpeedDialView speedDialView, final @MenuRes int menuRes) {
@ -430,6 +459,15 @@ public class StartConversationActivity extends XmppActivity implements XmppConne
} }
mConferenceAdapter.refreshSettings(); mConferenceAdapter.refreshSettings();
mContactsAdapter.refreshSettings(); mContactsAdapter.refreshSettings();
BottomNavigationView bottomNavigationView=findViewById(R.id.bottom_navigation);
bottomNavigationView.setSelectedItemId(R.id.contactslist);
if (getBooleanPreference("show_nav_bar", R.bool.show_nav_bar) && getIntent().getBooleanExtra("show_nav_bar", false)) {
bottomNavigationView.setVisibility(VISIBLE);
} else {
bottomNavigationView.setVisibility(View.GONE);
}
} }
@Override @Override
@ -769,6 +807,22 @@ public class StartConversationActivity extends XmppActivity implements XmppConne
return super.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu);
} }
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
boolean res = super.onPrepareOptionsMenu(menu);
boolean navBarVisible = binding.bottomNavigation.getVisibility() == VISIBLE;
MenuItem manageAccount = menu.findItem(R.id.action_account);
MenuItem manageAccounts = menu.findItem(R.id.action_accounts);
if (navBarVisible) {
manageAccount.setVisible(false);
manageAccounts.setVisible(false);
} else {
AccountUtils.showHideMenuItems(menu);
}
return res;
}
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (MenuDoubleTabUtil.shouldIgnoreTap()) { if (MenuDoubleTabUtil.shouldIgnoreTap()) {
@ -916,8 +970,9 @@ public class StartConversationActivity extends XmppActivity implements XmppConne
return; return;
} }
boolean openConversations = !createdByViewIntent && !xmppConnectionService.isConversationsListEmpty(null); boolean openConversations = !createdByViewIntent && !xmppConnectionService.isConversationsListEmpty(null);
actionBar.setDisplayHomeAsUpEnabled(openConversations); boolean showNavBar = binding.bottomNavigation.getVisibility() == VISIBLE;
actionBar.setDisplayHomeAsUpEnabled(openConversations); actionBar.setDisplayHomeAsUpEnabled(openConversations && !showNavBar);
actionBar.setDisplayHomeAsUpEnabled(openConversations && !showNavBar);
} }
@ -1149,6 +1204,9 @@ public class StartConversationActivity extends XmppActivity implements XmppConne
Intent intent = new Intent(this, ConversationsActivity.class); Intent intent = new Intent(this, ConversationsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivity(intent); startActivity(intent);
if (binding.bottomNavigation.getVisibility() == VISIBLE) {
overridePendingTransition(R.animator.fade_in, R.animator.fade_out);
}
} }
finish(); finish();
} }

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:fromAlpha="0.0"
android:interpolator="@android:anim/accelerate_interpolator"
android:toAlpha="1.0" />
</set>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:shareInterpolator="@android:anim/accelerate_decelerate_interpolator">
<objectAnimator
android:propertyName="translationX"
android:valueFrom="-200"
android:valueTo="0"
android:valueType="floatType" />
<objectAnimator
android:propertyName="alpha"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
</set>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:shareInterpolator="@android:anim/accelerate_decelerate_interpolator">
<objectAnimator
android:propertyName="translationX"
android:valueFrom="0"
android:valueTo="-200"
android:valueType="floatType" />
<objectAnimator
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType" />
</set>

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:fromAlpha="1.0"
android:interpolator="@android:anim/anticipate_interpolator"
android:toAlpha="0.0" />
</set>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:shareInterpolator="@android:anim/accelerate_decelerate_interpolator">
<objectAnimator
android:propertyName="translationX"
android:valueFrom="200"
android:valueTo="0"
android:valueType="floatType" />
<objectAnimator
android:propertyName="alpha"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
</set>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:shareInterpolator="@android:anim/accelerate_decelerate_interpolator">
<objectAnimator
android:propertyName="translationX"
android:valueFrom="0"
android:valueTo="200"
android:valueType="floatType" />
<objectAnimator
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType" />
</set>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,6c1.93,0 3.5,1.57 3.5,3.5S13.93,13 12,13s-3.5,-1.57 -3.5,-3.5S10.07,6 12,6zM12,20c-2.03,0 -4.43,-0.82 -6.14,-2.88C7.55,15.8 9.68,15 12,15s4.45,0.8 6.14,2.12C16.43,19.18 14.03,20 12,20z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,6c1.93,0 3.5,1.57 3.5,3.5S13.93,13 12,13s-3.5,-1.57 -3.5,-3.5S10.07,6 12,6zM12,20c-2.03,0 -4.43,-0.82 -6.14,-2.88C7.55,15.8 9.68,15 12,15s4.45,0.8 6.14,2.12C16.43,19.18 14.03,20 12,20z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#000000" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM6,9h12v2L6,11L6,9zM14,14L6,14v-2h8v2zM18,8L6,8L6,6h12v2z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#FFFFFF" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM6,9h12v2L6,11L6,9zM14,14L6,14v-2h8v2zM18,8L6,8L6,6h12v2z"/>
</vector>

View file

@ -0,0 +1,6 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM7.35,18.5C8.66,17.56 10.26,17 12,17s3.34,0.56 4.65,1.5C15.34,19.44 13.74,20 12,20S8.66,19.44 7.35,18.5zM18.14,17.12L18.14,17.12C16.45,15.8 14.32,15 12,15s-4.45,0.8 -6.14,2.12l0,0C4.7,15.73 4,13.95 4,12c0,-4.42 3.58,-8 8,-8s8,3.58 8,8C20,13.95 19.3,15.73 18.14,17.12z"/>
<path android:fillColor="@android:color/white" android:pathData="M12,6c-1.93,0 -3.5,1.57 -3.5,3.5S10.07,13 12,13s3.5,-1.57 3.5,-3.5S13.93,6 12,6zM12,11c-0.83,0 -1.5,-0.67 -1.5,-1.5S11.17,8 12,8s1.5,0.67 1.5,1.5S12.83,11 12,11z"/>
</vector>

View file

@ -0,0 +1,6 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM7.35,18.5C8.66,17.56 10.26,17 12,17s3.34,0.56 4.65,1.5C15.34,19.44 13.74,20 12,20S8.66,19.44 7.35,18.5zM18.14,17.12L18.14,17.12C16.45,15.8 14.32,15 12,15s-4.45,0.8 -6.14,2.12l0,0C4.7,15.73 4,13.95 4,12c0,-4.42 3.58,-8 8,-8s8,3.58 8,8C20,13.95 19.3,15.73 18.14,17.12z"/>
<path android:fillColor="@android:color/white" android:pathData="M12,6c-1.93,0 -3.5,1.57 -3.5,3.5S10.07,13 12,13s3.5,-1.57 3.5,-3.5S13.93,6 12,6zM12,11c-0.83,0 -1.5,-0.67 -1.5,-1.5S11.17,8 12,8s1.5,0.67 1.5,1.5S12.83,11 12,11z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M16,11c1.66,0 2.99,-1.34 2.99,-3S17.66,5 16,5c-1.66,0 -3,1.34 -3,3s1.34,3 3,3zM8,11c1.66,0 2.99,-1.34 2.99,-3S9.66,5 8,5C6.34,5 5,6.34 5,8s1.34,3 3,3zM8,13c-2.33,0 -7,1.17 -7,3.5L1,19h14v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5zM16,13c-0.29,0 -0.62,0.02 -0.97,0.05 1.16,0.84 1.97,1.97 1.97,3.45L17,19h6v-2.5c0,-2.33 -4.67,-3.5 -7,-3.5z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#000000" android:viewportHeight="960"
android:viewportWidth="960" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M240,560L560,560L560,480L240,480L240,560ZM240,440L720,440L720,360L240,360L240,440ZM240,320L720,320L720,240L240,240L240,320ZM80,880L80,160Q80,127 103.5,103.5Q127,80 160,80L800,80Q833,80 856.5,103.5Q880,127 880,160L880,640Q880,673 856.5,696.5Q833,720 800,720L240,720L80,880ZM206,640L800,640Q800,640 800,640Q800,640 800,640L800,160Q800,160 800,160Q800,160 800,160L160,160Q160,160 160,160Q160,160 160,160L160,685L206,640ZM160,640L160,640L160,160Q160,160 160,160Q160,160 160,160L160,160Q160,160 160,160Q160,160 160,160L160,640Q160,640 160,640Q160,640 160,640L160,640Z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#FFFFFF" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M4,4h16v12L5.17,16L4,17.17L4,4m0,-2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2L4,2zM6,12h8v2L6,14v-2zM6,9h12v2L6,11L6,9zM6,6h12v2L6,8L6,6z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M9,13.75c-2.34,0 -7,1.17 -7,3.5L2,19h14v-1.75c0,-2.33 -4.66,-3.5 -7,-3.5zM4.34,17c0.84,-0.58 2.87,-1.25 4.66,-1.25s3.82,0.67 4.66,1.25L4.34,17zM9,12c1.93,0 3.5,-1.57 3.5,-3.5S10.93,5 9,5 5.5,6.57 5.5,8.5 7.07,12 9,12zM9,7c0.83,0 1.5,0.67 1.5,1.5S9.83,10 9,10s-1.5,-0.67 -1.5,-1.5S8.17,7 9,7zM16.04,13.81c1.16,0.84 1.96,1.96 1.96,3.44L18,19h4v-1.75c0,-2.02 -3.5,-3.17 -5.96,-3.44zM15,12c1.93,0 3.5,-1.57 3.5,-3.5S16.93,5 15,5c-0.54,0 -1.04,0.13 -1.5,0.35 0.63,0.89 1,1.98 1,3.15s-0.37,2.26 -1,3.15c0.46,0.22 0.96,0.35 1.5,0.35z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M9,13.75c-2.34,0 -7,1.17 -7,3.5L2,19h14v-1.75c0,-2.33 -4.66,-3.5 -7,-3.5zM4.34,17c0.84,-0.58 2.87,-1.25 4.66,-1.25s3.82,0.67 4.66,1.25L4.34,17zM9,12c1.93,0 3.5,-1.57 3.5,-3.5S10.93,5 9,5 5.5,6.57 5.5,8.5 7.07,12 9,12zM9,7c0.83,0 1.5,0.67 1.5,1.5S9.83,10 9,10s-1.5,-0.67 -1.5,-1.5S8.17,7 9,7zM16.04,13.81c1.16,0.84 1.96,1.96 1.96,3.44L18,19h4v-1.75c0,-2.02 -3.5,-3.17 -5.96,-3.44zM15,12c1.93,0 3.5,-1.57 3.5,-3.5S16.93,5 15,5c-0.54,0 -1.04,0.13 -1.5,0.35 0.63,0.89 1,1.98 1,3.15s-0.37,2.26 -1,3.15c0.46,0.22 0.96,0.35 1.5,0.35z"/>
</vector>

View file

@ -1,28 +1,49 @@
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:orientation="vertical">
<include android:id="@+id/toolbar"
layout="@layout/toolbar" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:layout_above="@id/bottom_navigation"
android:orientation="vertical">
<FrameLayout <include
android:id="@+id/main_fragment" android:id="@+id/toolbar"
android:layout_width="0dp" layout="@layout/toolbar" />
android:layout_height="match_parent"
android:layout_weight="1000"/>
<FrameLayout <LinearLayout
android:id="@+id/secondary_fragment" android:id="@+id/main_layout"
android:layout_width="0dp" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:layout_weight="1618"/>
<FrameLayout
android:id="@+id/main_fragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1000" />
<FrameLayout
android:id="@+id/secondary_fragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1618"
android:layout_marginBottom="70dp" />
</LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_bar_height"
android:layout_alignParentBottom="true"
android:background="?attr/color_background_secondary"
app:labelVisibilityMode="labeled"
app:menu="@menu/bottom_navigation_menu_chat"
android:visibility="gone" />
</RelativeLayout>
</layout> </layout>

View file

@ -27,19 +27,37 @@
~ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ~ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
~ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ~ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--> -->
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:orientation="vertical">
<include android:id="@+id/toolbar" <LinearLayout
layout="@layout/toolbar" />
<FrameLayout
android:id="@+id/main_fragment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent"
</LinearLayout> android:layout_above="@id/bottom_navigation"
android:orientation="vertical">
<include android:id="@+id/toolbar"
layout="@layout/toolbar" />
<FrameLayout
android:id="@+id/main_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_bar_height"
android:layout_alignParentBottom="true"
android:background="?attr/color_background_secondary"
app:labelVisibilityMode="labeled"
app:menu="@menu/bottom_navigation_menu_chat"
android:state_checked="true"
android:visibility="gone" />
</RelativeLayout>
</layout> </layout>

View file

@ -1,18 +1,36 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout
android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent" android:layout_width="match_parent"
android:background="?attr/color_background_primary" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto">
<include layout="@layout/toolbar" /> <LinearLayout
<ListView
android:id="@+id/account_list"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="fill_parent"
android:divider="@android:color/transparent" android:background="?attr/color_background_primary"
android:dividerHeight="0dp" > android:layout_above="@id/bottom_navigation"
</ListView> android:orientation="vertical">
</LinearLayout> <include layout="@layout/toolbar" />
<ListView
android:id="@+id/account_list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="@android:color/transparent"
android:dividerHeight="0dp" >
</ListView>
</LinearLayout>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_bar_height"
android:layout_alignParentBottom="true"
android:background="?attr/color_background_secondary"
app:labelVisibilityMode="labeled"
app:menu="@menu/bottom_navigation_menu_accounts" />
</RelativeLayout>

View file

@ -5,55 +5,69 @@
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<RelativeLayout
<include
android:id="@+id/toolbar"
layout="@layout/toolbar" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/toolbar"
android:background="?attr/colorPrimary"
android:elevation="@dimen/toolbar_elevation"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:tabGravity="fill"
app:tabIndicatorColor="@color/white87"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/white"
app:tabTextColor="@color/white70" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/start_conversation_view_pager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_below="@id/tab_layout" android:layout_above="@id/bottom_navigation">
android:background="?attr/color_background_primary">
<include
android:id="@+id/toolbar"
layout="@layout/toolbar" />
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/toolbar"
android:background="?attr/colorPrimary"
android:elevation="@dimen/toolbar_elevation"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:tabGravity="fill"
app:tabIndicatorColor="@color/white87"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/white"
app:tabTextColor="@color/white70" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/start_conversation_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/tab_layout"
android:background="?attr/color_background_primary">
</androidx.viewpager.widget.ViewPager> </androidx.viewpager.widget.ViewPager>
<com.leinardi.android.speeddial.SpeedDialOverlayLayout <com.leinardi.android.speeddial.SpeedDialOverlayLayout
android:id="@+id/overlay" android:id="@+id/overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/tab_layout"
android:background="?color_background_overlay" />
<com.leinardi.android.speeddial.SpeedDialView
android:id="@+id/speed_dial"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:contentDescription="@string/add_contact_or_create_or_join_group_chat"
app:backgroundTint="?colorPrimary"
app:sdMainFabClosedBackgroundColor="?colorPrimary"
app:sdMainFabClosedSrc="@drawable/ic_add_white_24dp"
app:sdMainFabOpenedBackgroundColor="?colorPrimaryDark"
app:sdOverlayLayout="@id/overlay"
app:sdUseReverseAnimationOnClose="true" />
</RelativeLayout>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="@dimen/nav_bar_height"
android:layout_below="@id/tab_layout"
android:background="?color_background_overlay" />
<com.leinardi.android.speeddial.SpeedDialView
android:id="@+id/speed_dial"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:contentDescription="@string/add_contact_or_create_or_join_group_chat" android:background="?attr/color_background_secondary"
app:backgroundTint="?colorPrimary" app:labelVisibilityMode="labeled"
app:sdMainFabClosedBackgroundColor="?colorPrimary" app:menu="@menu/bottom_navigation_menu_contacts" />
app:sdMainFabClosedSrc="@drawable/ic_add_white_24dp"
app:sdMainFabOpenedBackgroundColor="?colorPrimaryDark"
app:sdOverlayLayout="@id/overlay"
app:sdUseReverseAnimationOnClose="true" />
</RelativeLayout> </RelativeLayout>
</layout> </layout>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/chats"
android:icon="?attr/ic_chat_unselected"
android:title="@string/chats"/>
<item
android:id="@+id/contactslist"
android:icon="?attr/ic_group_unselected"
android:title="@string/contacts"/>
<item
android:id="@+id/manageaccounts"
android:icon="?attr/ic_accounts_selected"
android:title="@string/accounts"/>
</menu>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/chats"
android:icon="?attr/ic_chat_selected"
android:title="@string/chats"/>
<item
android:id="@+id/contactslist"
android:icon="?attr/ic_group_unselected"
android:title="@string/contacts"/>
<item
android:id="@+id/manageaccounts"
android:icon="?attr/ic_account"
android:title="@string/accounts"/>
</menu>

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/chats"
android:icon="?attr/ic_chat_unselected"
android:title="@string/chats"/>
<item
android:id="@+id/contactslist"
android:icon="?attr/ic_group_selected"
android:title="@string/contacts"/>
<item
android:id="@+id/manageaccounts"
android:icon="?attr/ic_account"
android:title="@string/accounts"/>
</menu>

View file

@ -124,6 +124,13 @@
<attr name="icon_notifications_none" format="reference" /> <attr name="icon_notifications_none" format="reference" />
<attr name="icon_pinned_on_top" format="reference" /> <attr name="icon_pinned_on_top" format="reference" />
<attr name="ic_chat_unselected" format="reference" />
<attr name="ic_chat_selected" format="reference" />
<attr name="ic_account" format="reference" />
<attr name="ic_accounts_selected" format="reference" />
<attr name="ic_group_unselected" format="reference" />
<attr name="ic_group_selected" format="reference" />
<attr name="dialog_horizontal_padding" format="dimension" /> <attr name="dialog_horizontal_padding" format="dimension" />
<attr name="dialog_vertical_padding" format="dimension" /> <attr name="dialog_vertical_padding" format="dimension" />

View file

@ -20,6 +20,7 @@
<integer name="auto_accept_filesize">524288</integer> <integer name="auto_accept_filesize">524288</integer>
<string name="picture_compression">auto</string> <string name="picture_compression">auto</string>
<bool name="use_green_background">true</bool> <bool name="use_green_background">true</bool>
<bool name="show_nav_bar">false</bool>
<string name="quick_action">recent</string> <string name="quick_action">recent</string>
<bool name="show_dynamic_tags">false</bool> <bool name="show_dynamic_tags">false</bool>
<bool name="group_by_tags">false</bool> <bool name="group_by_tags">false</bool>

View file

@ -56,6 +56,7 @@
<dimen name="bottom_filters_height_with_margin">98dp</dimen> <dimen name="bottom_filters_height_with_margin">98dp</dimen>
<dimen name="bottom_editor_actions_shadow_height">180dp</dimen> <dimen name="bottom_editor_actions_shadow_height">180dp</dimen>
<dimen name="full_brush_size">40dp</dimen> <dimen name="full_brush_size">40dp</dimen>
<dimen name="nav_bar_height">56dp</dimen>
<dimen name="one_dp">1dp</dimen> <dimen name="one_dp">1dp</dimen>
<dimen name="tiny_margin">2dp</dimen> <dimen name="tiny_margin">2dp</dimen>

View file

@ -597,6 +597,8 @@
<string name="pref_theme_automatic">Automatic</string> <string name="pref_theme_automatic">Automatic</string>
<string name="pref_theme_light">Light</string> <string name="pref_theme_light">Light</string>
<string name="pref_theme_dark">Dark</string> <string name="pref_theme_dark">Dark</string>
<string name="pref_show_navigation_bar">Show navigation bar</string>
<string name="pref_show_navigation_bar_summary">Use alternative navigation way via navigation bar on the bottom of the screen</string>
<string name="pref_use_green_background">Green Background</string> <string name="pref_use_green_background">Green Background</string>
<string name="pref_use_green_background_summary">Use green background for received messages</string> <string name="pref_use_green_background_summary">Use green background for received messages</string>
<string name="pref_always_show_full_timestamps">Show full timestamps</string> <string name="pref_always_show_full_timestamps">Show full timestamps</string>
@ -1086,4 +1088,6 @@
<string name="contact_tag_with_total">%1$s (%2$d)</string> <string name="contact_tag_with_total">%1$s (%2$d)</string>
<string name="refresh_feature_discovery">Refresh Feature Discovery</string> <string name="refresh_feature_discovery">Refresh Feature Discovery</string>
<string name="retract_message_alert_title">Do you really want to retract this message?</string> <string name="retract_message_alert_title">Do you really want to retract this message?</string>
<string name="chats">Chats</string>
<string name="accounts">Accounts</string>
</resources> </resources>

View file

@ -143,6 +143,13 @@
<item name="icon_copy_bar" type="reference">@drawable/ic_content_copy_white_24dp</item> <item name="icon_copy_bar" type="reference">@drawable/ic_content_copy_white_24dp</item>
<item name="icon_copy_bar_small" type="reference">@drawable/content_copy_12dp</item> <item name="icon_copy_bar_small" type="reference">@drawable/content_copy_12dp</item>
<item name="ic_chat_unselected" type="reference">@drawable/outline_chat_black_24</item>
<item name="ic_chat_selected" type="reference">@drawable/chat_selected_black_24</item>
<item name="ic_account" type="reference">@drawable/ic_account_black_24dp</item>
<item name="ic_accounts_selected" type="reference">@drawable/accounts_selected_black_24</item>
<item name="ic_group_unselected" type="reference">@drawable/outline_group_black_24dp</item>
<item name="ic_group_selected" type="reference">@drawable/ic_group_selected_black_24</item>
<item name="icon_notifications" type="reference">@drawable/ic_notifications_black_24dp <item name="icon_notifications" type="reference">@drawable/ic_notifications_black_24dp
</item> </item>
<item name="icon_notifications_off" type="reference"> <item name="icon_notifications_off" type="reference">
@ -310,6 +317,13 @@
<item name="icon_copy_bar" type="reference">@drawable/ic_content_copy_white_24dp</item> <item name="icon_copy_bar" type="reference">@drawable/ic_content_copy_white_24dp</item>
<item name="icon_copy_bar_small" type="reference">@drawable/content_copy_12dp_white</item> <item name="icon_copy_bar_small" type="reference">@drawable/content_copy_12dp_white</item>
<item name="ic_chat_unselected" type="reference">@drawable/outline_chat_white_24</item>
<item name="ic_chat_selected" type="reference">@drawable/chat_selected_white_24</item>
<item name="ic_account" type="reference">@drawable/ic_account_white_24dp</item>
<item name="ic_accounts_selected" type="reference">@drawable/accounts_selected_white_24</item>
<item name="ic_group_unselected" type="reference">@drawable/outline_group_white_24</item>
<item name="ic_group_selected" type="reference">@drawable/ic_group_selected_white_24</item>
<item name="icon_notifications" type="reference">@drawable/ic_notifications_white_24dp <item name="icon_notifications" type="reference">@drawable/ic_notifications_white_24dp
</item> </item>
<item name="icon_notifications_off" type="reference"> <item name="icon_notifications_off" type="reference">

View file

@ -178,6 +178,11 @@
android:title="@string/pref_accept_all_files_if_wifi" /> android:title="@string/pref_accept_all_files_if_wifi" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory android:title="@string/pref_ui_options"> <PreferenceCategory android:title="@string/pref_ui_options">
<CheckBoxPreference
android:defaultValue="@bool/show_nav_bar"
android:key="show_nav_bar"
android:summary="@string/pref_show_navigation_bar_summary"
android:title="@string/pref_show_navigation_bar" />
<CheckBoxPreference <CheckBoxPreference
android:defaultValue="@bool/use_green_background" android:defaultValue="@bool/use_green_background"
android:key="use_green_background" android:key="use_green_background"