From 685f1fdb7b9398f8818172b56563650e29530824 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Mon, 15 Feb 2016 02:07:24 +0100 Subject: [PATCH] Re-Added the certificate dialog --- .../de/kuschku/libquassel/BusProvider.java | 5 +- .../de/kuschku/libquassel/CoreConnection.java | 2 +- .../de/kuschku/libquassel/QuasselClient.java | 2 +- .../events/ConnectionChangeEvent.java | 4 +- .../events/UnknownCertificateEvent.java | 2 +- .../libquassel/ssl/CertificateManager.java | 2 +- .../libquassel/ssl/QuasselTrustManager.java | 2 +- .../ssl/UnknownCertificateException.java | 2 +- .../service/ClientBackgroundThread.java | 8 +- .../service/QuasselService.java | 2 +- .../quasseldroid_ng/ui/chat/MainActivity.java | 40 +++++-- .../quasseldroid_ng/ui/chat/Settings.java | 6 +- .../ui/chat/fragment/ChatFragment.java | 16 +-- .../ui/chat/fragment/LoadingFragment.java | 28 ++--- .../quasseldroid_ng/ui/setup/AccountItem.java | 62 ++++++----- .../ui/setup/AccountSetupActivity.java | 55 +++++---- .../ui/setup/CreateAccountItem.java | 38 +++---- .../ui/setup/slides/AccountSelectSlide.java | 22 ++-- .../quasseldroid_ng/ui/theme/ThemeUtil.java | 39 +++++++ .../MeaningfulConnectionErrorProvider.java | 42 +++++++ .../util/accounts/Account.java | 4 +- .../util/accounts/AccountManager.java | 2 +- .../util/accounts/AccountManagerHelper.java | 2 +- .../util/{ => accounts}/ServerAddress.java | 2 +- .../buffermetadata/BufferMetaDataHelper.java | 104 ++++++++++++++++++ .../SQLiteCertificateManager.java | 2 +- .../util/niohelpers/WrappedChannel.java | 2 +- .../AbstractPreferenceElement.java | 2 +- .../util/preferences/BooleanPreference.java | 2 +- .../util/preferences/FloatPreference.java | 2 +- .../util/preferences/IntPreference.java | 2 +- .../util/preferences/LongPreference.java | 2 +- .../util/preferences/OnChangeListener.java | 2 +- .../util/preferences/PreferenceElement.java | 2 +- .../util/preferences/StringPreference.java | 2 +- .../servicebound}/BoundActivity.java | 4 +- .../servicebound}/BoundFragment.java | 4 +- .../layout-sw600dp-land/activity_setup.xml | 11 +- .../res/layout-sw600dp/activity_setup.xml | 11 +- app/src/main/res/layout/activity_setup.xml | 11 +- app/src/main/res/layout/fragment_loading.xml | 25 ++--- .../main/res/layout/widget_core_account.xml | 63 ++++------- .../res/layout/widget_core_account_add.xml | 6 +- app/src/main/res/layout/widget_editor.xml | 1 + app/src/main/res/values-v21/styles.xml | 27 ----- app/src/main/res/values/attrs.xml | 4 + app/src/main/res/values/strings.xml | 8 ++ app/src/main/res/values/styles.xml | 15 ++- 48 files changed, 451 insertions(+), 252 deletions(-) create mode 100644 app/src/main/java/de/kuschku/util/MeaningfulConnectionErrorProvider.java rename app/src/main/java/de/kuschku/{quasseldroid_ng => }/util/accounts/Account.java (95%) rename app/src/main/java/de/kuschku/{quasseldroid_ng => }/util/accounts/AccountManager.java (97%) rename app/src/main/java/de/kuschku/{quasseldroid_ng => }/util/accounts/AccountManagerHelper.java (99%) rename app/src/main/java/de/kuschku/util/{ => accounts}/ServerAddress.java (97%) create mode 100644 app/src/main/java/de/kuschku/util/buffermetadata/BufferMetaDataHelper.java rename app/src/main/java/de/kuschku/{quasseldroid_ng => }/util/preferences/AbstractPreferenceElement.java (97%) rename app/src/main/java/de/kuschku/{quasseldroid_ng => }/util/preferences/BooleanPreference.java (96%) rename app/src/main/java/de/kuschku/{quasseldroid_ng => }/util/preferences/FloatPreference.java (96%) rename app/src/main/java/de/kuschku/{quasseldroid_ng => }/util/preferences/IntPreference.java (96%) rename app/src/main/java/de/kuschku/{quasseldroid_ng => }/util/preferences/LongPreference.java (96%) rename app/src/main/java/de/kuschku/{quasseldroid_ng => }/util/preferences/OnChangeListener.java (94%) rename app/src/main/java/de/kuschku/{quasseldroid_ng => }/util/preferences/PreferenceElement.java (95%) rename app/src/main/java/de/kuschku/{quasseldroid_ng => }/util/preferences/StringPreference.java (96%) rename app/src/main/java/de/kuschku/{quasseldroid_ng/util => util/servicebound}/BoundActivity.java (97%) rename app/src/main/java/de/kuschku/{quasseldroid_ng/util => util/servicebound}/BoundFragment.java (97%) delete mode 100644 app/src/main/res/values-v21/styles.xml diff --git a/app/src/main/java/de/kuschku/libquassel/BusProvider.java b/app/src/main/java/de/kuschku/libquassel/BusProvider.java index 47fc9be9e..f43061823 100644 --- a/app/src/main/java/de/kuschku/libquassel/BusProvider.java +++ b/app/src/main/java/de/kuschku/libquassel/BusProvider.java @@ -28,7 +28,9 @@ import java.util.UUID; import de.greenrobot.event.EventBus; import de.greenrobot.event.NoSubscriberEvent; +import de.kuschku.libquassel.events.BacklogReceivedEvent; import de.kuschku.libquassel.events.GeneralErrorEvent; +import de.kuschku.libquassel.events.LagChangedEvent; public class BusProvider { @NonNull @@ -89,7 +91,8 @@ public class BusProvider { } public void onEvent(NoSubscriberEvent event) { - Log.e(identifier, String.valueOf(event)); + if (!(event.originalEvent instanceof LagChangedEvent) && !(event.originalEvent instanceof BacklogReceivedEvent)) + Log.e(identifier, String.valueOf(event)); } } } diff --git a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java b/app/src/main/java/de/kuschku/libquassel/CoreConnection.java index 291e2a4d9..dbf6a154d 100644 --- a/app/src/main/java/de/kuschku/libquassel/CoreConnection.java +++ b/app/src/main/java/de/kuschku/libquassel/CoreConnection.java @@ -54,7 +54,7 @@ import de.kuschku.libquassel.protocols.LegacyPeer; import de.kuschku.libquassel.protocols.RemotePeer; import de.kuschku.libquassel.ssl.CertificateManager; import de.kuschku.libquassel.ssl.UnknownCertificateException; -import de.kuschku.util.ServerAddress; +import de.kuschku.util.accounts.ServerAddress; import de.kuschku.util.niohelpers.WrappedChannel; import static de.kuschku.libquassel.primitives.QMetaType.Type.UInt; diff --git a/app/src/main/java/de/kuschku/libquassel/QuasselClient.java b/app/src/main/java/de/kuschku/libquassel/QuasselClient.java index 31be8d48a..4bb6059b7 100644 --- a/app/src/main/java/de/kuschku/libquassel/QuasselClient.java +++ b/app/src/main/java/de/kuschku/libquassel/QuasselClient.java @@ -27,7 +27,7 @@ import de.kuschku.libquassel.client.Client; import de.kuschku.libquassel.client.ClientData; import de.kuschku.libquassel.localtypes.backlogstorage.BacklogStorage; import de.kuschku.libquassel.ssl.CertificateManager; -import de.kuschku.util.ServerAddress; +import de.kuschku.util.accounts.ServerAddress; import static de.kuschku.util.AndroidAssert.assertNotNull; diff --git a/app/src/main/java/de/kuschku/libquassel/events/ConnectionChangeEvent.java b/app/src/main/java/de/kuschku/libquassel/events/ConnectionChangeEvent.java index 787c005af..7e556380f 100644 --- a/app/src/main/java/de/kuschku/libquassel/events/ConnectionChangeEvent.java +++ b/app/src/main/java/de/kuschku/libquassel/events/ConnectionChangeEvent.java @@ -49,10 +49,10 @@ public class ConnectionChangeEvent { } public enum Status { + DISCONNECTED, HANDSHAKE, INITIALIZING_DATA, LOADING_BACKLOG, - CONNECTED, - DISCONNECTED + CONNECTED } } diff --git a/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java b/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java index 423760553..04d9b2bc6 100644 --- a/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java +++ b/app/src/main/java/de/kuschku/libquassel/events/UnknownCertificateEvent.java @@ -26,7 +26,7 @@ import android.support.annotation.NonNull; import java.security.cert.X509Certificate; import de.kuschku.libquassel.ssl.UnknownCertificateException; -import de.kuschku.util.ServerAddress; +import de.kuschku.util.accounts.ServerAddress; public class UnknownCertificateEvent { public final X509Certificate certificate; diff --git a/app/src/main/java/de/kuschku/libquassel/ssl/CertificateManager.java b/app/src/main/java/de/kuschku/libquassel/ssl/CertificateManager.java index 12bac3522..08d24dfe1 100644 --- a/app/src/main/java/de/kuschku/libquassel/ssl/CertificateManager.java +++ b/app/src/main/java/de/kuschku/libquassel/ssl/CertificateManager.java @@ -28,7 +28,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; -import de.kuschku.util.ServerAddress; +import de.kuschku.util.accounts.ServerAddress; public interface CertificateManager { boolean isTrusted(X509Certificate certificate, ServerAddress core); diff --git a/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java b/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java index 7cb601ff4..461d2c5eb 100644 --- a/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java +++ b/app/src/main/java/de/kuschku/libquassel/ssl/QuasselTrustManager.java @@ -33,7 +33,7 @@ import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.X509TrustManager; -import de.kuschku.util.ServerAddress; +import de.kuschku.util.accounts.ServerAddress; import de.kuschku.util.certificates.CertificateUtils; public class QuasselTrustManager implements X509TrustManager { diff --git a/app/src/main/java/de/kuschku/libquassel/ssl/UnknownCertificateException.java b/app/src/main/java/de/kuschku/libquassel/ssl/UnknownCertificateException.java index de46dcce8..0ef702f9b 100644 --- a/app/src/main/java/de/kuschku/libquassel/ssl/UnknownCertificateException.java +++ b/app/src/main/java/de/kuschku/libquassel/ssl/UnknownCertificateException.java @@ -24,7 +24,7 @@ package de.kuschku.libquassel.ssl; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; -import de.kuschku.util.ServerAddress; +import de.kuschku.util.accounts.ServerAddress; public class UnknownCertificateException extends CertificateException { public final X509Certificate certificate; diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java b/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java index 3c31c7f83..7beba23f4 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java @@ -30,15 +30,16 @@ import de.kuschku.libquassel.BusProvider; import de.kuschku.libquassel.QuasselClient; import de.kuschku.libquassel.client.ClientData; import de.kuschku.libquassel.client.FeatureFlags; +import de.kuschku.libquassel.events.ConnectionChangeEvent; import de.kuschku.libquassel.events.GeneralErrorEvent; import de.kuschku.libquassel.events.LoginRequireEvent; import de.kuschku.libquassel.localtypes.backlogstorage.MemoryBacklogStorage; import de.kuschku.libquassel.protocols.RemotePeer; import de.kuschku.quasseldroid_ng.ui.chat.Settings; -import de.kuschku.quasseldroid_ng.util.accounts.Account; -import de.kuschku.quasseldroid_ng.util.accounts.AccountManager; import de.kuschku.util.CompatibilityUtils; -import de.kuschku.util.ServerAddress; +import de.kuschku.util.accounts.Account; +import de.kuschku.util.accounts.AccountManager; +import de.kuschku.util.accounts.ServerAddress; import de.kuschku.util.certificates.SQLiteCertificateManager; public class ClientBackgroundThread implements Runnable { @@ -81,6 +82,7 @@ public class ClientBackgroundThread implements Runnable { client.connection.open(CompatibilityUtils.deviceSupportsKeepAlive()); } catch (IOException e) { client.provider.sendEvent(new GeneralErrorEvent(e)); + client.client.setConnectionStatus(ConnectionChangeEvent.Status.DISCONNECTED); } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java index 4e2df1296..1ba3d35b2 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.java @@ -32,7 +32,7 @@ import java.util.HashSet; import java.util.Set; import de.kuschku.libquassel.BusProvider; -import de.kuschku.util.ServerAddress; +import de.kuschku.util.accounts.ServerAddress; import de.kuschku.util.backports.Consumer; public class QuasselService extends Service { diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java index a7fa4797f..a423cbd93 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java @@ -23,6 +23,7 @@ package de.kuschku.quasseldroid_ng.ui.chat; import android.os.Bundle; import android.support.annotation.IntRange; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; @@ -50,6 +51,7 @@ import de.kuschku.libquassel.client.Client; import de.kuschku.libquassel.events.ConnectionChangeEvent; import de.kuschku.libquassel.events.GeneralErrorEvent; import de.kuschku.libquassel.events.LoginRequireEvent; +import de.kuschku.libquassel.events.UnknownCertificateEvent; import de.kuschku.libquassel.localtypes.BacklogFilter; import de.kuschku.libquassel.message.Message; import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig; @@ -64,9 +66,11 @@ import de.kuschku.quasseldroid_ng.ui.chat.fragment.LoadingFragment; import de.kuschku.quasseldroid_ng.ui.chat.util.ActivityImplFactory; import de.kuschku.quasseldroid_ng.ui.chat.util.ILayoutHelper; import de.kuschku.quasseldroid_ng.ui.chat.util.Status; -import de.kuschku.quasseldroid_ng.util.BoundActivity; -import de.kuschku.quasseldroid_ng.util.accounts.Account; -import de.kuschku.quasseldroid_ng.util.accounts.AccountManager; +import de.kuschku.util.accounts.Account; +import de.kuschku.util.accounts.AccountManager; +import de.kuschku.util.certificates.CertificateUtils; +import de.kuschku.util.certificates.SQLiteCertificateManager; +import de.kuschku.util.servicebound.BoundActivity; import static de.kuschku.util.AndroidAssert.assertNotNull; @@ -180,15 +184,19 @@ public class MainActivity extends BoundActivity { displayFilterDialog(); return true; case R.id.action_reauth: - context.settings().lastAccount.set(""); - stopConnection(); - finish(); + reauth(); return true; default: return super.onOptionsItemSelected(item); } } + private void reauth() { + context.settings().lastAccount.set(""); + stopConnection(); + finish(); + } + private AccountHeader buildAccountHeader() { return new AccountHeaderBuilder() .withActivity(this) @@ -211,12 +219,13 @@ public class MainActivity extends BoundActivity { replaceFragment(new ChatFragment()); updateBufferViewConfigs(); } else if (status == ConnectionChangeEvent.Status.DISCONNECTED) { - finish(); + Toast.makeText(getApplication(), context.themeUtil().translations.statusDisconnected, Toast.LENGTH_LONG).show(); + reauth(); } } public void onEventMainThread(GeneralErrorEvent event) { - Toast.makeText(this, event.exception.getClass().getSimpleName() + ": " + event.debugInfo, Toast.LENGTH_LONG).show(); + Toast.makeText(getApplication(), event.exception.getClass().getSimpleName() + ": " + event.debugInfo, Toast.LENGTH_LONG).show(); } private void selectBufferViewConfig(@IntRange(from = -1) int bufferViewConfigId) { @@ -319,11 +328,26 @@ public class MainActivity extends BoundActivity { } backlogFilter.setFilters(filters); }) + .negativeColor(context.themeUtil().res.colorForeground) .build() .show(); } } + public void onEventMainThread(@NonNull UnknownCertificateEvent event) { + new MaterialDialog.Builder(this) + .content(context.themeUtil().translations.warningCertificate + "\n" + CertificateUtils.certificateToFingerprint(event.certificate, "")) + .title("Unknown Certificate") + .onPositive((dialog, which) -> { + new SQLiteCertificateManager(this).addCertificate(event.certificate, event.address); + }) + .negativeColor(context.themeUtil().res.colorForeground) + .positiveText("Yes") + .negativeText("No") + .build() + .show(); + } + public void onEventMainThread(LoginRequireEvent event) { if (event.failedLast) { new MaterialDialog.Builder(this) diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/Settings.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/Settings.java index 27d9b66ac..304d2a760 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/Settings.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/Settings.java @@ -24,10 +24,10 @@ package de.kuschku.quasseldroid_ng.ui.chat; import android.content.Context; import android.content.SharedPreferences; -import de.kuschku.quasseldroid_ng.util.preferences.BooleanPreference; -import de.kuschku.quasseldroid_ng.util.preferences.IntPreference; -import de.kuschku.quasseldroid_ng.util.preferences.StringPreference; import de.kuschku.util.backports.Objects; +import de.kuschku.util.preferences.BooleanPreference; +import de.kuschku.util.preferences.IntPreference; +import de.kuschku.util.preferences.StringPreference; public class Settings { public final StringPreference lastAccount; diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java index f51e95b47..54baafec7 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java @@ -44,9 +44,9 @@ import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager; import de.kuschku.quasseldroid_ng.R; import de.kuschku.quasseldroid_ng.ui.chat.chatview.MessageAdapter; import de.kuschku.quasseldroid_ng.ui.chat.util.SlidingPanelHandler; -import de.kuschku.quasseldroid_ng.util.BoundFragment; import de.kuschku.util.observables.AutoScroller; import de.kuschku.util.observables.lists.ObservableComparableSortedList; +import de.kuschku.util.servicebound.BoundFragment; import static de.kuschku.util.AndroidAssert.assertNotNull; @@ -103,12 +103,14 @@ public class ChatFragment extends BoundFragment { messageAdapter.setMessageList(messageList); swipeView.setEnabled(id != -1); - int markerLine = client.bufferSyncer().markerLine(id); - for (int i = 0; i < messageList.size(); i++) { - if (messageList.get(i).messageId == markerLine) { - Log.d("DEBUG", "Load: " + markerLine + ":" + i); - messages.scrollToPosition(i); - break; + // Load markerline + if (client.bufferSyncer() != null) { + int markerLine = client.bufferSyncer().markerLine(id); + for (int i = 0; i < messageList.size(); i++) { + if (messageList.get(i).messageId == markerLine) { + messages.scrollToPosition(i); + break; + } } } } else { diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/LoadingFragment.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/LoadingFragment.java index d88b873c3..8d106bf60 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/LoadingFragment.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/LoadingFragment.java @@ -23,27 +23,21 @@ package de.kuschku.quasseldroid_ng.ui.chat.fragment; import android.os.Bundle; import android.support.annotation.Nullable; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import android.widget.TextView; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; +import java.util.Locale; import butterknife.Bind; import butterknife.ButterKnife; import de.kuschku.libquassel.events.BacklogInitEvent; import de.kuschku.libquassel.events.ConnectionChangeEvent; import de.kuschku.libquassel.events.InitEvent; -import de.kuschku.libquassel.primitives.types.BufferInfo; import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.util.BoundFragment; - -import static de.kuschku.util.AndroidAssert.assertNotNull; +import de.kuschku.util.servicebound.BoundFragment; public class LoadingFragment extends BoundFragment { @Bind(R.id.progressBar) @@ -62,17 +56,21 @@ public class LoadingFragment extends BoundFragment { ButterKnife.bind(this, view); - label.setText("Connecting"); - count.setText(""); + label.setText(context.themeUtil().translations.statusConnecting); + showProgressState(1); return view; } + public void showProgressState(int position) { + count.setText(String.format(Locale.US, "%d/%d", position, 5)); + } + public void onEventMainThread(ConnectionChangeEvent event) { progressBar.setIndeterminate(true); - label.setText(event.status.name()); - count.setText(""); + label.setText(context.themeUtil().statusName(event.status)); + showProgressState(event.status.ordinal() + 1); } public void onEventMainThread(InitEvent event) { @@ -81,8 +79,7 @@ public class LoadingFragment extends BoundFragment { progressBar.setMax(event.max); progressBar.setProgress(event.loaded); - label.setText(event.getClass().getSimpleName()); - count.setText(String.format("%d/%d", event.loaded, event.max)); + label.setText(context.themeUtil().translations.statusInitData); } } @@ -92,8 +89,7 @@ public class LoadingFragment extends BoundFragment { progressBar.setMax(event.max); progressBar.setProgress(event.loaded); - label.setText(event.getClass().getSimpleName()); - count.setText(String.format("%d/%d", event.loaded, event.max)); + label.setText(context.themeUtil().translations.statusBacklog); } } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountItem.java index 2be3d7ecf..9e26fdac6 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountItem.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountItem.java @@ -24,6 +24,7 @@ package de.kuschku.quasseldroid_ng.ui.setup; import android.content.Context; import android.content.res.ColorStateList; import android.support.annotation.ColorInt; +import android.support.v7.widget.AppCompatImageButton; import android.support.v7.widget.AppCompatRadioButton; import android.support.v7.widget.RecyclerView; import android.util.Pair; @@ -35,10 +36,12 @@ import com.mikepenz.materialdrawer.model.AbstractDrawerItem; import com.mikepenz.materialdrawer.util.DrawerUIUtils; import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.util.accounts.Account; +import de.kuschku.util.accounts.Account; public class AccountItem extends AbstractDrawerItem<AccountItem, AccountItem.ViewHolder> { public final Account account; + protected Pair<Integer, ColorStateList> colorStateList; + private OnDeleteListener listener; public AccountItem(Account account) { this.account = account; @@ -84,6 +87,8 @@ public class AccountItem extends AbstractDrawerItem<AccountItem, AccountItem.Vie viewHolder.description.setTextColor(getTextColorStateList(color, selectedTextColor)); + viewHolder.delete.setOnClickListener(view -> listener.onDelete(this)); + //for android API 17 --> Padding not applied via xml DrawerUIUtils.setDrawerVerticalPadding(viewHolder.view); @@ -96,28 +101,6 @@ public class AccountItem extends AbstractDrawerItem<AccountItem, AccountItem.Vie return new ItemFactory(); } - public static class ItemFactory implements ViewHolderFactory<ViewHolder> { - public ViewHolder create(View v) { - return new ViewHolder(v); - } - } - - protected static class ViewHolder extends RecyclerView.ViewHolder { - private View view; - private AppCompatRadioButton select; - private TextView name; - private TextView description; - - private ViewHolder(View view) { - super(view); - this.view = view; - this.select = (AppCompatRadioButton) view.findViewById(R.id.account_select); - this.name = (TextView) view.findViewById(R.id.account_name); - this.description = (TextView) view.findViewById(R.id.account_description); - } - } - - /** * helper method to decide for the correct color * @@ -144,8 +127,6 @@ public class AccountItem extends AbstractDrawerItem<AccountItem, AccountItem.Vie return com.mikepenz.materialdrawer.R.color.material_drawer_selected_text; } - protected Pair<Integer, ColorStateList> colorStateList; - /** * helper to get the ColorStateList for the text and remembering it so we do not have to recreate it all the time * @@ -160,4 +141,35 @@ public class AccountItem extends AbstractDrawerItem<AccountItem, AccountItem.Vie return colorStateList.second; } + + public void setOnDeleteListener(OnDeleteListener listener) { + this.listener = listener; + } + + public interface OnDeleteListener { + void onDelete(AccountItem item); + } + + public static class ItemFactory implements ViewHolderFactory<ViewHolder> { + public ViewHolder create(View v) { + return new ViewHolder(v); + } + } + + protected static class ViewHolder extends RecyclerView.ViewHolder { + private View view; + private AppCompatRadioButton select; + private TextView name; + private TextView description; + private AppCompatImageButton delete; + + private ViewHolder(View view) { + super(view); + this.view = view; + this.select = (AppCompatRadioButton) view.findViewById(R.id.account_select); + this.name = (TextView) view.findViewById(R.id.account_name); + this.description = (TextView) view.findViewById(R.id.account_description); + this.delete = (AppCompatImageButton) view.findViewById(R.id.account_delete); + } + } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSetupActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSetupActivity.java index f424544ba..c3919a788 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSetupActivity.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/AccountSetupActivity.java @@ -42,44 +42,18 @@ import de.kuschku.quasseldroid_ng.ui.setup.slides.AccountSetupCoreSlide; import de.kuschku.quasseldroid_ng.ui.setup.slides.AccountSetupNameSlide; import de.kuschku.quasseldroid_ng.ui.setup.slides.AccountSetupUserSlide; import de.kuschku.quasseldroid_ng.ui.setup.slides.SlideFragment; -import de.kuschku.quasseldroid_ng.util.accounts.Account; -import de.kuschku.quasseldroid_ng.util.accounts.AccountManager; +import de.kuschku.util.accounts.Account; +import de.kuschku.util.accounts.AccountManager; public class AccountSetupActivity extends AppCompatActivity implements ValidUpdateCallback { - private SlidePagerAdapter slidePagerAdapter; - @Bind(R.id.view_pager) ViewPager viewPager; - @Bind(R.id.btn) FloatingActionButton btn; - + private SlidePagerAdapter slidePagerAdapter; private int lastValidPage = -1; - private class SlidePagerAdapter extends FragmentPagerAdapter { - List<SlideFragment> list = new ArrayList<>(); - - public SlidePagerAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public SlideFragment getItem(int position) { - return list.get(position); - } - - @Override - public int getCount() { - return Math.min(lastValidPage + 2, list.size()); - } - - public void addFragment(SlideFragment fragment) { - list.add(fragment); - notifyDataSetChanged(); - } - } - @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -169,4 +143,27 @@ public class AccountSetupActivity extends AppCompatActivity implements ValidUpda } slidePagerAdapter.notifyDataSetChanged(); } + + private class SlidePagerAdapter extends FragmentPagerAdapter { + List<SlideFragment> list = new ArrayList<>(); + + public SlidePagerAdapter(FragmentManager fm) { + super(fm); + } + + @Override + public SlideFragment getItem(int position) { + return list.get(position); + } + + @Override + public int getCount() { + return Math.min(lastValidPage + 2, list.size()); + } + + public void addFragment(SlideFragment fragment) { + list.add(fragment); + notifyDataSetChanged(); + } + } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CreateAccountItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CreateAccountItem.java index 550abdb3d..9d1f05e82 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CreateAccountItem.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/CreateAccountItem.java @@ -24,20 +24,19 @@ package de.kuschku.quasseldroid_ng.ui.setup; import android.content.Context; import android.content.res.ColorStateList; import android.support.annotation.ColorInt; -import android.support.v7.widget.AppCompatRadioButton; import android.support.v7.widget.RecyclerView; import android.util.Pair; import android.view.View; -import android.widget.TextView; import com.mikepenz.fastadapter.utils.ViewHolderFactory; import com.mikepenz.materialdrawer.model.AbstractDrawerItem; import com.mikepenz.materialdrawer.util.DrawerUIUtils; import de.kuschku.quasseldroid_ng.R; -import de.kuschku.quasseldroid_ng.util.accounts.Account; public class CreateAccountItem extends AbstractDrawerItem<CreateAccountItem, CreateAccountItem.ViewHolder> { + protected Pair<Integer, ColorStateList> colorStateList; + @Override public int getType() { return R.id.item_create_account; @@ -68,22 +67,6 @@ public class CreateAccountItem extends AbstractDrawerItem<CreateAccountItem, Cre return new ItemFactory(); } - public static class ItemFactory implements ViewHolderFactory<ViewHolder> { - public ViewHolder create(View v) { - return new ViewHolder(v); - } - } - - protected static class ViewHolder extends RecyclerView.ViewHolder { - private View view; - - private ViewHolder(View view) { - super(view); - this.view = view; - } - } - - /** * helper method to decide for the correct color * @@ -110,8 +93,6 @@ public class CreateAccountItem extends AbstractDrawerItem<CreateAccountItem, Cre return com.mikepenz.materialdrawer.R.color.material_drawer_selected_text; } - protected Pair<Integer, ColorStateList> colorStateList; - /** * helper to get the ColorStateList for the text and remembering it so we do not have to recreate it all the time * @@ -126,4 +107,19 @@ public class CreateAccountItem extends AbstractDrawerItem<CreateAccountItem, Cre return colorStateList.second; } + + public static class ItemFactory implements ViewHolderFactory<ViewHolder> { + public ViewHolder create(View v) { + return new ViewHolder(v); + } + } + + protected static class ViewHolder extends RecyclerView.ViewHolder { + private View view; + + private ViewHolder(View view) { + super(view); + this.view = view; + } + } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSelectSlide.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSelectSlide.java index 68947dc15..a786c0588 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSelectSlide.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/AccountSelectSlide.java @@ -43,12 +43,12 @@ import de.kuschku.quasseldroid_ng.R; import de.kuschku.quasseldroid_ng.ui.setup.AccountItem; import de.kuschku.quasseldroid_ng.ui.setup.AccountSetupActivity; import de.kuschku.quasseldroid_ng.ui.setup.CreateAccountItem; -import de.kuschku.quasseldroid_ng.util.accounts.Account; -import de.kuschku.quasseldroid_ng.util.accounts.AccountManager; +import de.kuschku.util.accounts.Account; +import de.kuschku.util.accounts.AccountManager; import de.kuschku.util.backports.Optional; import de.kuschku.util.backports.Optionals; -public class AccountSelectSlide extends SlideFragment { +public class AccountSelectSlide extends SlideFragment implements AccountItem.OnDeleteListener { private ItemAdapter<IItem> itemAdapter; private FastAdapter<IItem> fastAdapter; private AccountManager manager; @@ -85,7 +85,7 @@ public class AccountSelectSlide extends SlideFragment { itemAdapter.wrap(fastAdapter); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setItemAnimator(new DefaultItemAnimator()); - updateContent(true); + updateContent(); recyclerView.setAdapter(fastAdapter); fastAdapter.withSelectWithItemUpdate(true); @@ -117,17 +117,19 @@ public class AccountSelectSlide extends SlideFragment { super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { - updateContent(false); + updateContent(); } else if (fastAdapter.getItemCount() == 0) { getActivity().finish(); } } - private void updateContent(boolean autoCreate) { + private void updateContent() { itemAdapter.clear(); Set<Account> accounts = manager.accounts(); for (Account account : accounts) { - itemAdapter.add(new AccountItem(account)); + AccountItem accountItem = new AccountItem(account); + accountItem.setOnDeleteListener(this); + itemAdapter.add(accountItem); } itemAdapter.add(new CreateAccountItem()); @@ -145,4 +147,10 @@ public class AccountSelectSlide extends SlideFragment { protected int getDescription() { return R.string.slideAccountselectDescription; } + + @Override + public void onDelete(AccountItem item) { + manager.remove(item.account); + updateContent(); + } } diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java index 32b44f69a..b2f73236c 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java +++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/theme/ThemeUtil.java @@ -28,6 +28,7 @@ import android.support.annotation.Nullable; import android.support.annotation.UiThread; import android.support.v7.view.ContextThemeWrapper; +import de.kuschku.libquassel.events.ConnectionChangeEvent; import de.kuschku.quasseldroid_ng.R; import de.kuschku.util.annotationbind.AutoBinder; import de.kuschku.util.annotationbind.AutoColor; @@ -64,6 +65,22 @@ public class ThemeUtil { } } + public String statusName(ConnectionChangeEvent.Status status) { + switch (status) { + case HANDSHAKE: + return translations.statusHandshake; + case INITIALIZING_DATA: + return translations.statusInitData; + case LOADING_BACKLOG: + return translations.statusBacklog; + case CONNECTED: + return translations.statusWelcome; + case DISCONNECTED: + default: + return translations.statusDisconnected; + } + } + public static class FormatStrings { @AutoString(R.string.usernameHostmask) public String usernameHostmask; @@ -112,9 +129,31 @@ public class ThemeUtil { @AutoString(R.string.labelStatusBuffer) public String titleStatusBuffer; + @AutoString(R.string.warningCertificate) public String warningCertificate; + @AutoString(R.string.statusConnecting) + public String statusConnecting; + + @AutoString(R.string.statusHandshake) + public String statusHandshake; + + @AutoString(R.string.statusInitData) + public String statusInitData; + + @AutoString(R.string.statusBacklog) + public String statusBacklog; + + @AutoString(R.string.statusConnected) + public String statusConnected; + + @AutoString(R.string.statusDisconnected) + public String statusDisconnected; + + @AutoString(R.string.statusWelcome) + public String statusWelcome; + @NonNull public CharSequence formatUsername(@NonNull CharSequence nick, @NonNull CharSequence hostmask) { return SpanFormatter.format(usernameHostmask, nick, hostmask); diff --git a/app/src/main/java/de/kuschku/util/MeaningfulConnectionErrorProvider.java b/app/src/main/java/de/kuschku/util/MeaningfulConnectionErrorProvider.java new file mode 100644 index 000000000..2d0cfdc03 --- /dev/null +++ b/app/src/main/java/de/kuschku/util/MeaningfulConnectionErrorProvider.java @@ -0,0 +1,42 @@ +/* + * QuasselDroid - Quassel client for Android + * Copyright (C) 2016 Janne Koschinski + * Copyright (C) 2016 Ken Børge Viktil + * Copyright (C) 2016 Magnus Fjell + * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package de.kuschku.util; + +import java.net.ConnectException; + +import de.kuschku.quasseldroid_ng.ui.theme.AppContext; + +public class MeaningfulConnectionErrorProvider { + private final AppContext context; + + public MeaningfulConnectionErrorProvider(AppContext context) { + this.context = context; + } + + public String provide(Exception exception) { + return null; + } + + public String provide(ConnectException exception) { + return null; + } +} diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/accounts/Account.java b/app/src/main/java/de/kuschku/util/accounts/Account.java similarity index 95% rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/accounts/Account.java rename to app/src/main/java/de/kuschku/util/accounts/Account.java index 2c202b4b5..f43146389 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/accounts/Account.java +++ b/app/src/main/java/de/kuschku/util/accounts/Account.java @@ -19,12 +19,10 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid_ng.util.accounts; +package de.kuschku.util.accounts; import java.util.UUID; -import de.kuschku.util.ServerAddress; - public class Account { public final UUID id; diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/accounts/AccountManager.java b/app/src/main/java/de/kuschku/util/accounts/AccountManager.java similarity index 97% rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/accounts/AccountManager.java rename to app/src/main/java/de/kuschku/util/accounts/AccountManager.java index 0c1bd45d4..99d0a9c6d 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/accounts/AccountManager.java +++ b/app/src/main/java/de/kuschku/util/accounts/AccountManager.java @@ -19,7 +19,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid_ng.util.accounts; +package de.kuschku.util.accounts; import android.content.Context; diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/accounts/AccountManagerHelper.java b/app/src/main/java/de/kuschku/util/accounts/AccountManagerHelper.java similarity index 99% rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/accounts/AccountManagerHelper.java rename to app/src/main/java/de/kuschku/util/accounts/AccountManagerHelper.java index f2581ae28..db1a817e8 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/accounts/AccountManagerHelper.java +++ b/app/src/main/java/de/kuschku/util/accounts/AccountManagerHelper.java @@ -19,7 +19,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid_ng.util.accounts; +package de.kuschku.util.accounts; import android.content.Context; import android.database.Cursor; diff --git a/app/src/main/java/de/kuschku/util/ServerAddress.java b/app/src/main/java/de/kuschku/util/accounts/ServerAddress.java similarity index 97% rename from app/src/main/java/de/kuschku/util/ServerAddress.java rename to app/src/main/java/de/kuschku/util/accounts/ServerAddress.java index 4a56f879d..7684395df 100644 --- a/app/src/main/java/de/kuschku/util/ServerAddress.java +++ b/app/src/main/java/de/kuschku/util/accounts/ServerAddress.java @@ -19,7 +19,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.util; +package de.kuschku.util.accounts; public class ServerAddress { public final String host; diff --git a/app/src/main/java/de/kuschku/util/buffermetadata/BufferMetaDataHelper.java b/app/src/main/java/de/kuschku/util/buffermetadata/BufferMetaDataHelper.java new file mode 100644 index 000000000..f38b7a61d --- /dev/null +++ b/app/src/main/java/de/kuschku/util/buffermetadata/BufferMetaDataHelper.java @@ -0,0 +1,104 @@ +/* + * QuasselDroid - Quassel client for Android + * Copyright (C) 2016 Janne Koschinski + * Copyright (C) 2016 Ken Børge Viktil + * Copyright (C) 2016 Magnus Fjell + * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +package de.kuschku.util.buffermetadata; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.support.annotation.NonNull; + +public class BufferMetaDataHelper extends SQLiteOpenHelper { + private static final int DATABASE_VERSION = 1; + @NonNull + private static final String DATABASE_NAME = "bufferdata"; + @NonNull + private static final String TABLE_ACCOUNTS = "bufferdata"; + + @NonNull + private static final String KEY_CORE = "core"; + @NonNull + private static final String KEY_BUFFER = "buffer"; + @NonNull + private static final String KEY_HIDDEN = "hiddenevents"; + @NonNull + private static final String KEY_MARKERLINE = "markerline"; + + // Again we can only use String.format, as SQL doesn’t support table or column names to be bound + // in prepared statements + @NonNull + private static final String STATEMENT_INSERT = + String.format("INSERT OR IGNORE INTO %s(%s, %s, %s, %s) VALUES (?, ?, ?, ?)", + TABLE_ACCOUNTS, KEY_CORE, KEY_BUFFER, KEY_HIDDEN, KEY_MARKERLINE); + @NonNull + private static final String STATEMENT_DELETE = + String.format("DELETE FROM %s WHERE %s = ? AND %s = ?", + TABLE_ACCOUNTS, KEY_CORE, KEY_BUFFER); + + @NonNull + private static final String SPECIFIER_FIND = + String.format("%s = ? AND %s = ?", KEY_CORE, KEY_BUFFER); + + public BufferMetaDataHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + // Why do we use String.format and not prepared statements? Because we can’t bind table or + // column names in prepared statements + String statement = String.format("CREATE TABLE %s (%s, %s, %s, %s, PRIMARY KEY (%s, %s), UNIQUE(%s));", + TABLE_ACCOUNTS, + KEY_CORE, KEY_BUFFER, KEY_HIDDEN, KEY_MARKERLINE, + KEY_CORE, KEY_BUFFER, + KEY_CORE); + db.execSQL(statement); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + + } + + public void storeMarkerline(String coreid, int bufferid, int messageid) { + + } + + public void storeHiddenData(String coreid, int bufferid, int hiddendata) { + + } + + public int markerLine(String coreid, int bufferid) { + return -1; + } + + public int hiddenData(String coreid, int bufferid) { + return -1; + } + + public void deleteCore(String coreid) { + + } + + public void deleteBuffer(String coreid, int bufferid) { + + } +} diff --git a/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java b/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java index c8e7e3603..60a65f011 100644 --- a/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java +++ b/app/src/main/java/de/kuschku/util/certificates/SQLiteCertificateManager.java @@ -31,7 +31,7 @@ import java.util.Map; import de.kuschku.libquassel.ssl.CertificateManager; import de.kuschku.libquassel.ssl.UnknownCertificateException; -import de.kuschku.util.ServerAddress; +import de.kuschku.util.accounts.ServerAddress; public class SQLiteCertificateManager implements CertificateManager { @NonNull diff --git a/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java b/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java index 6551c1f1c..e75664595 100644 --- a/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java +++ b/app/src/main/java/de/kuschku/util/niohelpers/WrappedChannel.java @@ -47,7 +47,7 @@ import javax.net.ssl.TrustManager; import de.kuschku.libquassel.ssl.CertificateManager; import de.kuschku.libquassel.ssl.QuasselTrustManager; import de.kuschku.util.CompatibilityUtils; -import de.kuschku.util.ServerAddress; +import de.kuschku.util.accounts.ServerAddress; public class WrappedChannel implements Flushable, ByteChannel, InterruptibleChannel { @Nullable diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/AbstractPreferenceElement.java b/app/src/main/java/de/kuschku/util/preferences/AbstractPreferenceElement.java similarity index 97% rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/AbstractPreferenceElement.java rename to app/src/main/java/de/kuschku/util/preferences/AbstractPreferenceElement.java index 32f257b2e..8e4035bf6 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/AbstractPreferenceElement.java +++ b/app/src/main/java/de/kuschku/util/preferences/AbstractPreferenceElement.java @@ -19,7 +19,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid_ng.util.preferences; +package de.kuschku.util.preferences; import android.content.SharedPreferences; diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/BooleanPreference.java b/app/src/main/java/de/kuschku/util/preferences/BooleanPreference.java similarity index 96% rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/BooleanPreference.java rename to app/src/main/java/de/kuschku/util/preferences/BooleanPreference.java index 0d0b0ce33..1b6f77a38 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/BooleanPreference.java +++ b/app/src/main/java/de/kuschku/util/preferences/BooleanPreference.java @@ -19,7 +19,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid_ng.util.preferences; +package de.kuschku.util.preferences; import android.content.SharedPreferences; diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/FloatPreference.java b/app/src/main/java/de/kuschku/util/preferences/FloatPreference.java similarity index 96% rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/FloatPreference.java rename to app/src/main/java/de/kuschku/util/preferences/FloatPreference.java index 7e6a44fe7..81c93ba5a 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/FloatPreference.java +++ b/app/src/main/java/de/kuschku/util/preferences/FloatPreference.java @@ -19,7 +19,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid_ng.util.preferences; +package de.kuschku.util.preferences; import android.content.SharedPreferences; diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/IntPreference.java b/app/src/main/java/de/kuschku/util/preferences/IntPreference.java similarity index 96% rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/IntPreference.java rename to app/src/main/java/de/kuschku/util/preferences/IntPreference.java index f598b3096..7032bfbaf 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/IntPreference.java +++ b/app/src/main/java/de/kuschku/util/preferences/IntPreference.java @@ -19,7 +19,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid_ng.util.preferences; +package de.kuschku.util.preferences; import android.content.SharedPreferences; diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/LongPreference.java b/app/src/main/java/de/kuschku/util/preferences/LongPreference.java similarity index 96% rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/LongPreference.java rename to app/src/main/java/de/kuschku/util/preferences/LongPreference.java index ad51dd392..0b0d14b80 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/LongPreference.java +++ b/app/src/main/java/de/kuschku/util/preferences/LongPreference.java @@ -19,7 +19,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid_ng.util.preferences; +package de.kuschku.util.preferences; import android.content.SharedPreferences; diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/OnChangeListener.java b/app/src/main/java/de/kuschku/util/preferences/OnChangeListener.java similarity index 94% rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/OnChangeListener.java rename to app/src/main/java/de/kuschku/util/preferences/OnChangeListener.java index 80554b99b..743cec657 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/OnChangeListener.java +++ b/app/src/main/java/de/kuschku/util/preferences/OnChangeListener.java @@ -19,7 +19,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid_ng.util.preferences; +package de.kuschku.util.preferences; public interface OnChangeListener<T> { void change(T value); diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/PreferenceElement.java b/app/src/main/java/de/kuschku/util/preferences/PreferenceElement.java similarity index 95% rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/PreferenceElement.java rename to app/src/main/java/de/kuschku/util/preferences/PreferenceElement.java index 68897a345..2ad588e3d 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/PreferenceElement.java +++ b/app/src/main/java/de/kuschku/util/preferences/PreferenceElement.java @@ -19,7 +19,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid_ng.util.preferences; +package de.kuschku.util.preferences; public interface PreferenceElement<T> { void addChangeListener(OnChangeListener<T> listener); diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/StringPreference.java b/app/src/main/java/de/kuschku/util/preferences/StringPreference.java similarity index 96% rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/StringPreference.java rename to app/src/main/java/de/kuschku/util/preferences/StringPreference.java index 0221090b9..67a802c0e 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/preferences/StringPreference.java +++ b/app/src/main/java/de/kuschku/util/preferences/StringPreference.java @@ -19,7 +19,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid_ng.util.preferences; +package de.kuschku.util.preferences; import android.content.SharedPreferences; diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/BoundActivity.java b/app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java similarity index 97% rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/BoundActivity.java rename to app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java index ca2b1aac2..1a7f78341 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/BoundActivity.java +++ b/app/src/main/java/de/kuschku/util/servicebound/BoundActivity.java @@ -19,7 +19,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid_ng.util; +package de.kuschku.util.servicebound; import android.content.ComponentName; import android.content.ServiceConnection; @@ -34,7 +34,7 @@ import de.kuschku.quasseldroid_ng.service.QuasselService; import de.kuschku.quasseldroid_ng.ui.chat.Settings; import de.kuschku.quasseldroid_ng.ui.chat.util.ServiceHelper; import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.quasseldroid_ng.util.accounts.Account; +import de.kuschku.util.accounts.Account; public abstract class BoundActivity extends AppCompatActivity { protected AppContext context = new AppContext(); diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/BoundFragment.java b/app/src/main/java/de/kuschku/util/servicebound/BoundFragment.java similarity index 97% rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/BoundFragment.java rename to app/src/main/java/de/kuschku/util/servicebound/BoundFragment.java index ed9eec333..5aae12208 100644 --- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/BoundFragment.java +++ b/app/src/main/java/de/kuschku/util/servicebound/BoundFragment.java @@ -19,7 +19,7 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -package de.kuschku.quasseldroid_ng.util; +package de.kuschku.util.servicebound; import android.content.ComponentName; import android.content.ServiceConnection; @@ -34,7 +34,7 @@ import de.kuschku.quasseldroid_ng.service.QuasselService; import de.kuschku.quasseldroid_ng.ui.chat.Settings; import de.kuschku.quasseldroid_ng.ui.chat.util.ServiceHelper; import de.kuschku.quasseldroid_ng.ui.theme.AppContext; -import de.kuschku.quasseldroid_ng.util.accounts.Account; +import de.kuschku.util.accounts.Account; public abstract class BoundFragment extends Fragment { protected AppContext context = new AppContext(); diff --git a/app/src/main/res/layout-sw600dp-land/activity_setup.xml b/app/src/main/res/layout-sw600dp-land/activity_setup.xml index 76a3e2ed0..51358ec3a 100644 --- a/app/src/main/res/layout-sw600dp-land/activity_setup.xml +++ b/app/src/main/res/layout-sw600dp-land/activity_setup.xml @@ -36,13 +36,14 @@ android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:src="@drawable/ic_arrow_right_dark" android:layout_gravity="end|bottom" - android:layout_marginRight="80dp" - android:layout_marginEnd="80dp" android:layout_marginBottom="16dp" - app:elevation="0dip" + android:layout_marginEnd="80dp" + android:layout_marginRight="80dp" + android:src="@drawable/ic_arrow_right_dark" app:backgroundTint="#8A000000" - app:fabSize="normal"/> + app:elevation="0dip" + app:fabSize="normal" + app:pressedTranslationZ="0dip" /> </FrameLayout> diff --git a/app/src/main/res/layout-sw600dp/activity_setup.xml b/app/src/main/res/layout-sw600dp/activity_setup.xml index e00fb748f..aaac9a037 100644 --- a/app/src/main/res/layout-sw600dp/activity_setup.xml +++ b/app/src/main/res/layout-sw600dp/activity_setup.xml @@ -41,14 +41,15 @@ android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:src="@drawable/ic_arrow_right_dark" android:layout_gravity="end|bottom" - android:layout_marginRight="16dp" - android:layout_marginEnd="16dp" android:layout_marginBottom="16dp" - app:elevation="0dip" + android:layout_marginEnd="16dp" + android:layout_marginRight="16dp" + android:src="@drawable/ic_arrow_right_dark" app:backgroundTint="#8A000000" - app:fabSize="normal" /> + app:elevation="0dip" + app:fabSize="normal" + app:pressedTranslationZ="0dip" /> </FrameLayout> diff --git a/app/src/main/res/layout/activity_setup.xml b/app/src/main/res/layout/activity_setup.xml index c8168d03a..df943e068 100644 --- a/app/src/main/res/layout/activity_setup.xml +++ b/app/src/main/res/layout/activity_setup.xml @@ -36,13 +36,14 @@ android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:src="@drawable/ic_arrow_right_dark" android:layout_gravity="end|bottom" - android:layout_marginRight="16dp" - android:layout_marginEnd="16dp" android:layout_marginBottom="16dp" - app:elevation="0dip" + android:layout_marginEnd="16dp" + android:layout_marginRight="16dp" + android:src="@drawable/ic_arrow_right_dark" app:backgroundTint="#8A000000" - app:fabSize="normal" /> + app:elevation="0dip" + app:fabSize="normal" + app:pressedTranslationZ="0dip" /> </FrameLayout> diff --git a/app/src/main/res/layout/fragment_loading.xml b/app/src/main/res/layout/fragment_loading.xml index 997f5c18f..0e3d3cafe 100644 --- a/app/src/main/res/layout/fragment_loading.xml +++ b/app/src/main/res/layout/fragment_loading.xml @@ -20,42 +20,39 @@ ~ with this program. If not, see <http://www.gnu.org/licenses/>. --> -<RelativeLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="?attr/colorBackground"> <LinearLayout - android:orientation="vertical" android:layout_width="240dp" android:layout_height="wrap_content" + android:layout_centerHorizontal="true" android:layout_centerVertical="true" - android:layout_centerHorizontal="true"> + android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView + android:id="@+id/label" android:layout_width="0dip" - android:layout_weight="1" android:layout_height="wrap_content" - android:textAppearance="@style/TextAppearance.AppCompat.Caption" - android:text="Connecting" - android:id="@+id/label" /> + android:layout_weight="1" + android:text="@string/statusConnecting" + android:textAppearance="@style/TextAppearance.AppCompat.Caption" /> <TextView + android:id="@+id/count" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textAppearance="@style/TextAppearance.AppCompat.Caption" - android:text="1/15" - android:id="@+id/count" /> + android:textAppearance="@style/TextAppearance.AppCompat.Caption" /> </LinearLayout> <ProgressBar + android:id="@+id/progressBar" style="@style/Widget.AppCompat.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" - android:indeterminate="true" - android:id="@+id/progressBar" /> + android:indeterminate="true" /> </LinearLayout> </RelativeLayout> diff --git a/app/src/main/res/layout/widget_core_account.xml b/app/src/main/res/layout/widget_core_account.xml index b9d3a5d60..464cf4c49 100644 --- a/app/src/main/res/layout/widget_core_account.xml +++ b/app/src/main/res/layout/widget_core_account.xml @@ -21,42 +21,26 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="@dimen/material_drawer_item_profile" - android:orientation="horizontal" - android:paddingEnd="@dimen/material_drawer_vertical_padding" - android:paddingLeft="@dimen/material_drawer_vertical_padding" - android:paddingRight="@dimen/material_drawer_vertical_padding" - android:paddingStart="@dimen/material_drawer_vertical_padding"> + android:background="?attr/selectableItemBackground" + android:clickable="true" + android:orientation="horizontal"> - <LinearLayout + <android.support.v7.widget.AppCompatRadioButton + android:id="@+id/account_select" android:layout_width="@dimen/material_drawer_item_profile_icon_width" - android:layout_height="@dimen/material_drawer_item_profile" - android:paddingBottom="@dimen/material_drawer_item_profile_icon_padding" - android:paddingEnd="@dimen/material_drawer_item_profile_icon_padding_right" - android:paddingLeft="0dp" - android:paddingRight="@dimen/material_drawer_item_profile_icon_padding_right" - android:paddingStart="0dp" - android:paddingTop="@dimen/material_drawer_item_profile_icon_padding"> - - <android.support.v7.widget.AppCompatRadioButton - android:id="@+id/account_select" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" /> - - </LinearLayout> + android:layout_height="@dimen/material_drawer_item_profile_icon_width" + android:layout_gravity="center_vertical" + android:background="@android:color/transparent" /> <LinearLayout - android:layout_width="match_parent" + android:layout_width="0dip" android:layout_height="match_parent" + android:layout_margin="@dimen/material_drawer_item_profile_icon_padding_right" + android:layout_weight="1" android:gravity="center_vertical|start" - android:orientation="vertical" - android:paddingEnd="0dp" - android:paddingLeft="@dimen/material_drawer_padding" - android:paddingRight="0dp" - android:paddingStart="@dimen/material_drawer_padding"> + android:orientation="vertical"> <TextView android:id="@+id/account_name" @@ -65,11 +49,8 @@ android:fontFamily="sans-serif-medium" android:gravity="center_vertical|start" android:lines="1" - android:paddingRight="@dimen/material_drawer_item_primary_icon_padding_right" android:singleLine="true" - android:textDirection="anyRtl" - android:textSize="@dimen/material_drawer_item_profile_text" - tools:text="Remote" /> + android:textSize="@dimen/material_drawer_item_profile_text" /> <TextView android:id="@+id/account_description" @@ -79,15 +60,15 @@ android:gravity="center_vertical|start" android:lines="1" android:singleLine="true" - android:textDirection="anyRtl" - android:textSize="@dimen/material_drawer_item_profile_description" - tools:text="kuschku on kuschku.de" /> + android:textSize="@dimen/material_drawer_item_profile_description" /> </LinearLayout> - <!-- - <ImageButton - android:layout_width="48dp" - android:layout_height="48dp" - android:src=""/> - --> + <android.support.v7.widget.AppCompatImageButton + android:id="@+id/account_delete" + style="?attr/buttonStyleSmall" + android:layout_width="@dimen/material_drawer_item_profile_icon_width" + android:layout_height="@dimen/material_drawer_item_profile_icon_width" + android:layout_gravity="center_vertical" + android:background="?attr/selectableItemBackgroundBorderless" + android:src="@drawable/ic_delete_light" /> </LinearLayout> diff --git a/app/src/main/res/layout/widget_core_account_add.xml b/app/src/main/res/layout/widget_core_account_add.xml index 52382d733..861b6e17b 100644 --- a/app/src/main/res/layout/widget_core_account_add.xml +++ b/app/src/main/res/layout/widget_core_account_add.xml @@ -21,9 +21,9 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="@dimen/material_drawer_item_profile" + android:background="?attr/selectableItemBackground" android:orientation="horizontal" android:paddingEnd="@dimen/material_drawer_vertical_padding" android:paddingLeft="@dimen/material_drawer_vertical_padding" @@ -67,8 +67,8 @@ android:lines="1" android:paddingRight="@dimen/material_drawer_item_primary_icon_padding_right" android:singleLine="true" + android:text="Add Account" android:textDirection="anyRtl" - android:textSize="@dimen/material_drawer_item_profile_text" - android:text="Add Account" /> + android:textSize="@dimen/material_drawer_item_profile_text" /> </LinearLayout> </LinearLayout> diff --git a/app/src/main/res/layout/widget_editor.xml b/app/src/main/res/layout/widget_editor.xml index a41550b8d..fc8ef8744 100644 --- a/app/src/main/res/layout/widget_editor.xml +++ b/app/src/main/res/layout/widget_editor.xml @@ -65,6 +65,7 @@ android:background="?attr/selectableItemBackgroundBorderless" android:padding="12dp" android:src="@drawable/ic_send" + android:theme="@style/RippleOverlay" android:tint="?attr/colorAccent" /> <android.support.design.widget.AppBarLayout diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml deleted file mode 100644 index 24ea19fac..000000000 --- a/app/src/main/res/values-v21/styles.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ QuasselDroid - Quassel client for Android - ~ Copyright (C) 2016 Janne Koschinski - ~ Copyright (C) 2016 Ken Børge Viktil - ~ Copyright (C) 2016 Magnus Fjell - ~ Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org> - ~ - ~ This program is free software: you can redistribute it and/or modify it - ~ under the terms of the GNU General Public License as published by the Free - ~ Software Foundation, either version 3 of the License, or (at your option) - ~ any later version. - ~ - ~ This program is distributed in the hope that it will be useful, - ~ but WITHOUT ANY WARRANTY; without even the implied warranty of - ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - ~ GNU General Public License for more details. - ~ - ~ You should have received a copy of the GNU General Public License along - ~ with this program. If not, see <http://www.gnu.org/licenses/>. - --> - -<resources> - <style name="Base.SetupTheme" parent="Theme.AppCompat.Light.NoActionBar"> - <item name="android:windowTranslucentStatus">true</item> - </style> -</resources> diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 5ab694210..89b556f2f 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -21,6 +21,8 @@ --> <resources> + <attr name="colorAccentFocus" format="color" /> + <!-- sender colors --> <attr name="senderColor0" format="color" /> @@ -87,6 +89,8 @@ <attr name="iconHistory" format="reference" /> <attr name="iconDebug" format="reference" /> <attr name="iconFilter" format="reference" /> + <attr name="iconDelete" format="reference" /> + <attr name="iconModify" format="reference" /> <attr name="cardStyle" format="reference" /> </resources> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 80916c85a..86cf89e1d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -65,4 +65,12 @@ <string name="slideAccountnameTitle">Customize Account</string> <string name="slideAccountnameDescription">Give this account a name and icon</string> + + <string name="statusConnecting">Connecting</string> + <string name="statusHandshake">Logging in</string> + <string name="statusInitData">Loading Networks and Channels</string> + <string name="statusBacklog">Loading Chat History</string> + <string name="statusConnected">Connected</string> + <string name="statusWelcome">Welcome!</string> + <string name="statusDisconnected">Connection lost</string> </resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 3ac174f46..80a075e8f 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -29,7 +29,8 @@ <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> - <item name="colorControlHighlight">@color/colorAccentFocus</item> + <item name="colorAccentFocus">@color/colorAccentFocus</item> + <item name="windowActionModeOverlay">true</item> <item name="material_drawer_background">?attr/colorBackground</item> @@ -45,6 +46,8 @@ <item name="iconHistory">@drawable/ic_history_dark</item> <item name="iconDebug">@drawable/ic_bug_dark</item> <item name="iconFilter">@drawable/ic_filter_dark</item> + <item name="iconModify">@drawable/ic_pencil_dark</item> + <item name="iconDelete">@drawable/ic_delete_dark</item> <item name="cardStyle">@style/CardView.Dark</item> </style> @@ -54,7 +57,8 @@ <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> - <item name="colorControlHighlight">@color/colorAccentFocus</item> + <item name="colorAccentFocus">@color/colorAccentFocus</item> + <item name="windowActionModeOverlay">true</item> <item name="material_drawer_background">?attr/colorBackground</item> @@ -70,6 +74,8 @@ <item name="iconHistory">@drawable/ic_history_light</item> <item name="iconDebug">@drawable/ic_bug_light</item> <item name="iconFilter">@drawable/ic_filter_light</item> + <item name="iconModify">@drawable/ic_pencil_light</item> + <item name="iconDelete">@drawable/ic_delete_light</item> <item name="cardStyle">@style/CardView.Light</item> </style> @@ -81,10 +87,13 @@ <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> - <item name="colorControlHighlight">@color/colorAccentFocus</item> <item name="windowActionModeOverlay">true</item> </style> + <style name="RippleOverlay" parent="ThemeOverlay.AppCompat"> + <item name="colorControlHighlight">?attr/colorAccentFocus</item> + </style> + <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark" /> -- GitLab