diff --git a/app/src/main/java/de/kuschku/libquassel/BusProvider.java b/app/src/main/java/de/kuschku/libquassel/BusProvider.java index 47fc9be9e54441440487f6c4482df8ef6b32cd68..f4306182311a22993ee9871974e4f31cef6b9a11 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 291e2a4d91e66f02b23728e60e682e105e5dee67..dbf6a154d27a77a00aead03ec73ace28813c3c43 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 31be8d48ae9c5fc2365da6be8fb293bc5bda09ea..4bb6059b72be5ed2dd5ae0180d35bd7d3eed0a5a 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 787c005aff339a6f07abd20561822a7b16120d9a..7e556380f069f948ecf5f05058debcb75f7a84e2 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 423760553bb9be84e37c2a3a87b0a0c984e9c928..04d9b2bc68acf5c574097d9eb7b95ad8f3ce6c9f 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 12bac3522fdb6deb51213b9a37751191c3e2a432..08d24dfe1e8ce48103876d8b188b5e4150de9647 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 7cb601ff4d1c2677cf38b72183d3b0b86dddd7e2..461d2c5ebcf26f9ecb5202e11b4278de6ebd7abf 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 de46dcce803739e2fab32f3702938468262c3737..0ef702f9ba25f0f898efce991b97db2aa10dd170 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 3c31c7f8394fc401e4ae4006332ffd3cd6985637..7beba23f47c1f2ebab4531de9af826172a9f9f5e 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 4e2df1296f868cf50dee060d7514ba1577d561b3..1ba3d35b23bd4fa0e95328950b3574d05da912f6 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 a7fa4797f8b23f083b3889fd3103e3ba4bcd30eb..a423cbd9399d0b487b07bc3deb5091de7b631a20 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 27d9b66acab76489639bdb61558a05d4d6c6625b..304d2a760ae91bc378cc361b45acde8f7db85d22 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 f51e95b476d822143786e78db356a075baaa24d6..54baafec773998d6cef7246c4f78cfc53533173d 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 d88b873c305293e3f380e83fcfa418ee61cfe32e..8d106bf601ad7140633e76b0b7a7ff6088e12379 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 2be3d7ecfa55649e0b8ee514031fcb1dc63cb0b6..9e26fdac6d18086525f724d975fe61ae65b35551 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 f424544ba01825d4f28e61b1eef8561f4f4532d1..c3919a788cf828189d3ca0c92978d543e5de70e3 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 550abdb3dc05f78a72bb1040cefbd63b1e4bc900..9d1f05e82357cf195ef3e6245629f44ed83291bf 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 68947dc15cee466415631ae1dea1c00f84addd77..a786c05887c0befd8fc73f735ae8ff796581e6e5 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 32b44f69ac1d39aae7d4ea86ba4758e1ea82864c..b2f73236c1bc619055cba87546fe84006566a268 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 0000000000000000000000000000000000000000..2d0cfdc034f58f406532ef6d21d526acee2f91f3 --- /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 2c202b4b557adb624e0fd216e57e55a36062117b..f4314638975fcb6f7c76cbae57d5a698afb63755 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 0c1bd45d44877c684fc0155443af91ba0508eb5c..99d0a9c6d34f7152bb8ea13400985bcbf177a386 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 f2581ae288378851b41d6b97576f8142203d6d4c..db1a817e8d9eef6c5a01e94f23ea9d8db132fd1e 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 4a56f879de9671072f6a9580ea55099b13c5a2bd..7684395dff97636dd3ff12e2d61888df840a50a1 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 0000000000000000000000000000000000000000..f38b7a61dbac52eef813b849f8d3f9d99ad82c7a --- /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 c8e7e36032d79cf574005376fd76a656fbebd24d..60a65f0114a2466dab4d861b1c20315dbd5c0533 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 6551c1f1cd6355d0395f58954efb93b8ef3c99f5..e7566459505674eba966363844bb82dcf38855df 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 32f257b2e9a08142024b9da07d89c5ffc7bf73bc..8e4035bf6b750613e59b295ad559875adcce087d 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 0d0b0ce3307706d8c846d81f2d0c5118ef67704c..1b6f77a385b490e4d38fa34fb6d61965d8bda2d1 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 7e6a44fe71eab1aa493919dd3f38aea248b1a3ce..81c93ba5ac17b9353957cbee9a3d8cd3a4598975 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 f598b30961f67402e5e59565d2e9043953aa554d..7032bfbaf7055445772c2b447b2e5d2a1017d8ef 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 ad51dd392603deee99daf2388d720d79734d2ff4..0b0d14b8085d536cab7fb5049cdb6dfcbcdce716 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 80554b99b7aa964167ed93908433aa6cc698af10..743cec6570ad8bf6b256b547b7b6c783f9267396 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 68897a345b6f08c78b5a53d92bb820a85e6254e4..2ad588e3da68134643110009b24aa4bcc535a7e4 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 0221090b977b5133a9b68b948fea42c3fd753673..67a802c0ec5d3aa1b4fd1fc29d86ab702d294adf 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 ca2b1aac29e9db030867447d96bcb5340dd914fb..1a7f78341b6655241be13de1109c921cf97cd694 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 ed9eec33378825aacddeb732f955c7cd4ad6cf1d..5aae12208dcdb8f7b29891372d947e6b2f378152 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 76a3e2ed02d104400f56ba090300250a09c557b2..51358ec3abea9dba768d88e4c01c529e27ae76d3 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 e00fb748f1c1e1cf5677c3d4e06321338fecf655..aaac9a03706acb59ee7d712a616971439323a81f 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 c8168d03a062b5041646cde1e3caff7d2342f3e6..df943e068c4cb818528834ed9a67e364879a7a5d 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 997f5c18faa1dd1cd87c21cff128ff46570659c6..0e3d3cafebe8020e16b7d875628fc7ff9211e65d 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 b9d3a5d6029b8441065bac3b3282cb553afe6737..464cf4c49fe38761c915f185b42a047ba69e6bf5 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 52382d73349b892fcd6cab188b0cd6451caedf26..861b6e17b4d624bfc35931e52e276f5aab1ebef9 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 a41550b8df07ebd2f05270b02ac5cbe5fd47d6b6..fc8ef87445a94c8bcd52a6a086744367f935482d 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 24ea19facc5101226f994ef3483b970269489c88..0000000000000000000000000000000000000000 --- 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 5ab6942105e71f24bf78450946ae0c69553fcab0..89b556f2f4292e2683e162d1d50b57d2a82cdc6f 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 80916c85a24ae0a775aea73f03eb037fdb05455d..86cf89e1da08f1bd7cb83c4d9111b469758c6e3b 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 3ac174f46de126d95fb15e97458d43e4b721085a..80a075e8fed90c44d163d50573d2d684fbbe76a9 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" />