From 348fa8daed6659c0d751595bf499c5dcbe9501b0 Mon Sep 17 00:00:00 2001
From: Christian Basler
Date: Thu, 8 Oct 2015 14:11:45 +0200
Subject: [PATCH 001/110] Some sync adapter code and bugfixes around it - not
yet functional
---
app/src/main/AndroidManifest.xml | 141 +++++++++++-------
.../apps/abit/AbstractItemListFragment.java | 27 +++-
.../dissem/apps/abit/MessageListActivity.java | 48 +++++-
.../dissem/apps/abit/MessageListFragment.java | 9 ++
.../abit/synchronization/Authenticator.java | 82 ++++++++++
.../synchronization/AuthenticatorService.java | 31 ++++
.../abit/synchronization/StubProvider.java | 65 ++++++++
.../abit/synchronization/SyncAdapter.java | 74 +++++++++
.../abit/synchronization/SyncService.java | 49 ++++++
.../activity_message_list.xml | 0
.../layout/activity_open_bitmessage_link.xml | 122 ++++++++-------
app/src/main/res/values-de/strings.xml | 4 +
app/src/main/res/values/strings.xml | 5 +
app/src/main/res/xml/authenticator.xml | 6 +
app/src/main/res/xml/preferences.xml | 19 ++-
app/src/main/res/xml/syncadapter.xml | 9 ++
16 files changed, 556 insertions(+), 135 deletions(-)
create mode 100644 app/src/main/java/ch/dissem/apps/abit/synchronization/Authenticator.java
create mode 100644 app/src/main/java/ch/dissem/apps/abit/synchronization/AuthenticatorService.java
create mode 100644 app/src/main/java/ch/dissem/apps/abit/synchronization/StubProvider.java
create mode 100644 app/src/main/java/ch/dissem/apps/abit/synchronization/SyncAdapter.java
create mode 100644 app/src/main/java/ch/dissem/apps/abit/synchronization/SyncService.java
rename app/src/main/res/{layout-sw600dp => layout-w720dp}/activity_message_list.xml (100%)
create mode 100644 app/src/main/res/xml/authenticator.xml
create mode 100644 app/src/main/res/xml/syncadapter.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 19861c3..7489cd6 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,104 +1,131 @@
+ xmlns:tools="http://schemas.android.com/tools"
+ package="ch.dissem.apps.abit">
-
-
-
-
-
+
+
+
+
+
+
+
+
+ android:allowBackup="true"
+ android:icon="@mipmap/ic_launcher"
+ android:label="@string/app_name"
+ android:theme="@style/AppTheme">
+ android:name=".MessageListActivity"
+ android:label="@string/app_name">
-
+
-
+
+ android:name=".MessageDetailActivity"
+ android:label="@string/title_message_detail"
+ android:parentActivityName=".MessageListActivity"
+ tools:ignore="UnusedAttribute">
+ android:name="android.support.PARENT_ACTIVITY"
+ android:value=".MessageListActivity" />
+ android:name=".SubscriptionDetailActivity"
+ android:label="@string/title_subscription_detail"
+ android:parentActivityName=".MessageListActivity"
+ tools:ignore="UnusedAttribute">
+ android:name="android.support.PARENT_ACTIVITY"
+ android:value=".MessageListActivity" />
+ android:name=".ComposeMessageActivity"
+ android:label="Compose"
+ android:parentActivityName=".MessageListActivity">
+ android:name="android.support.PARENT_ACTIVITY"
+ android:value=".MessageListActivity" />
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+ android:name=".SettingsActivity"
+ android:label="@string/settings"
+ android:parentActivityName=".MessageListActivity">
-
+
-
+
+ android:name=".OpenBitmessageLinkActivity"
+ android:label="@string/title_activity_open_bitmessage_link"
+ android:theme="@style/Theme.AppCompat.Light.Dialog">
-
+
-
-
-
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/ch/dissem/apps/abit/AbstractItemListFragment.java b/app/src/main/java/ch/dissem/apps/abit/AbstractItemListFragment.java
index 7ddfce9..3500931 100644
--- a/app/src/main/java/ch/dissem/apps/abit/AbstractItemListFragment.java
+++ b/app/src/main/java/ch/dissem/apps/abit/AbstractItemListFragment.java
@@ -21,6 +21,7 @@ import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ListView;
+
import ch.dissem.apps.abit.listeners.ListSelectionListener;
import ch.dissem.apps.abit.service.Singleton;
import ch.dissem.bitmessage.BitmessageContext;
@@ -54,6 +55,7 @@ public abstract class AbstractItemListFragment extends ListFragment {
* The current activated item position. Only used on tablets.
*/
private int activatedPosition = ListView.INVALID_POSITION;
+ private boolean activateOnItemClick;
abstract void updateList(Label label);
@@ -75,6 +77,17 @@ public abstract class AbstractItemListFragment extends ListFragment {
}
}
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ // When setting CHOICE_MODE_SINGLE, ListView will automatically
+ // give items the 'activated' state when touched.
+ getListView().setChoiceMode(activateOnItemClick
+ ? ListView.CHOICE_MODE_SINGLE
+ : ListView.CHOICE_MODE_NONE);
+ }
+
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
@@ -118,11 +131,15 @@ public abstract class AbstractItemListFragment extends ListFragment {
* given the 'activated' state when touched.
*/
public void setActivateOnItemClick(boolean activateOnItemClick) {
- // When setting CHOICE_MODE_SINGLE, ListView will automatically
- // give items the 'activated' state when touched.
- getListView().setChoiceMode(activateOnItemClick
- ? ListView.CHOICE_MODE_SINGLE
- : ListView.CHOICE_MODE_NONE);
+ this.activateOnItemClick = activateOnItemClick;
+
+ if (isVisible()) {
+ // When setting CHOICE_MODE_SINGLE, ListView will automatically
+ // give items the 'activated' state when touched.
+ getListView().setChoiceMode(activateOnItemClick
+ ? ListView.CHOICE_MODE_SINGLE
+ : ListView.CHOICE_MODE_NONE);
+ }
}
private void setActivatedPosition(int position) {
diff --git a/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java b/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
index 0ec6bfa..dbe16ea 100644
--- a/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
+++ b/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
@@ -1,5 +1,8 @@
package ch.dissem.apps.abit;
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
@@ -13,6 +16,8 @@ import android.widget.AdapterView;
import ch.dissem.apps.abit.listeners.ActionBarListener;
import ch.dissem.apps.abit.listeners.ListSelectionListener;
import ch.dissem.apps.abit.service.Singleton;
+import ch.dissem.apps.abit.synchronization.Authenticator;
+import ch.dissem.apps.abit.synchronization.SyncAdapter;
import ch.dissem.bitmessage.BitmessageContext;
import ch.dissem.bitmessage.entity.BitmessageAddress;
import ch.dissem.bitmessage.entity.Plaintext;
@@ -66,6 +71,8 @@ public class MessageListActivity extends AppCompatActivity
private static final Logger LOG = LoggerFactory.getLogger(MessageListActivity.class);
private static final int ADD_IDENTITY = 1;
+ private Account account;
+
/**
* Whether or not the activity is in two-pane mode, i.e. running on a tablet
* device.
@@ -97,6 +104,10 @@ public class MessageListActivity extends AppCompatActivity
// res/values-sw600dp). If this view is present, then the
// activity should be in two-pane mode.
twoPane = true;
+
+ // In two-pane mode, list items should be given the
+ // 'activated' state when touched.
+ listFragment.setActivateOnItemClick(true);
}
createDrawer(toolbar);
@@ -107,17 +118,40 @@ public class MessageListActivity extends AppCompatActivity
if (getIntent().hasExtra(EXTRA_SHOW_MESSAGE)) {
onItemSelected(getIntent().getSerializableExtra(EXTRA_SHOW_MESSAGE));
}
+
+ account = createSyncAccount(this);
+ getContentResolver().setSyncAutomatically(account, SyncAdapter.AUTHORITY, true);
+ }
+
+ private Account createSyncAccount(Context context) {
+ // Create the account type and default account
+ Account newAccount = new Account(Authenticator.ACCOUNT_NAME, Authenticator.ACCOUNT_TYPE);
+ // Get an instance of the Android account manager
+ AccountManager accountManager = (AccountManager) context.getSystemService(ACCOUNT_SERVICE);
+ /*
+ * Add the account and account type, no password or user data
+ * If successful, return the Account object, otherwise report an error.
+ */
+ if (accountManager.addAccountExplicitly(newAccount, null, null)) {
+ /*
+ * If you don't set android:syncable="true" in
+ * in your element in the manifest,
+ * then call context.setIsSyncable(account, AUTHORITY, 1)
+ * here.
+ */
+ } else {
+ /*
+ * The account exists or some other error occurred. Log this, report it,
+ * or handle it internally.
+ */
+ LOG.error("Couldn't add account");
+ }
+ return newAccount;
}
@Override
protected void onResume() {
super.onResume();
- if (twoPane) {
- // In two-pane mode, list items should be given the
- // 'activated' state when touched.
- ((MessageListFragment) getSupportFragmentManager().findFragmentById(R.id.item_list))
- .setActivateOnItemClick(true);
- }
}
private void changeList(AbstractItemListFragment> listFragment) {
@@ -232,7 +266,7 @@ public class MessageListActivity extends AppCompatActivity
if (item.getTag() instanceof Label) {
selectedLabel = (Label) item.getTag();
if (!(getSupportFragmentManager().findFragmentById(R.id.item_list) instanceof MessageListFragment)) {
- MessageListFragment listFragment = new MessageListFragment();
+ MessageListFragment listFragment = new MessageListFragment(getApplicationContext());
changeList(listFragment);
listFragment.updateList(selectedLabel);
} else {
diff --git a/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java b/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java
index cb02e54..a5515c5 100644
--- a/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java
+++ b/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java
@@ -1,6 +1,7 @@
package ch.dissem.apps.abit;
import android.app.Activity;
+import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
@@ -11,6 +12,7 @@ import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
+
import ch.dissem.apps.abit.listeners.ActionBarListener;
import ch.dissem.apps.abit.listeners.ListSelectionListener;
import ch.dissem.apps.abit.service.Singleton;
@@ -41,6 +43,10 @@ public class MessageListFragment extends AbstractItemListFragment {
public MessageListFragment() {
}
+ public MessageListFragment(Context ctx) {
+ bmc = Singleton.getBitmessageContext(ctx);
+ }
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -58,6 +64,9 @@ public class MessageListFragment extends AbstractItemListFragment {
@Override
public void updateList(Label label) {
currentLabel = label;
+
+ if (!isVisible()) return;
+
setListAdapter(new ArrayAdapter(
getActivity(),
android.R.layout.simple_list_item_activated_1,
diff --git a/app/src/main/java/ch/dissem/apps/abit/synchronization/Authenticator.java b/app/src/main/java/ch/dissem/apps/abit/synchronization/Authenticator.java
new file mode 100644
index 0000000..5a6d3c3
--- /dev/null
+++ b/app/src/main/java/ch/dissem/apps/abit/synchronization/Authenticator.java
@@ -0,0 +1,82 @@
+package ch.dissem.apps.abit.synchronization;
+
+import android.accounts.AbstractAccountAuthenticator;
+import android.accounts.Account;
+import android.accounts.AccountAuthenticatorResponse;
+import android.accounts.NetworkErrorException;
+import android.content.Context;
+import android.os.Bundle;
+
+/*
+ * Implement AbstractAccountAuthenticator and stub out all
+ * of its methods
+ */
+public class Authenticator extends AbstractAccountAuthenticator {
+ public static final String ACCOUNT_NAME = "Bitmessage";
+ public static final String ACCOUNT_TYPE = "bitmessage.dissem.ch";
+
+ // Simple constructor
+ public Authenticator(Context context) {
+ super(context);
+ }
+
+ // Editing properties is not supported
+ @Override
+ public Bundle editProperties(
+ AccountAuthenticatorResponse r, String s) {
+ throw new UnsupportedOperationException();
+ }
+
+ // Don't add additional accounts
+ @Override
+ public Bundle addAccount(
+ AccountAuthenticatorResponse r,
+ String s,
+ String s2,
+ String[] strings,
+ Bundle bundle) throws NetworkErrorException {
+ return null;
+ }
+
+ // Ignore attempts to confirm credentials
+ @Override
+ public Bundle confirmCredentials(
+ AccountAuthenticatorResponse r,
+ Account account,
+ Bundle bundle) throws NetworkErrorException {
+ return null;
+ }
+
+ // Getting an authentication token is not supported
+ @Override
+ public Bundle getAuthToken(
+ AccountAuthenticatorResponse r,
+ Account account,
+ String s,
+ Bundle bundle) throws NetworkErrorException {
+ throw new UnsupportedOperationException();
+ }
+
+ // Getting a label for the auth token is not supported
+ @Override
+ public String getAuthTokenLabel(String s) {
+ throw new UnsupportedOperationException();
+ }
+
+ // Updating user credentials is not supported
+ @Override
+ public Bundle updateCredentials(
+ AccountAuthenticatorResponse r,
+ Account account,
+ String s, Bundle bundle) throws NetworkErrorException {
+ throw new UnsupportedOperationException();
+ }
+
+ // Checking features for the account is not supported
+ @Override
+ public Bundle hasFeatures(
+ AccountAuthenticatorResponse r,
+ Account account, String[] strings) throws NetworkErrorException {
+ throw new UnsupportedOperationException();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ch/dissem/apps/abit/synchronization/AuthenticatorService.java b/app/src/main/java/ch/dissem/apps/abit/synchronization/AuthenticatorService.java
new file mode 100644
index 0000000..8fe717d
--- /dev/null
+++ b/app/src/main/java/ch/dissem/apps/abit/synchronization/AuthenticatorService.java
@@ -0,0 +1,31 @@
+package ch.dissem.apps.abit.synchronization;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+/**
+ * A bound Service that instantiates the authenticator
+ * when started.
+ */
+public class AuthenticatorService extends Service {
+ /**
+ * Instance field that stores the authenticator object
+ */
+ private Authenticator authenticator;
+
+ @Override
+ public void onCreate() {
+ // Create a new authenticator object
+ authenticator = new Authenticator(this);
+ }
+
+ /*
+ * When the system binds to this Service to make the RPC call
+ * return the authenticator's IBinder.
+ */
+ @Override
+ public IBinder onBind(Intent intent) {
+ return authenticator.getIBinder();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/ch/dissem/apps/abit/synchronization/StubProvider.java b/app/src/main/java/ch/dissem/apps/abit/synchronization/StubProvider.java
new file mode 100644
index 0000000..c79f074
--- /dev/null
+++ b/app/src/main/java/ch/dissem/apps/abit/synchronization/StubProvider.java
@@ -0,0 +1,65 @@
+package ch.dissem.apps.abit.synchronization;
+
+import android.content.ContentProvider;
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.net.Uri;
+
+/*
+ * Define an implementation of ContentProvider that stubs out
+ * all methods
+ */
+public class StubProvider extends ContentProvider {
+ /*
+ * Always return true, indicating that the
+ * provider loaded correctly.
+ */
+ @Override
+ public boolean onCreate() {
+ return true;
+ }
+ /*
+ * Return no type for MIME type
+ */
+ @Override
+ public String getType(Uri uri) {
+ return null;
+ }
+ /*
+ * query() always returns no results
+ *
+ */
+ @Override
+ public Cursor query(
+ Uri uri,
+ String[] projection,
+ String selection,
+ String[] selectionArgs,
+ String sortOrder) {
+ return null;
+ }
+ /*
+ * insert() always returns null (no URI)
+ */
+ @Override
+ public Uri insert(Uri uri, ContentValues values) {
+ return null;
+ }
+ /*
+ * delete() always returns "no rows affected" (0)
+ */
+ @Override
+ public int delete(Uri uri, String selection, String[] selectionArgs) {
+ return 0;
+ }
+ /*
+ * update() always returns "no rows affected" (0)
+ */
+ public int update(
+ Uri uri,
+ ContentValues values,
+ String selection,
+ String[] selectionArgs) {
+ return 0;
+ }
+}
diff --git a/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncAdapter.java b/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncAdapter.java
new file mode 100644
index 0000000..890b097
--- /dev/null
+++ b/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncAdapter.java
@@ -0,0 +1,74 @@
+package ch.dissem.apps.abit.synchronization;
+
+import android.accounts.Account;
+import android.content.AbstractThreadedSyncAdapter;
+import android.content.ContentProviderClient;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.content.SyncResult;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+import ch.dissem.apps.abit.service.Singleton;
+import ch.dissem.bitmessage.BitmessageContext;
+
+/**
+ * Sync Adapter to synchronize with the Bitmessage network - fetches
+ * new objects and then disconnects.
+ */
+public class SyncAdapter extends AbstractThreadedSyncAdapter {
+ private final static Logger LOG = LoggerFactory.getLogger(SyncAdapter.class);
+
+ public static final String AUTHORITY = "ch.dissem.bitmessage.provider";
+
+ private final BitmessageContext bmc;
+
+ public SyncAdapter(Context context) {
+ super(context, true, false);
+ bmc = Singleton.getBitmessageContext(context);
+ }
+
+ @Override
+ public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
+ // If the Bitmessage context acts as a full node, synchronization isn't necessary
+ if (bmc.isRunning()) return;
+
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
+
+ String trustedNode = preferences.getString("trusted_node", null);
+ if (trustedNode == null) return;
+ trustedNode = trustedNode.trim();
+ if (trustedNode.isEmpty()) return;
+
+ int port;
+ if (trustedNode.matches("^(?![0-9a-fA-F]*:[0-9a-fA-F]*:).*(:[0-9]+)$")) {
+ int index = trustedNode.lastIndexOf(':');
+ String portString = trustedNode.substring(index + 1);
+ trustedNode = trustedNode.substring(0, index);
+ try {
+ port = Integer.parseInt(portString);// FIXME
+ } catch (NumberFormatException e) {
+ LOG.error("Invalid port " + portString);
+ // TODO: show error as notification
+ return;
+ }
+ } else {
+ port = 8444;
+ }
+ long timeoutInSeconds = preferences.getInt("sync_timeout", 120);
+ try {
+ LOG.info("Synchronization started");
+ bmc.synchronize(InetAddress.getByName(trustedNode), port, timeoutInSeconds, true);
+ LOG.info("Synchronization finished");
+ } catch (UnknownHostException e) {
+ LOG.error("Couldn't synchronize", e);
+ // TODO: show error as notification
+ }
+ }
+}
diff --git a/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncService.java b/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncService.java
new file mode 100644
index 0000000..fb6fd9f
--- /dev/null
+++ b/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncService.java
@@ -0,0 +1,49 @@
+package ch.dissem.apps.abit.synchronization;
+
+import android.app.Service;
+import android.content.Intent;
+import android.os.IBinder;
+
+/**
+ * Define a Service that returns an IBinder for the
+ * sync adapter class, allowing the sync adapter framework to call
+ * onPerformSync().
+ */
+public class SyncService extends Service {
+ // Storage for an instance of the sync adapter
+ private static SyncAdapter syncAdapter = null;
+ // Object to use as a thread-safe lock
+ private static final Object syncAdapterLock = new Object();
+
+ /*
+ * Instantiate the sync adapter object.
+ */
+ @Override
+ public void onCreate() {
+ /*
+ * Create the sync adapter as a singleton.
+ * Set the sync adapter as syncable
+ * Disallow parallel syncs
+ */
+ synchronized (syncAdapterLock) {
+ if (syncAdapter == null) {
+ syncAdapter = new SyncAdapter(getApplicationContext());
+ }
+ }
+ }
+
+ /**
+ * Return an object that allows the system to invoke
+ * the sync adapter.
+ */
+ @Override
+ public IBinder onBind(Intent intent) {
+ /*
+ * Get the object that allows external processes
+ * to call onPerformSync(). The object is created
+ * in the base class code when the SyncAdapter
+ * constructors call super()
+ */
+ return syncAdapter.getSyncAdapterBinder();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout-sw600dp/activity_message_list.xml b/app/src/main/res/layout-w720dp/activity_message_list.xml
similarity index 100%
rename from app/src/main/res/layout-sw600dp/activity_message_list.xml
rename to app/src/main/res/layout-w720dp/activity_message_list.xml
diff --git a/app/src/main/res/layout/activity_open_bitmessage_link.xml b/app/src/main/res/layout/activity_open_bitmessage_link.xml
index 95f792d..fedbd9d 100644
--- a/app/src/main/res/layout/activity_open_bitmessage_link.xml
+++ b/app/src/main/res/layout/activity_open_bitmessage_link.xml
@@ -1,83 +1,81 @@
-
+
+ android:id="@+id/address"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="BM-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+ android:id="@+id/label_wrapper"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/address">
+ android:id="@+id/label"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:hint="@string/label"
+ android:inputType="textPersonName" />
+ android:id="@+id/import_contact"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/label_wrapper"
+ android:layout_centerHorizontal="true"
+ android:layout_marginTop="8dp"
+ android:text="@string/import_contact" />
+ android:id="@+id/subscribe"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_below="@+id/import_contact"
+ android:layout_centerHorizontal="true"
+ android:layout_marginBottom="8dp"
+ android:layout_marginTop="8dp"
+ android:text="@string/subscribe" />
+ android:id="@+id/do_import"
+ style="?android:attr/borderlessButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:layout_alignParentRight="true"
+ android:layout_below="@+id/subscribe"
+ android:layout_marginBottom="12dp"
+ android:layout_marginTop="12dp"
+ android:text="@string/do_import" />
+ android:id="@+id/compose_message"
+ style="?android:attr/borderlessButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignTop="@+id/do_import"
+ android:layout_below="@+id/subscribe"
+ android:layout_toLeftOf="@+id/do_import"
+ android:layout_toStartOf="@+id/do_import"
+ android:text="@string/write_message" />
+ android:id="@+id/cancel"
+ style="?android:attr/borderlessButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignTop="@+id/compose_message"
+ android:layout_toLeftOf="@+id/compose_message"
+ android:layout_toStartOf="@+id/compose_message"
+ android:text="@string/cancel" />
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 2222570..b86c0f8 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -33,4 +33,8 @@
Stream #%d
Aktiv
Abonnement
+ Zeitbeschränkung der Synchronisierung
+ Timeout in Sekunden
+ Vertrauenswürdiger Knoten
+ Diese Adresse wird für die Synchronisation verwendet
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 43775b5..72fa388 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -33,4 +33,9 @@
Empty Trash
Stream #%d
Enabled
+ Trusted node
+ Use this node for synchronization
+ Synchronization Timeout
+ Timeout in seconds
+ Write message
diff --git a/app/src/main/res/xml/authenticator.xml b/app/src/main/res/xml/authenticator.xml
new file mode 100644
index 0000000..aa46bf6
--- /dev/null
+++ b/app/src/main/res/xml/authenticator.xml
@@ -0,0 +1,6 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index e1f7327..d026e3f 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -9,8 +9,19 @@
android:entryValues="@array/connection_mode_values"/>
-->
+ android:defaultValue="true"
+ android:key="wifi_only"
+ android:summary="@string/wifi_only_summary"
+ android:title="@string/wifi_only" />
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/syncadapter.xml b/app/src/main/res/xml/syncadapter.xml
new file mode 100644
index 0000000..20cacd2
--- /dev/null
+++ b/app/src/main/res/xml/syncadapter.xml
@@ -0,0 +1,9 @@
+
+
\ No newline at end of file
From 67c06b9884f2a9750bad6ff51a414960da400217 Mon Sep 17 00:00:00 2001
From: Christian Basler
Date: Mon, 12 Oct 2015 14:44:01 +0200
Subject: [PATCH 002/110] Some sync adapter fixes and changes - still doesn't
work
---
app/src/main/AndroidManifest.xml | 3 +-
.../dissem/apps/abit/MessageListActivity.java | 127 +++++++-----------
.../dissem/apps/abit/service/Singleton.java | 1 -
.../abit/synchronization/StubProvider.java | 7 +
.../abit/synchronization/SyncAdapter.java | 25 +++-
.../abit/synchronization/SyncService.java | 2 +-
app/src/main/res/menu/compose.xml | 2 +-
app/src/main/res/menu/main.xml | 10 --
app/src/main/res/values-de/strings.xml | 5 +-
app/src/main/res/values/strings.xml | 4 +-
10 files changed, 82 insertions(+), 104 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 7489cd6..f43e1e6 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -103,9 +103,10 @@
+
diff --git a/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java b/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
index dbe16ea..bc40eec 100644
--- a/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
+++ b/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
@@ -2,27 +2,15 @@ package ch.dissem.apps.abit;
import android.accounts.Account;
import android.accounts.AccountManager;
-import android.content.Context;
+import android.content.ContentResolver;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
-import android.view.Menu;
-import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
-
-import ch.dissem.apps.abit.listeners.ActionBarListener;
-import ch.dissem.apps.abit.listeners.ListSelectionListener;
-import ch.dissem.apps.abit.service.Singleton;
-import ch.dissem.apps.abit.synchronization.Authenticator;
-import ch.dissem.apps.abit.synchronization.SyncAdapter;
-import ch.dissem.bitmessage.BitmessageContext;
-import ch.dissem.bitmessage.entity.BitmessageAddress;
-import ch.dissem.bitmessage.entity.Plaintext;
-import ch.dissem.bitmessage.entity.Streamable;
-import ch.dissem.bitmessage.entity.valueobject.Label;
+import android.widget.CompoundButton;
import com.mikepenz.community_material_typeface_library.CommunityMaterial;
import com.mikepenz.google_material_typeface_library.GoogleMaterial;
@@ -34,10 +22,11 @@ import com.mikepenz.materialdrawer.accountswitcher.AccountHeaderBuilder;
import com.mikepenz.materialdrawer.model.PrimaryDrawerItem;
import com.mikepenz.materialdrawer.model.ProfileDrawerItem;
import com.mikepenz.materialdrawer.model.ProfileSettingDrawerItem;
-import com.mikepenz.materialdrawer.model.SecondaryDrawerItem;
+import com.mikepenz.materialdrawer.model.SwitchDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
import com.mikepenz.materialdrawer.model.interfaces.IProfile;
import com.mikepenz.materialdrawer.model.interfaces.Nameable;
+import com.mikepenz.materialdrawer.model.interfaces.OnCheckedChangeListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -45,6 +34,17 @@ import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.util.ArrayList;
+import ch.dissem.apps.abit.listeners.ActionBarListener;
+import ch.dissem.apps.abit.listeners.ListSelectionListener;
+import ch.dissem.apps.abit.service.Singleton;
+import ch.dissem.apps.abit.synchronization.Authenticator;
+import ch.dissem.bitmessage.BitmessageContext;
+import ch.dissem.bitmessage.entity.BitmessageAddress;
+import ch.dissem.bitmessage.entity.Plaintext;
+import ch.dissem.bitmessage.entity.valueobject.Label;
+
+import static ch.dissem.apps.abit.synchronization.StubProvider.AUTHORITY;
+
/**
* An activity representing a list of Messages. This activity
@@ -69,10 +69,9 @@ public class MessageListActivity extends AppCompatActivity
public static final String ACTION_SHOW_INBOX = "ch.dissem.abit.ShowInbox";
private static final Logger LOG = LoggerFactory.getLogger(MessageListActivity.class);
+ private static final long SYNC_FREQUENCY = 15 * 60; // seconds
private static final int ADD_IDENTITY = 1;
- private Account account;
-
/**
* Whether or not the activity is in two-pane mode, i.e. running on a tablet
* device.
@@ -82,7 +81,6 @@ public class MessageListActivity extends AppCompatActivity
private AccountHeader accountHeader;
private BitmessageContext bmc;
private Label selectedLabel;
- private Menu menu;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -119,39 +117,22 @@ public class MessageListActivity extends AppCompatActivity
onItemSelected(getIntent().getSerializableExtra(EXTRA_SHOW_MESSAGE));
}
- account = createSyncAccount(this);
- getContentResolver().setSyncAutomatically(account, SyncAdapter.AUTHORITY, true);
+ createSyncAccount();
}
- private Account createSyncAccount(Context context) {
- // Create the account type and default account
- Account newAccount = new Account(Authenticator.ACCOUNT_NAME, Authenticator.ACCOUNT_TYPE);
- // Get an instance of the Android account manager
- AccountManager accountManager = (AccountManager) context.getSystemService(ACCOUNT_SERVICE);
- /*
- * Add the account and account type, no password or user data
- * If successful, return the Account object, otherwise report an error.
- */
- if (accountManager.addAccountExplicitly(newAccount, null, null)) {
- /*
- * If you don't set android:syncable="true" in
- * in your element in the manifest,
- * then call context.setIsSyncable(account, AUTHORITY, 1)
- * here.
- */
- } else {
- /*
- * The account exists or some other error occurred. Log this, report it,
- * or handle it internally.
- */
- LOG.error("Couldn't add account");
+ private void createSyncAccount() {
+ // Create account, if it's missing. (Either first run, or user has deleted account.)
+ Account account = new Account(Authenticator.ACCOUNT_NAME, Authenticator.ACCOUNT_TYPE);
+
+ if (AccountManager.get(this).addAccountExplicitly(account, null, null)) {
+ // Inform the system that this account supports sync
+ ContentResolver.setIsSyncable(account, AUTHORITY, 1);
+ // Inform the system that this account is eligible for auto sync when the network is up
+ ContentResolver.setSyncAutomatically(account, AUTHORITY, true);
+ // Recommend a schedule for automatic synchronization. The system may modify this based
+ // on other scheduled syncs and network utilization.
+ ContentResolver.addPeriodicSync(account, AUTHORITY, new Bundle(), SYNC_FREQUENCY);
}
- return newAccount;
- }
-
- @Override
- protected void onResume() {
- super.onResume();
}
private void changeList(AbstractItemListFragment> listFragment) {
@@ -253,12 +234,24 @@ public class MessageListActivity extends AppCompatActivity
.withAccountHeader(accountHeader)
.withDrawerItems(drawerItems)
.addStickyDrawerItems(
- new SecondaryDrawerItem()
+ new PrimaryDrawerItem()
.withName(R.string.subscriptions)
.withIcon(CommunityMaterial.Icon.cmd_rss_box),
- new SecondaryDrawerItem()
+ new PrimaryDrawerItem()
.withName(R.string.settings)
- .withIcon(GoogleMaterial.Icon.gmd_settings)
+ .withIcon(GoogleMaterial.Icon.gmd_settings),
+ new SwitchDrawerItem()
+ .withName(R.string.full_node)
+ .withIcon(CommunityMaterial.Icon.cmd_cloud_outline)
+ .withOnCheckedChangeListener(new OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(IDrawerItem drawerItem, CompoundButton buttonView, boolean isChecked) {
+ // TODO: warn user, option to restrict to WiFi
+ if (isChecked && !bmc.isRunning()) bmc.startup();
+ else if (bmc.isRunning()) bmc.shutdown();
+ }
+ })
+ .withChecked(bmc.isRunning())
)
.withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
@Override
@@ -288,6 +281,8 @@ public class MessageListActivity extends AppCompatActivity
case R.string.settings:
startActivity(new Intent(MessageListActivity.this, SettingsActivity.class));
break;
+ case R.string.full_node:
+ return true;
}
}
return false;
@@ -297,36 +292,6 @@ public class MessageListActivity extends AppCompatActivity
.build();
}
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.main, menu);
- this.menu = menu;
- updateMenu();
- return true;
- }
-
- private void updateMenu() {
- boolean running = bmc.isRunning();
- menu.findItem(R.id.sync_enabled).setVisible(running);
- menu.findItem(R.id.sync_disabled).setVisible(!running);
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.sync_disabled:
- bmc.startup();
- updateMenu();
- return true;
- case R.id.sync_enabled:
- bmc.shutdown();
- updateMenu();
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
/**
* Callback method from {@link ListSelectionListener}
* indicating that the item with the given ID was selected.
diff --git a/app/src/main/java/ch/dissem/apps/abit/service/Singleton.java b/app/src/main/java/ch/dissem/apps/abit/service/Singleton.java
index 76c3301..e16b235 100644
--- a/app/src/main/java/ch/dissem/apps/abit/service/Singleton.java
+++ b/app/src/main/java/ch/dissem/apps/abit/service/Singleton.java
@@ -1,6 +1,5 @@
package ch.dissem.apps.abit.service;
-import android.app.NotificationManager;
import android.content.Context;
import ch.dissem.apps.abit.listeners.MessageListener;
diff --git a/app/src/main/java/ch/dissem/apps/abit/synchronization/StubProvider.java b/app/src/main/java/ch/dissem/apps/abit/synchronization/StubProvider.java
index c79f074..f5b3d2d 100644
--- a/app/src/main/java/ch/dissem/apps/abit/synchronization/StubProvider.java
+++ b/app/src/main/java/ch/dissem/apps/abit/synchronization/StubProvider.java
@@ -10,6 +10,8 @@ import android.net.Uri;
* all methods
*/
public class StubProvider extends ContentProvider {
+ public static final String AUTHORITY = "ch.dissem.apps.abit.provider";
+
/*
* Always return true, indicating that the
* provider loaded correctly.
@@ -18,6 +20,7 @@ public class StubProvider extends ContentProvider {
public boolean onCreate() {
return true;
}
+
/*
* Return no type for MIME type
*/
@@ -25,6 +28,7 @@ public class StubProvider extends ContentProvider {
public String getType(Uri uri) {
return null;
}
+
/*
* query() always returns no results
*
@@ -38,6 +42,7 @@ public class StubProvider extends ContentProvider {
String sortOrder) {
return null;
}
+
/*
* insert() always returns null (no URI)
*/
@@ -45,6 +50,7 @@ public class StubProvider extends ContentProvider {
public Uri insert(Uri uri, ContentValues values) {
return null;
}
+
/*
* delete() always returns "no rows affected" (0)
*/
@@ -52,6 +58,7 @@ public class StubProvider extends ContentProvider {
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
+
/*
* update() always returns "no rows affected" (0)
*/
diff --git a/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncAdapter.java b/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncAdapter.java
index 890b097..c12d30c 100644
--- a/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncAdapter.java
+++ b/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncAdapter.java
@@ -25,17 +25,32 @@ import ch.dissem.bitmessage.BitmessageContext;
public class SyncAdapter extends AbstractThreadedSyncAdapter {
private final static Logger LOG = LoggerFactory.getLogger(SyncAdapter.class);
- public static final String AUTHORITY = "ch.dissem.bitmessage.provider";
-
private final BitmessageContext bmc;
- public SyncAdapter(Context context) {
- super(context, true, false);
+ /**
+ * Set up the sync adapter
+ */
+ public SyncAdapter(Context context, boolean autoInitialize) {
+ super(context, autoInitialize);
+ bmc = Singleton.getBitmessageContext(context);
+ }
+
+ /**
+ * Set up the sync adapter. This form of the
+ * constructor maintains compatibility with Android 3.0
+ * and later platform versions
+ */
+ public SyncAdapter(
+ Context context,
+ boolean autoInitialize,
+ boolean allowParallelSyncs) {
+ super(context, autoInitialize, allowParallelSyncs);
bmc = Singleton.getBitmessageContext(context);
}
@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
+ LOG.info("Synchronizing Bitmessage");
// If the Bitmessage context acts as a full node, synchronization isn't necessary
if (bmc.isRunning()) return;
@@ -52,7 +67,7 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter {
String portString = trustedNode.substring(index + 1);
trustedNode = trustedNode.substring(0, index);
try {
- port = Integer.parseInt(portString);// FIXME
+ port = Integer.parseInt(portString);
} catch (NumberFormatException e) {
LOG.error("Invalid port " + portString);
// TODO: show error as notification
diff --git a/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncService.java b/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncService.java
index fb6fd9f..4beaa04 100644
--- a/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncService.java
+++ b/app/src/main/java/ch/dissem/apps/abit/synchronization/SyncService.java
@@ -27,7 +27,7 @@ public class SyncService extends Service {
*/
synchronized (syncAdapterLock) {
if (syncAdapter == null) {
- syncAdapter = new SyncAdapter(getApplicationContext());
+ syncAdapter = new SyncAdapter(getApplicationContext(), true);
}
}
}
diff --git a/app/src/main/res/menu/compose.xml b/app/src/main/res/menu/compose.xml
index ee25c89..dae8007 100644
--- a/app/src/main/res/menu/compose.xml
+++ b/app/src/main/res/menu/compose.xml
@@ -5,5 +5,5 @@
android:id="@+id/send"
app:showAsAction="always"
android:icon="@drawable/ic_action_send"
- android:title="@string/disable_sync"/>`
+ android:title="@string/send"/>`
\ No newline at end of file
diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml
index 9f35ce1..9eb7100 100644
--- a/app/src/main/res/menu/main.xml
+++ b/app/src/main/res/menu/main.xml
@@ -1,14 +1,4 @@
\ No newline at end of file
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index b86c0f8..43a43cc 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -5,8 +5,6 @@
Nur WLAN
Nicht mit Mobilfunknetz verbinden
Bitmessage ist aktiv
- Synchronisieren ausschalten
- Synchronisieren einschalten
Betreff
An
Nachricht
@@ -37,4 +35,7 @@
Timeout in Sekunden
Vertrauenswürdiger Knoten
Diese Adresse wird für die Synchronisation verwendet
+ Aktiver Knoten
+ Senden
+ Schreiben
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 72fa388..adf6794 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -2,8 +2,6 @@
Abit
Message Detail
Subscription Detail
- Disable Sync
- Enable Sync
Bitmessage active
Wi-Fi Connection Mode
Settings
@@ -38,4 +36,6 @@
Synchronization Timeout
Timeout in seconds
Write message
+ Full node
+ Send
From 1659aaa1ee552de1d0f95396a0cec87da4bce9a4 Mon Sep 17 00:00:00 2001
From: Christian Basler
Date: Mon, 12 Oct 2015 16:00:43 +0200
Subject: [PATCH 003/110] Added label "Archive"
---
.../main/java/ch/dissem/apps/abit/MessageListActivity.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java b/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
index 0ec6bfa..2bb0d6c 100644
--- a/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
+++ b/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
@@ -212,6 +212,12 @@ public class MessageListActivity extends AppCompatActivity
}
drawerItems.add(item);
}
+ drawerItems.add(new PrimaryDrawerItem()
+ .withName(R.string.archive)
+ .withTag(null)
+ .withIcon(CommunityMaterial.Icon.cmd_archive)
+ );
+
new DrawerBuilder()
.withActivity(this)
From 13cb804fc288a51e3d964fa1a6cc69b1f7fd4b7b Mon Sep 17 00:00:00 2001
From: Christian Basler
Date: Sun, 18 Oct 2015 13:40:17 +0200
Subject: [PATCH 004/110] Added ongoing notification showing network status -
renamed packages to be more consistent - somewhate refactored the way
notifications are made
---
.../apps/abit/AbstractItemListFragment.java | 2 +-
.../apps/abit/MessageDetailFragment.java | 2 +-
.../dissem/apps/abit/MessageListActivity.java | 9 +-
.../dissem/apps/abit/MessageListFragment.java | 10 +--
.../ActionBarListener.java | 2 +-
.../ListSelectionListener.java | 2 +-
.../MessageListener.java | 60 ++-----------
.../notification/AbstractNotification.java | 33 +++++++
.../notification/NetworkNotification.java | 87 +++++++++++++++++++
.../notification/NewMessageNotification.java | 81 +++++++++++++++++
.../AndroidAddressRepository.java | 2 +-
.../AndroidInventory.java | 4 +-
.../AndroidMessageRepository.java | 4 +-
.../SqlHelper.java | 4 +-
.../dissem/apps/abit/service/Singleton.java | 11 ++-
.../apps/abit/{utils => util}/Assets.java | 2 +-
.../apps/abit/{utils => util}/Drawables.java | 19 +++-
app/src/main/res/values-de/strings.xml | 6 +-
app/src/main/res/values/strings.xml | 4 +
19 files changed, 262 insertions(+), 82 deletions(-)
rename app/src/main/java/ch/dissem/apps/abit/{listeners => listener}/ActionBarListener.java (94%)
rename app/src/main/java/ch/dissem/apps/abit/{listeners => listener}/ListSelectionListener.java (95%)
rename app/src/main/java/ch/dissem/apps/abit/{listeners => listener}/MessageListener.java (54%)
create mode 100644 app/src/main/java/ch/dissem/apps/abit/notification/AbstractNotification.java
create mode 100644 app/src/main/java/ch/dissem/apps/abit/notification/NetworkNotification.java
create mode 100644 app/src/main/java/ch/dissem/apps/abit/notification/NewMessageNotification.java
rename app/src/main/java/ch/dissem/apps/abit/{repositories => repository}/AndroidAddressRepository.java (99%)
rename app/src/main/java/ch/dissem/apps/abit/{repositories => repository}/AndroidInventory.java (98%)
rename app/src/main/java/ch/dissem/apps/abit/{repositories => repository}/AndroidMessageRepository.java (99%)
rename app/src/main/java/ch/dissem/apps/abit/{repositories => repository}/SqlHelper.java (96%)
rename app/src/main/java/ch/dissem/apps/abit/{utils => util}/Assets.java (98%)
rename app/src/main/java/ch/dissem/apps/abit/{utils => util}/Drawables.java (65%)
diff --git a/app/src/main/java/ch/dissem/apps/abit/AbstractItemListFragment.java b/app/src/main/java/ch/dissem/apps/abit/AbstractItemListFragment.java
index 7ddfce9..65acd36 100644
--- a/app/src/main/java/ch/dissem/apps/abit/AbstractItemListFragment.java
+++ b/app/src/main/java/ch/dissem/apps/abit/AbstractItemListFragment.java
@@ -21,7 +21,7 @@ import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ListView;
-import ch.dissem.apps.abit.listeners.ListSelectionListener;
+import ch.dissem.apps.abit.listener.ListSelectionListener;
import ch.dissem.apps.abit.service.Singleton;
import ch.dissem.bitmessage.BitmessageContext;
import ch.dissem.bitmessage.entity.valueobject.Label;
diff --git a/app/src/main/java/ch/dissem/apps/abit/MessageDetailFragment.java b/app/src/main/java/ch/dissem/apps/abit/MessageDetailFragment.java
index dbca865..4652f6b 100644
--- a/app/src/main/java/ch/dissem/apps/abit/MessageDetailFragment.java
+++ b/app/src/main/java/ch/dissem/apps/abit/MessageDetailFragment.java
@@ -7,7 +7,7 @@ import android.view.*;
import android.widget.ImageView;
import android.widget.TextView;
import ch.dissem.apps.abit.service.Singleton;
-import ch.dissem.apps.abit.utils.Drawables;
+import ch.dissem.apps.abit.util.Drawables;
import ch.dissem.bitmessage.BitmessageContext;
import ch.dissem.bitmessage.entity.BitmessageAddress;
import ch.dissem.bitmessage.entity.Plaintext;
diff --git a/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java b/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
index 2bb0d6c..51de702 100644
--- a/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
+++ b/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
@@ -10,13 +10,13 @@ import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
-import ch.dissem.apps.abit.listeners.ActionBarListener;
-import ch.dissem.apps.abit.listeners.ListSelectionListener;
+import ch.dissem.apps.abit.listener.ActionBarListener;
+import ch.dissem.apps.abit.listener.ListSelectionListener;
+import ch.dissem.apps.abit.notification.NetworkNotification;
import ch.dissem.apps.abit.service.Singleton;
import ch.dissem.bitmessage.BitmessageContext;
import ch.dissem.bitmessage.entity.BitmessageAddress;
import ch.dissem.bitmessage.entity.Plaintext;
-import ch.dissem.bitmessage.entity.Streamable;
import ch.dissem.bitmessage.entity.valueobject.Label;
import com.mikepenz.community_material_typeface_library.CommunityMaterial;
@@ -39,6 +39,8 @@ import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Timer;
+import java.util.TimerTask;
/**
@@ -288,6 +290,7 @@ public class MessageListActivity extends AppCompatActivity
switch (item.getItemId()) {
case R.id.sync_disabled:
bmc.startup();
+ new NetworkNotification(this).show();
updateMenu();
return true;
case R.id.sync_enabled:
diff --git a/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java b/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java
index cb02e54..f251d8a 100644
--- a/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java
+++ b/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java
@@ -1,21 +1,15 @@
package ch.dissem.apps.abit;
-import android.app.Activity;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
-import android.support.v4.app.ListFragment;
import android.view.*;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
-import android.widget.ListView;
import android.widget.TextView;
-import ch.dissem.apps.abit.listeners.ActionBarListener;
-import ch.dissem.apps.abit.listeners.ListSelectionListener;
-import ch.dissem.apps.abit.service.Singleton;
-import ch.dissem.bitmessage.BitmessageContext;
-import ch.dissem.bitmessage.entity.BitmessageAddress;
+import ch.dissem.apps.abit.listener.ActionBarListener;
+import ch.dissem.apps.abit.listener.ListSelectionListener;
import ch.dissem.bitmessage.entity.Plaintext;
import ch.dissem.bitmessage.entity.valueobject.Label;
import ch.dissem.bitmessage.ports.MessageRepository;
diff --git a/app/src/main/java/ch/dissem/apps/abit/listeners/ActionBarListener.java b/app/src/main/java/ch/dissem/apps/abit/listener/ActionBarListener.java
similarity index 94%
rename from app/src/main/java/ch/dissem/apps/abit/listeners/ActionBarListener.java
rename to app/src/main/java/ch/dissem/apps/abit/listener/ActionBarListener.java
index 11b309a..7dfcdf2 100644
--- a/app/src/main/java/ch/dissem/apps/abit/listeners/ActionBarListener.java
+++ b/app/src/main/java/ch/dissem/apps/abit/listener/ActionBarListener.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package ch.dissem.apps.abit.listeners;
+package ch.dissem.apps.abit.listener;
/**
* Created by chris on 06.09.15.
diff --git a/app/src/main/java/ch/dissem/apps/abit/listeners/ListSelectionListener.java b/app/src/main/java/ch/dissem/apps/abit/listener/ListSelectionListener.java
similarity index 95%
rename from app/src/main/java/ch/dissem/apps/abit/listeners/ListSelectionListener.java
rename to app/src/main/java/ch/dissem/apps/abit/listener/ListSelectionListener.java
index 6e050a3..03fdc19 100644
--- a/app/src/main/java/ch/dissem/apps/abit/listeners/ListSelectionListener.java
+++ b/app/src/main/java/ch/dissem/apps/abit/listener/ListSelectionListener.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package ch.dissem.apps.abit.listeners;
+package ch.dissem.apps.abit.listener;
/**
* A callback interface that all activities containing this fragment must
diff --git a/app/src/main/java/ch/dissem/apps/abit/listeners/MessageListener.java b/app/src/main/java/ch/dissem/apps/abit/listener/MessageListener.java
similarity index 54%
rename from app/src/main/java/ch/dissem/apps/abit/listeners/MessageListener.java
rename to app/src/main/java/ch/dissem/apps/abit/listener/MessageListener.java
index 104ef70..edf17b3 100644
--- a/app/src/main/java/ch/dissem/apps/abit/listeners/MessageListener.java
+++ b/app/src/main/java/ch/dissem/apps/abit/listener/MessageListener.java
@@ -14,10 +14,9 @@
* limitations under the License.
*/
-package ch.dissem.apps.abit.listeners;
+package ch.dissem.apps.abit.listener;
import android.annotation.TargetApi;
-import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
@@ -34,9 +33,11 @@ import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.StyleSpan;
+
import ch.dissem.apps.abit.Identicon;
import ch.dissem.apps.abit.MessageListActivity;
import ch.dissem.apps.abit.R;
+import ch.dissem.apps.abit.notification.NewMessageNotification;
import ch.dissem.bitmessage.BitmessageContext;
import ch.dissem.bitmessage.entity.Plaintext;
@@ -50,18 +51,17 @@ import java.util.LinkedList;
*
*/
public class MessageListener implements BitmessageContext.Listener {
- private static final StyleSpan SPAN_EMPHASIS = new StyleSpan(Typeface.BOLD);
private final Context ctx;
private final NotificationManager manager;
private final LinkedList unacknowledged = new LinkedList<>();
- private final int pictureSize;
private int numberOfUnacknowledgedMessages = 0;
+ private final NewMessageNotification notification;
public MessageListener(Context ctx) {
this.ctx = ctx.getApplicationContext();
this.manager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
- this.pictureSize = getMaxContactPhotoSize(ctx);
+ this.notification = new NewMessageNotification(ctx);
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@@ -94,57 +94,15 @@ public class MessageListener implements BitmessageContext.Listener {
NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx);
if (numberOfUnacknowledgedMessages == 1) {
- Spannable bigText = new SpannableString(plaintext.getSubject() + "\n" + plaintext.getText());
- bigText.setSpan(SPAN_EMPHASIS, 0, plaintext.getSubject().length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
- builder.setSmallIcon(R.drawable.ic_notification_new_message)
- .setLargeIcon(toBitmap(new Identicon(plaintext.getFrom())))
- .setContentTitle(plaintext.getFrom().toString())
- .setContentText(plaintext.getSubject())
- .setStyle(new NotificationCompat.BigTextStyle().bigText(bigText))
- .setContentInfo("Info");
-
- Intent showMessageIntent = new Intent(ctx, MessageListActivity.class);
- showMessageIntent.putExtra(MessageListActivity.EXTRA_SHOW_MESSAGE, plaintext);
- PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 0, showMessageIntent, PendingIntent.FLAG_UPDATE_CURRENT);
- builder.setContentIntent(pendingIntent);
-
- builder.addAction(R.drawable.ic_action_reply, ctx.getString(R.string.reply), pendingIntent);
- builder.addAction(R.drawable.ic_action_delete, ctx.getString(R.string.delete), pendingIntent);
+ notification.singleNotification(plaintext);
} else {
- builder.setSmallIcon(R.drawable.ic_notification_new_message)
- .setContentTitle(ctx.getString(R.string.n_new_messages, this.unacknowledged.size()))
- .setContentText(ctx.getString(R.string.app_name));
-
- NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
- synchronized (unacknowledged) {
- inboxStyle.setBigContentTitle(ctx.getString(R.string.n_new_messages, numberOfUnacknowledgedMessages));
- for (Plaintext msg : unacknowledged) {
- Spannable sb = new SpannableString(msg.getFrom() + " " + msg.getSubject());
- sb.setSpan(SPAN_EMPHASIS, 0, String.valueOf(msg.getFrom()).length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
- inboxStyle.addLine(sb);
- }
- }
- builder.setStyle(inboxStyle);
-
- Intent intent = new Intent(ctx, MessageListActivity.class);
- intent.setAction(MessageListActivity.ACTION_SHOW_INBOX);
- PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 1, intent, 0);
- builder.setContentIntent(pendingIntent);
+ notification.multiNotification(unacknowledged, numberOfUnacknowledgedMessages);
}
-
- manager.notify(0, builder.build());
- }
-
- private Bitmap toBitmap(Identicon identicon) {
- Bitmap bitmap = Bitmap.createBitmap(pictureSize, pictureSize, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
- identicon.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
- identicon.draw(canvas);
- return bitmap;
+ notification.show();
}
public void resetNotification() {
- manager.cancel(0);
+ notification.hide();
synchronized (unacknowledged) {
unacknowledged.clear();
numberOfUnacknowledgedMessages = 0;
diff --git a/app/src/main/java/ch/dissem/apps/abit/notification/AbstractNotification.java b/app/src/main/java/ch/dissem/apps/abit/notification/AbstractNotification.java
new file mode 100644
index 0000000..60bb86d
--- /dev/null
+++ b/app/src/main/java/ch/dissem/apps/abit/notification/AbstractNotification.java
@@ -0,0 +1,33 @@
+package ch.dissem.apps.abit.notification;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.content.Context;
+
+/**
+ * Some base class to create and handle notifications.
+ */
+public abstract class AbstractNotification {
+ protected final Context ctx;
+ protected final NotificationManager manager;
+ public Notification notification;
+
+
+ public AbstractNotification(Context ctx) {
+ this.ctx = ctx;
+ this.manager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
+ }
+
+ /**
+ * @return an id unique to this notification class
+ */
+ protected abstract int getNotificationId();
+
+ public void show() {
+ manager.notify(getNotificationId(), notification);
+ }
+
+ public void hide() {
+ manager.cancel(getNotificationId());
+ }
+}
diff --git a/app/src/main/java/ch/dissem/apps/abit/notification/NetworkNotification.java b/app/src/main/java/ch/dissem/apps/abit/notification/NetworkNotification.java
new file mode 100644
index 0000000..7ddb271
--- /dev/null
+++ b/app/src/main/java/ch/dissem/apps/abit/notification/NetworkNotification.java
@@ -0,0 +1,87 @@
+package ch.dissem.apps.abit.notification;
+
+import android.annotation.SuppressLint;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.support.v7.app.NotificationCompat;
+
+import java.util.Timer;
+import java.util.TimerTask;
+
+import ch.dissem.apps.abit.MessageListActivity;
+import ch.dissem.apps.abit.R;
+import ch.dissem.apps.abit.service.Singleton;
+import ch.dissem.bitmessage.BitmessageContext;
+import ch.dissem.bitmessage.utils.Property;
+
+/**
+ * Shows the network status (as long as the client is connected as a full node)
+ */
+public class NetworkNotification extends AbstractNotification {
+ private final BitmessageContext bmc;
+ private NotificationCompat.Builder builder;
+
+ public NetworkNotification(Context ctx) {
+ super(ctx);
+ builder = new NotificationCompat.Builder(ctx);
+ builder.setSmallIcon(R.drawable.ic_notification_new_message)
+ .setContentTitle(ctx.getString(R.string.bitmessage_active));
+ builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
+ bmc = Singleton.getBitmessageContext(ctx);
+ }
+
+ @SuppressLint("StringFormatMatches")
+ private boolean update() {
+ boolean running = bmc.isRunning();
+ builder.setOngoing(running);
+ Property connections = bmc.status().getProperty("network").getProperty("connections");
+ if (!running) {
+ builder.setContentText(ctx.getString(R.string.connection_info_disconnected));
+ } else if (connections.getProperties().length == 0) {
+ builder.setContentText(ctx.getString(R.string.connection_info_pending));
+ } else {
+ StringBuilder info = new StringBuilder();
+ for (Property stream : connections.getProperties()) {
+ int streamNumber = Integer.parseInt(stream.getName().substring("stream ".length()));
+ Integer nodeCount = (Integer) stream.getProperty("nodes").getValue();
+ if (nodeCount == 1) {
+ info.append(ctx.getString(R.string.connection_info_1,
+ streamNumber));
+ } else {
+ info.append(ctx.getString(R.string.connection_info_n,
+ streamNumber, nodeCount));
+ }
+ info.append('\n');
+ }
+ builder.setContentText(info);
+ }
+ Intent showMessageIntent = new Intent(ctx, MessageListActivity.class);
+ PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 1, showMessageIntent, 0);
+ builder.setContentIntent(pendingIntent);
+ notification = builder.build();
+ return running;
+ }
+
+ @Override
+ public void show() {
+ update();
+ super.show();
+
+ final Timer timer = new Timer();
+ timer.schedule(new TimerTask() {
+ @Override
+ public void run() {
+ if (!update()) {
+ cancel();
+ }
+ NetworkNotification.super.show();
+ }
+ }, 10_000, 10_000);
+ }
+
+ @Override
+ protected int getNotificationId() {
+ return 2;
+ }
+}
diff --git a/app/src/main/java/ch/dissem/apps/abit/notification/NewMessageNotification.java b/app/src/main/java/ch/dissem/apps/abit/notification/NewMessageNotification.java
new file mode 100644
index 0000000..ee10bf1
--- /dev/null
+++ b/app/src/main/java/ch/dissem/apps/abit/notification/NewMessageNotification.java
@@ -0,0 +1,81 @@
+package ch.dissem.apps.abit.notification;
+
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Typeface;
+import android.support.v7.app.NotificationCompat;
+import android.text.Spannable;
+import android.text.SpannableString;
+import android.text.Spanned;
+import android.text.style.StyleSpan;
+
+import java.util.LinkedList;
+
+import ch.dissem.apps.abit.Identicon;
+import ch.dissem.apps.abit.MessageListActivity;
+import ch.dissem.apps.abit.R;
+import ch.dissem.bitmessage.entity.Plaintext;
+
+import static ch.dissem.apps.abit.util.Drawables.toBitmap;
+
+public class NewMessageNotification extends AbstractNotification {
+ private static final StyleSpan SPAN_EMPHASIS = new StyleSpan(Typeface.BOLD);
+
+ public NewMessageNotification(Context ctx) {
+ super(ctx);
+ }
+
+ public NewMessageNotification singleNotification(Plaintext plaintext) {
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx);
+ Spannable bigText = new SpannableString(plaintext.getSubject() + "\n" + plaintext.getText());
+ bigText.setSpan(SPAN_EMPHASIS, 0, plaintext.getSubject().length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
+ builder.setSmallIcon(R.drawable.ic_notification_new_message)
+ .setLargeIcon(toBitmap(new Identicon(plaintext.getFrom()), 192))
+ .setContentTitle(plaintext.getFrom().toString())
+ .setContentText(plaintext.getSubject())
+ .setStyle(new NotificationCompat.BigTextStyle().bigText(bigText))
+ .setContentInfo("Info");
+
+ Intent showMessageIntent = new Intent(ctx, MessageListActivity.class);
+ showMessageIntent.putExtra(MessageListActivity.EXTRA_SHOW_MESSAGE, plaintext);
+ PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 0, showMessageIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ builder.setContentIntent(pendingIntent);
+
+ builder.addAction(R.drawable.ic_action_reply, ctx.getString(R.string.reply), pendingIntent);
+ builder.addAction(R.drawable.ic_action_delete, ctx.getString(R.string.delete), pendingIntent);
+ notification = builder.build();
+ return this;
+ }
+
+ public NewMessageNotification multiNotification(LinkedList unacknowledged, int numberOfUnacknowledgedMessages) {
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx);
+ builder.setSmallIcon(R.drawable.ic_notification_new_message)
+ .setContentTitle(ctx.getString(R.string.n_new_messages, unacknowledged.size()))
+ .setContentText(ctx.getString(R.string.app_name));
+
+ NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
+ synchronized (unacknowledged) {
+ inboxStyle.setBigContentTitle(ctx.getString(R.string.n_new_messages, numberOfUnacknowledgedMessages));
+ for (Plaintext msg : unacknowledged) {
+ Spannable sb = new SpannableString(msg.getFrom() + " " + msg.getSubject());
+ sb.setSpan(SPAN_EMPHASIS, 0, String.valueOf(msg.getFrom()).length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
+ inboxStyle.addLine(sb);
+ }
+ }
+ builder.setStyle(inboxStyle);
+
+ Intent intent = new Intent(ctx, MessageListActivity.class);
+ intent.setAction(MessageListActivity.ACTION_SHOW_INBOX);
+ PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 1, intent, 0);
+ builder.setContentIntent(pendingIntent);
+ notification = builder.build();
+ return this;
+ }
+
+ @Override
+ protected int getNotificationId() {
+ return 1;
+ }
+}
diff --git a/app/src/main/java/ch/dissem/apps/abit/repositories/AndroidAddressRepository.java b/app/src/main/java/ch/dissem/apps/abit/repository/AndroidAddressRepository.java
similarity index 99%
rename from app/src/main/java/ch/dissem/apps/abit/repositories/AndroidAddressRepository.java
rename to app/src/main/java/ch/dissem/apps/abit/repository/AndroidAddressRepository.java
index 6dee3d0..9d490df 100644
--- a/app/src/main/java/ch/dissem/apps/abit/repositories/AndroidAddressRepository.java
+++ b/app/src/main/java/ch/dissem/apps/abit/repository/AndroidAddressRepository.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package ch.dissem.apps.abit.repositories;
+package ch.dissem.apps.abit.repository;
import android.content.ContentValues;
import android.database.Cursor;
diff --git a/app/src/main/java/ch/dissem/apps/abit/repositories/AndroidInventory.java b/app/src/main/java/ch/dissem/apps/abit/repository/AndroidInventory.java
similarity index 98%
rename from app/src/main/java/ch/dissem/apps/abit/repositories/AndroidInventory.java
rename to app/src/main/java/ch/dissem/apps/abit/repository/AndroidInventory.java
index cafb76b..32b9ed8 100644
--- a/app/src/main/java/ch/dissem/apps/abit/repositories/AndroidInventory.java
+++ b/app/src/main/java/ch/dissem/apps/abit/repository/AndroidInventory.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package ch.dissem.apps.abit.repositories;
+package ch.dissem.apps.abit.repository;
import android.content.ContentValues;
import android.database.Cursor;
@@ -36,7 +36,7 @@ import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
-import static ch.dissem.apps.abit.repositories.SqlHelper.join;
+import static ch.dissem.apps.abit.repository.SqlHelper.join;
import static ch.dissem.bitmessage.utils.UnixTime.now;
/**
diff --git a/app/src/main/java/ch/dissem/apps/abit/repositories/AndroidMessageRepository.java b/app/src/main/java/ch/dissem/apps/abit/repository/AndroidMessageRepository.java
similarity index 99%
rename from app/src/main/java/ch/dissem/apps/abit/repositories/AndroidMessageRepository.java
rename to app/src/main/java/ch/dissem/apps/abit/repository/AndroidMessageRepository.java
index 30bacb8..eba1b0d 100644
--- a/app/src/main/java/ch/dissem/apps/abit/repositories/AndroidMessageRepository.java
+++ b/app/src/main/java/ch/dissem/apps/abit/repository/AndroidMessageRepository.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package ch.dissem.apps.abit.repositories;
+package ch.dissem.apps.abit.repository;
import android.content.ContentValues;
import android.content.Context;
@@ -40,7 +40,7 @@ import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
-import static ch.dissem.apps.abit.repositories.SqlHelper.join;
+import static ch.dissem.apps.abit.repository.SqlHelper.join;
/**
* {@link MessageRepository} implementation using the Android SQL API.
diff --git a/app/src/main/java/ch/dissem/apps/abit/repositories/SqlHelper.java b/app/src/main/java/ch/dissem/apps/abit/repository/SqlHelper.java
similarity index 96%
rename from app/src/main/java/ch/dissem/apps/abit/repositories/SqlHelper.java
rename to app/src/main/java/ch/dissem/apps/abit/repository/SqlHelper.java
index 0d8abfd..f79bbb2 100644
--- a/app/src/main/java/ch/dissem/apps/abit/repositories/SqlHelper.java
+++ b/app/src/main/java/ch/dissem/apps/abit/repository/SqlHelper.java
@@ -14,12 +14,12 @@
* limitations under the License.
*/
-package ch.dissem.apps.abit.repositories;
+package ch.dissem.apps.abit.repository;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
-import ch.dissem.apps.abit.utils.Assets;
+import ch.dissem.apps.abit.util.Assets;
/**
* Handles database migration and provides access.
diff --git a/app/src/main/java/ch/dissem/apps/abit/service/Singleton.java b/app/src/main/java/ch/dissem/apps/abit/service/Singleton.java
index 76c3301..220dc36 100644
--- a/app/src/main/java/ch/dissem/apps/abit/service/Singleton.java
+++ b/app/src/main/java/ch/dissem/apps/abit/service/Singleton.java
@@ -1,13 +1,12 @@
package ch.dissem.apps.abit.service;
-import android.app.NotificationManager;
import android.content.Context;
-import ch.dissem.apps.abit.listeners.MessageListener;
-import ch.dissem.apps.abit.repositories.AndroidAddressRepository;
-import ch.dissem.apps.abit.repositories.AndroidInventory;
-import ch.dissem.apps.abit.repositories.AndroidMessageRepository;
-import ch.dissem.apps.abit.repositories.SqlHelper;
+import ch.dissem.apps.abit.listener.MessageListener;
+import ch.dissem.apps.abit.repository.AndroidAddressRepository;
+import ch.dissem.apps.abit.repository.AndroidInventory;
+import ch.dissem.apps.abit.repository.AndroidMessageRepository;
+import ch.dissem.apps.abit.repository.SqlHelper;
import ch.dissem.bitmessage.BitmessageContext;
import ch.dissem.bitmessage.networking.DefaultNetworkHandler;
import ch.dissem.bitmessage.ports.MemoryNodeRegistry;
diff --git a/app/src/main/java/ch/dissem/apps/abit/utils/Assets.java b/app/src/main/java/ch/dissem/apps/abit/util/Assets.java
similarity index 98%
rename from app/src/main/java/ch/dissem/apps/abit/utils/Assets.java
rename to app/src/main/java/ch/dissem/apps/abit/util/Assets.java
index 71fe65b..e3e2dc6 100644
--- a/app/src/main/java/ch/dissem/apps/abit/utils/Assets.java
+++ b/app/src/main/java/ch/dissem/apps/abit/util/Assets.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package ch.dissem.apps.abit.utils;
+package ch.dissem.apps.abit.util;
import android.content.Context;
diff --git a/app/src/main/java/ch/dissem/apps/abit/utils/Drawables.java b/app/src/main/java/ch/dissem/apps/abit/util/Drawables.java
similarity index 65%
rename from app/src/main/java/ch/dissem/apps/abit/utils/Drawables.java
rename to app/src/main/java/ch/dissem/apps/abit/util/Drawables.java
index d646608..e392e36 100644
--- a/app/src/main/java/ch/dissem/apps/abit/utils/Drawables.java
+++ b/app/src/main/java/ch/dissem/apps/abit/util/Drawables.java
@@ -14,11 +14,16 @@
* limitations under the License.
*/
-package ch.dissem.apps.abit.utils;
+package ch.dissem.apps.abit.util;
import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
import android.view.Menu;
+
+import ch.dissem.apps.abit.Identicon;
import ch.dissem.apps.abit.R;
+
import com.mikepenz.google_material_typeface_library.GoogleMaterial;
import com.mikepenz.iconics.IconicsDrawable;
@@ -29,4 +34,16 @@ public class Drawables {
public static void addIcon(Context ctx, Menu menu, int menuItem, GoogleMaterial.Icon icon) {
menu.findItem(menuItem).setIcon(new IconicsDrawable(ctx, icon).colorRes(R.color.primary_text_default_material_dark).actionBar());
}
+
+ public static Bitmap toBitmap(Identicon identicon, int size) {
+ return toBitmap(identicon, size, size);
+ }
+
+ public static Bitmap toBitmap(Identicon identicon, int width, int height) {
+ Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+ identicon.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
+ identicon.draw(canvas);
+ return bitmap;
+ }
}
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 2222570..d296eca 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -30,7 +30,11 @@
Archiv
Papierkorb leeren
Als ungelesen markieren
- Stream #%d
+ Stream %d
Aktiv
Abonnement
+ Stream %1$d: eine Verbindung
+ Stream %1$d: %2$d Verbindungen
+ Getrennt
+ Verbindung wird aufgebaut…
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 43775b5..baf9d23 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -18,6 +18,8 @@
Import Contact
Settings
+ Stream #%1$d: one connection
+ Stream #%1$d: %2$d connections
Import Address
Add to contacts
Label
@@ -33,4 +35,6 @@
Empty Trash
Stream #%d
Enabled
+ Disconnected
+ Connecting…
From 64e0479a37d7b29b62137c06c58a3d01b0caaa4e Mon Sep 17 00:00:00 2001
From: Christian Basler
Date: Sun, 18 Oct 2015 16:42:41 +0200
Subject: [PATCH 005/110] Changed notification icon and updated library
versions
---
app/build.gradle | 6 +++---
.../abit/notification/NetworkNotification.java | 8 ++++----
.../ic_notification_full_node.png | Bin 0 -> 423 bytes
.../drawable-hdpi/ic_notification_full_node.png | Bin 0 -> 391 bytes
.../ic_notification_full_node.png | Bin 0 -> 291 bytes
.../drawable-mdpi/ic_notification_full_node.png | Bin 0 -> 317 bytes
.../ic_notification_full_node.png | Bin 0 -> 584 bytes
.../drawable-xhdpi/ic_notification_full_node.png | Bin 0 -> 562 bytes
.../ic_notification_full_node.png | Bin 0 -> 976 bytes
.../drawable-xxhdpi/ic_notification_full_node.png | Bin 0 -> 699 bytes
10 files changed, 7 insertions(+), 7 deletions(-)
create mode 100644 app/src/main/res/drawable-hdpi-v11/ic_notification_full_node.png
create mode 100644 app/src/main/res/drawable-hdpi/ic_notification_full_node.png
create mode 100644 app/src/main/res/drawable-mdpi-v11/ic_notification_full_node.png
create mode 100644 app/src/main/res/drawable-mdpi/ic_notification_full_node.png
create mode 100644 app/src/main/res/drawable-xhdpi-v11/ic_notification_full_node.png
create mode 100644 app/src/main/res/drawable-xhdpi/ic_notification_full_node.png
create mode 100644 app/src/main/res/drawable-xxhdpi-v11/ic_notification_full_node.png
create mode 100644 app/src/main/res/drawable-xxhdpi/ic_notification_full_node.png
diff --git a/app/build.gradle b/app/build.gradle
index 0e3dcb4..be506a6 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -22,9 +22,9 @@ android {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
- compile 'com.android.support:appcompat-v7:23.0.1'
- compile 'com.android.support:support-v4:23.0.1'
- compile 'com.android.support:design:23.0.1'
+ compile 'com.android.support:appcompat-v7:23.1.0'
+ compile 'com.android.support:support-v4:23.1.0'
+ compile 'com.android.support:design:23.1.0'
compile 'ch.dissem.jabit:jabit-domain:0.2.1-SNAPSHOT'
compile 'ch.dissem.jabit:jabit-networking:0.2.1-SNAPSHOT'
diff --git a/app/src/main/java/ch/dissem/apps/abit/notification/NetworkNotification.java b/app/src/main/java/ch/dissem/apps/abit/notification/NetworkNotification.java
index 7ddb271..b51cc47 100644
--- a/app/src/main/java/ch/dissem/apps/abit/notification/NetworkNotification.java
+++ b/app/src/main/java/ch/dissem/apps/abit/notification/NetworkNotification.java
@@ -24,11 +24,11 @@ public class NetworkNotification extends AbstractNotification {
public NetworkNotification(Context ctx) {
super(ctx);
- builder = new NotificationCompat.Builder(ctx);
- builder.setSmallIcon(R.drawable.ic_notification_new_message)
- .setContentTitle(ctx.getString(R.string.bitmessage_active));
- builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
bmc = Singleton.getBitmessageContext(ctx);
+ builder = new NotificationCompat.Builder(ctx);
+ builder.setSmallIcon(R.drawable.ic_notification_full_node)
+ .setContentTitle(ctx.getString(R.string.bitmessage_active))
+ .setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
}
@SuppressLint("StringFormatMatches")
diff --git a/app/src/main/res/drawable-hdpi-v11/ic_notification_full_node.png b/app/src/main/res/drawable-hdpi-v11/ic_notification_full_node.png
new file mode 100644
index 0000000000000000000000000000000000000000..337fc0404b7647452e5ba6b720d466933046efed
GIT binary patch
literal 423
zcmV;Y0a*TtP)W9ilDCGOgGV@v@EPq!zDSxL(Xc
zo?7tPT1wPoRIQiG8vdrBoTDRZnHDVJ2Hzst$lW*=walJ+Fs;b7IQ;KSF`z-sOhu#{
z`TO@MU=B?|g+_2K%tbDTXY9%&rCOo26xK|bd|>0(k)U>ytvp~-FXRckInWEeS}s)7
z3*A~SRMrcfS}ydc7n)Yv&{hh1p)QY8D{RBGv`i17?Y5YkoW^AisB$mQ#a4^$1KZU@q7UvFy>Jd?QbkBgxG@cd6Fb=
zzV8dyb%o^5k35s;UO)
z>ll%5!!TUfwk_Ha_wls0RS@1q%zKK3N<&>yH^uKQ~QN^g+B`*9>lTUj}H`oEe5O
z1w|i(NzLFg>dOG#nK0b=Hk@XC7~p<~&6@<1Jzdvlpy-O4rsgko3f3D6
l)4qwSszdpslaTmNcn1ovAN9_7+*beq002ovPDHLkV1l3RucQC~
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable-mdpi-v11/ic_notification_full_node.png b/app/src/main/res/drawable-mdpi-v11/ic_notification_full_node.png
new file mode 100644
index 0000000000000000000000000000000000000000..074a2acbab3ea5e7e8b8b3e2a0d9c1afcb6ec32f
GIT binary patch
literal 291
zcmV+;0o?wHP)!fI47>s2<_%IL~6UuaU
pKpYIjp(NlSAU3B;F+K{Y3IIqoOQx*0F#7-i002ovPDHLkV1gDtat{Ci
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable-mdpi/ic_notification_full_node.png b/app/src/main/res/drawable-mdpi/ic_notification_full_node.png
new file mode 100644
index 0000000000000000000000000000000000000000..02890154438263739941e580fa861ebc388c20ff
GIT binary patch
literal 317
zcmV-D0mA-?P)X1^@s6IQ*`u00035NklEzCXJ;o-803=4lP811W)INI{0u<9
zJtkH&G6q=+G-M6~&{;n^Iy(N7gMo&8U;vtSmRtjXdf$T#2x)I`|4$AE8Zs9gkgct)
z*==oYpMm&433wkc{16EXXc|AzAa|h2q4+RRV@OL&i^>20{~1R!{9pk9XLEoAr+3aC
P00000NkvXXu0mjfw+4as
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable-xhdpi-v11/ic_notification_full_node.png b/app/src/main/res/drawable-xhdpi-v11/ic_notification_full_node.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d59a55d4ddcbbe07c7ea8892afda0c416554dc4
GIT binary patch
literal 584
zcmV-O0=NB%P)8wG%zwz!7#O2C@6?K^)Cq82uUj!twazLv5jUSA}H9Rjp#zqqI8w++o%w_
z5?qLiD+?u1(L#)=MjbtV54*3^_EBkS;HL^s
zUYi<-1gL>UQv-(qYGB{gz-oXRh?p7}4^RVprUst+a1)D{1ycj}Wd;dCdgIOidW8NL
zfPJ7U(J{%ehx30r=`-%c*N#iZGB_@AE2o%>I|~`sL%)o(Q6EgB`c-xUk5hTM$-@&&
zV;u*wTYK@Ac7_vq$zMcAQdd5~dqM-c@Lo>iW?iJuhd#<$Y{4U69R}Oj*x1c*lgmkKR{_$V%2bS3@=u9{6r;pY8*Ke&h+H`(M52;ByR
zLLjzXwxB2_S@lI1NgaPj5=kQX%Hvv?4?gDJ+?n~lIp@qw3`0XhLqkJD<9~x?Sx>Xs
z>^k&kGMQc49q7&H^K0^LXu^ohrqk&V?Vn^asbaBM7v(p;{}yAkGXoP=NssANyy8%uZP3orr+;Z{g63o
zQbX5@ld~nns}!1Q=eu8Vq0GbF(JRFfo}klL3E3b-dl`vD4oT@dNvrItUh#3lU6PJI
zpKmB^nUJECnkci_148PeA_nSq86XNj4IVz&WdQz=2sk_*&nZ-+CfXH)>vNKqk2V-+kb<}8
zmk&eNp240ev3vem-JOBUy07*qoM6N<$g4OE)
Ag#Z8m
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable-xxhdpi-v11/ic_notification_full_node.png b/app/src/main/res/drawable-xxhdpi-v11/ic_notification_full_node.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b736bfbc9a79b9db4edf8551b2937648969c568
GIT binary patch
literal 976
zcmV;>126oEP)|CKQ&1j1km*bYvB``|VB40=E}_yC&t*-@|=ECORdMmicZ7R(0~;5fJm
z9?^t0@B{RMe$WSgf=+(+5V4j
zRTX4|ri0a73B6|cB%$~TtN{5zG$zb&x=eE;v`2TS@Z12X^tDLVhqP6HEk8Snzo*sl=aivj}@(NH)j=yFm@O%dqM<{?S)Z
zIbt=E)EHnAx6%XP5_kq$Xim>C*Ey+5iqczbNiy6vM{0|FPzuh0M)pg7mb4{bz;ck|
zwn1~i7WPnnH|AgM1ch#zvj$vX(HAkn(^*;hZdJsEG^fP`S1)Li%#+H%0x&J5yu^eo
zU$TiqtRSn8zoC)++I|{Uz%n2+8G~{eTAcw6t3*a65*6#f%w!B&$)2Xqq^BY@NhX!m
zoIHevvZYrsc5ToraGvAfoJ0(g*u3Jis@QEwDme&dBx2AG@YvWV=>qmjO7w3cqu6dPD&&0WRR?$@5Wxq0$J;1keKtwVuNIX)HoT`mB#f?B9in{
z=VXv{?7uBGNG77KP6jnwo`WQMx}6NVWAQF#n18#R465cTvQ;vwZF4ecn~7aZu~m{@
znw<>Fx3Cu*EIH@D7_Xa`1HcAL4SEVH^tcBr;tzu~QAXYcp`F5l!>Zs%O;X4Rt@4IAX!Np*{7si;;yGTVUz4t8HStWq*Cr~4FNYwR?R!+oPjg4P^u@b1GhU$
zSSQKN(uZtIq<8CNALF+$>}UHR@ArmvPAzvUNyt;&y6qt+uUo+>Hn>fLO!8fC#rKmd
yJ91~J2#hv(y#CQ>)cp!w;0d@!5gz``29VxmqX`&ILwzxm-Svut#u@vdQQ3CY#NgbUJNPsgy@4
z%Qg8;?&01~m|Mfhg}I7HNC+W&2pJK46y;udhUa%1jmFKn#D&HS#bVJDluRZkqC6{g
zNL}G@_@r;*>GkKiTyA3FhbeV2H#VehKVp-WJWosfunDPqrsC=O+tcj%znJLJ#%$(<
ztQh3=E__Vze3-(trVA7bcw^A^dbqH}4+j>Rxb?@WG!ludV&njtAQSQK*mnaN3Ai6*
z@kjmvjFDJ?>paj6kob2nbgb7*Cif*A--R!E_$}=CD7e#a^BL_gbMic^|HM!z6bgkx
hp-?Ck3Wee~ege<<9~^<3M?(Mr002ovPDHLkV1jtXN2ve+
literal 0
HcmV?d00001
From e4d7bf48932804969f0d9e2717d79724d161e541 Mon Sep 17 00:00:00 2001
From: Christian Basler
Date: Sun, 18 Oct 2015 18:17:57 +0200
Subject: [PATCH 006/110] Changed to using vector drawables for action icons
---
.../ic_notification_full_node.png | Bin 423 -> 0 bytes
.../res/drawable-hdpi/ic_action_close.png | Bin 246 -> 0 bytes
.../res/drawable-hdpi/ic_action_delete.png | Bin 399 -> 0 bytes
.../drawable-hdpi/ic_action_mark_unread.png | Bin 347 -> 0 bytes
.../drawable-hdpi/ic_action_placeholder.png | Bin 678 -> 0 bytes
.../res/drawable-hdpi/ic_action_reply.png | Bin 632 -> 0 bytes
.../main/res/drawable-hdpi/ic_action_send.png | Bin 371 -> 0 bytes
.../drawable-hdpi/ic_fab_compose_message.png | Bin 862 -> 0 bytes
.../ic_notification_full_node.png | Bin 391 -> 0 bytes
.../ic_notification_new_message.png | Bin 356 -> 0 bytes
.../main/res/drawable-hdpi/ic_plus_sign.png | Bin 302 -> 0 bytes
.../ic_notification_full_node.png | Bin 291 -> 0 bytes
.../res/drawable-mdpi/ic_action_close.png | Bin 182 -> 0 bytes
.../res/drawable-mdpi/ic_action_delete.png | Bin 257 -> 0 bytes
.../drawable-mdpi/ic_action_mark_unread.png | Bin 257 -> 0 bytes
.../drawable-mdpi/ic_action_placeholder.png | Bin 433 -> 0 bytes
.../res/drawable-mdpi/ic_action_reply.png | Bin 412 -> 0 bytes
.../main/res/drawable-mdpi/ic_action_send.png | Bin 277 -> 0 bytes
.../drawable-mdpi/ic_fab_compose_message.png | Bin 593 -> 0 bytes
.../ic_notification_full_node.png | Bin 317 -> 0 bytes
.../ic_notification_new_message.png | Bin 273 -> 0 bytes
.../main/res/drawable-mdpi/ic_plus_sign.png | Bin 232 -> 0 bytes
.../ic_notification_full_node.png | Bin 584 -> 0 bytes
.../res/drawable-xhdpi/ic_action_close.png | Bin 280 -> 0 bytes
.../res/drawable-xhdpi/ic_action_delete.png | Bin 491 -> 0 bytes
.../drawable-xhdpi/ic_action_mark_unread.png | Bin 394 -> 0 bytes
.../drawable-xhdpi/ic_action_placeholder.png | Bin 844 -> 0 bytes
.../res/drawable-xhdpi/ic_action_reply.png | Bin 849 -> 0 bytes
.../res/drawable-xhdpi/ic_action_send.png | Bin 497 -> 0 bytes
.../drawable-xhdpi/ic_fab_compose_message.png | Bin 1174 -> 0 bytes
.../ic_notification_full_node.png | Bin 562 -> 0 bytes
.../ic_notification_new_message.png | Bin 455 -> 0 bytes
.../main/res/drawable-xhdpi/ic_plus_sign.png | Bin 383 -> 0 bytes
.../ic_notification_full_node.png | Bin 976 -> 0 bytes
.../res/drawable-xxhdpi/ic_action_close.png | Bin 422 -> 0 bytes
.../res/drawable-xxhdpi/ic_action_delete.png | Bin 849 -> 0 bytes
.../drawable-xxhdpi/ic_action_mark_unread.png | Bin 620 -> 0 bytes
.../drawable-xxhdpi/ic_action_placeholder.png | Bin 1391 -> 0 bytes
.../res/drawable-xxhdpi/ic_action_reply.png | Bin 1364 -> 0 bytes
.../res/drawable-xxhdpi/ic_action_send.png | Bin 814 -> 0 bytes
.../ic_fab_compose_message.png | Bin 1821 -> 0 bytes
.../ic_notification_full_node.png | Bin 699 -> 0 bytes
.../ic_notification_new_message.png | Bin 660 -> 0 bytes
.../main/res/drawable-xxhdpi/ic_plus_sign.png | Bin 759 -> 0 bytes
.../res/drawable-xxxhdpi/ic_action_delete.png | Bin 1072 -> 0 bytes
.../res/drawable-xxxhdpi/ic_action_reply.png | Bin 1929 -> 0 bytes
.../res/drawable-xxxhdpi/ic_plus_sign.png | Bin 1043 -> 0 bytes
.../main/res/drawable/ic_action_archive.xml | 9 ++++
app/src/main/res/drawable/ic_action_close.xml | 9 ++++
.../drawable/ic_action_compose_message.xml | 9 ++++
.../res/drawable/ic_action_mark_unread.xml | 9 ++++
app/src/main/res/drawable/ic_action_reply.xml | 9 ++++
app/src/main/res/drawable/ic_action_send.xml | 9 ++++
.../drawable/ic_notification_full_node.xml | 9 ++++
.../main/res/layout/fragment_message_list.xml | 2 +-
.../res/layout/fragment_subscribtions.xml | 2 +-
app/src/main/res/layout/toolbar_layout.xml | 47 +++++++++---------
app/src/main/res/menu/message.xml | 8 +--
app/src/main/res/menu/message_list.xml | 2 +-
app/src/main/res/values/colors.xml | 1 +
build.gradle | 2 +-
61 files changed, 95 insertions(+), 32 deletions(-)
delete mode 100644 app/src/main/res/drawable-hdpi-v11/ic_notification_full_node.png
delete mode 100644 app/src/main/res/drawable-hdpi/ic_action_close.png
delete mode 100755 app/src/main/res/drawable-hdpi/ic_action_delete.png
delete mode 100644 app/src/main/res/drawable-hdpi/ic_action_mark_unread.png
delete mode 100644 app/src/main/res/drawable-hdpi/ic_action_placeholder.png
delete mode 100755 app/src/main/res/drawable-hdpi/ic_action_reply.png
delete mode 100644 app/src/main/res/drawable-hdpi/ic_action_send.png
delete mode 100644 app/src/main/res/drawable-hdpi/ic_fab_compose_message.png
delete mode 100644 app/src/main/res/drawable-hdpi/ic_notification_full_node.png
delete mode 100644 app/src/main/res/drawable-hdpi/ic_notification_new_message.png
delete mode 100755 app/src/main/res/drawable-hdpi/ic_plus_sign.png
delete mode 100644 app/src/main/res/drawable-mdpi-v11/ic_notification_full_node.png
delete mode 100644 app/src/main/res/drawable-mdpi/ic_action_close.png
delete mode 100755 app/src/main/res/drawable-mdpi/ic_action_delete.png
delete mode 100644 app/src/main/res/drawable-mdpi/ic_action_mark_unread.png
delete mode 100644 app/src/main/res/drawable-mdpi/ic_action_placeholder.png
delete mode 100755 app/src/main/res/drawable-mdpi/ic_action_reply.png
delete mode 100644 app/src/main/res/drawable-mdpi/ic_action_send.png
delete mode 100644 app/src/main/res/drawable-mdpi/ic_fab_compose_message.png
delete mode 100644 app/src/main/res/drawable-mdpi/ic_notification_full_node.png
delete mode 100644 app/src/main/res/drawable-mdpi/ic_notification_new_message.png
delete mode 100755 app/src/main/res/drawable-mdpi/ic_plus_sign.png
delete mode 100644 app/src/main/res/drawable-xhdpi-v11/ic_notification_full_node.png
delete mode 100644 app/src/main/res/drawable-xhdpi/ic_action_close.png
delete mode 100755 app/src/main/res/drawable-xhdpi/ic_action_delete.png
delete mode 100644 app/src/main/res/drawable-xhdpi/ic_action_mark_unread.png
delete mode 100644 app/src/main/res/drawable-xhdpi/ic_action_placeholder.png
delete mode 100755 app/src/main/res/drawable-xhdpi/ic_action_reply.png
delete mode 100644 app/src/main/res/drawable-xhdpi/ic_action_send.png
delete mode 100644 app/src/main/res/drawable-xhdpi/ic_fab_compose_message.png
delete mode 100644 app/src/main/res/drawable-xhdpi/ic_notification_full_node.png
delete mode 100644 app/src/main/res/drawable-xhdpi/ic_notification_new_message.png
delete mode 100755 app/src/main/res/drawable-xhdpi/ic_plus_sign.png
delete mode 100644 app/src/main/res/drawable-xxhdpi-v11/ic_notification_full_node.png
delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_close.png
delete mode 100755 app/src/main/res/drawable-xxhdpi/ic_action_delete.png
delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_mark_unread.png
delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_placeholder.png
delete mode 100755 app/src/main/res/drawable-xxhdpi/ic_action_reply.png
delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_send.png
delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_fab_compose_message.png
delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_notification_full_node.png
delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_notification_new_message.png
delete mode 100755 app/src/main/res/drawable-xxhdpi/ic_plus_sign.png
delete mode 100755 app/src/main/res/drawable-xxxhdpi/ic_action_delete.png
delete mode 100755 app/src/main/res/drawable-xxxhdpi/ic_action_reply.png
delete mode 100755 app/src/main/res/drawable-xxxhdpi/ic_plus_sign.png
create mode 100644 app/src/main/res/drawable/ic_action_archive.xml
create mode 100644 app/src/main/res/drawable/ic_action_close.xml
create mode 100644 app/src/main/res/drawable/ic_action_compose_message.xml
create mode 100644 app/src/main/res/drawable/ic_action_mark_unread.xml
create mode 100644 app/src/main/res/drawable/ic_action_reply.xml
create mode 100644 app/src/main/res/drawable/ic_action_send.xml
create mode 100644 app/src/main/res/drawable/ic_notification_full_node.xml
diff --git a/app/src/main/res/drawable-hdpi-v11/ic_notification_full_node.png b/app/src/main/res/drawable-hdpi-v11/ic_notification_full_node.png
deleted file mode 100644
index 337fc0404b7647452e5ba6b720d466933046efed..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 423
zcmV;Y0a*TtP)W9ilDCGOgGV@v@EPq!zDSxL(Xc
zo?7tPT1wPoRIQiG8vdrBoTDRZnHDVJ2Hzst$lW*=walJ+Fs;b7IQ;KSF`z-sOhu#{
z`TO@MU=B?|g+_2K%tbDTXY9%&rCOo26xK|bd|>0(k)U>ytvp~-FXRckInWEeS}s)7
z3*A~SRMrcfS}ydc7n)Yv&{hh1p)QJ;|PEou$_YBvoTZ?9H
z{d?wAI=jE&M3q?&R_D#Q)OqRAwLsrPnU~(Iy;h*EvUQsEJ+VD5uc!C-rigA2|L5=U
zs_DHXr)jeBCC;r=-+MUKe~@3is5r;Udg1O*$5j|?oi4OX{4(bHtK1x?x?sBHi&Cjy
uPRzASTlQZ$Y`^+|eU9wMEgm4}B*uxB)yJN*N}mh#2!p4qpUXO@geCwHq-a+F
diff --git a/app/src/main/res/drawable-hdpi/ic_action_delete.png b/app/src/main/res/drawable-hdpi/ic_action_delete.png
deleted file mode 100755
index d912755d26e13bf4041b0a32f5bc945d68fb648c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 399
zcmV;A0dW3_P)(v+Y+u@73#?Fd5MEXVCNh5rN;HpeFE_CNKo9jD+5SS0gqH^H}IOlj#z;b~f||
zEHW`)mV8zMN5BJc(vmctN1jbf(C2r(w)1_MhrnZoK&1IxOd>D=L|~^%advtVu;)o9GLeRhQ+1g15*%;dQDV{`(es>hL3P`lvfDUBc#h
z<91+tPR*bBr<^%oJiaN=N0UfY_kGhyv?UZ
tq69o5b&3^%PUSTu*8~hAbqeYI1h$0%HZfX9U8n#6002ovPDHLkV1h_jswn^f
diff --git a/app/src/main/res/drawable-hdpi/ic_action_mark_unread.png b/app/src/main/res/drawable-hdpi/ic_action_mark_unread.png
deleted file mode 100644
index c9ce72462afd9eec60c99f24a6f6374b5273a58f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 347
zcmV-h0i^zkP)=h2T*U#D91bQLJyOMSVqsC;wD8Fv1dwplwZs85k&KvpbWdo6t^&
zAP9mW2%;GjMKKZ1JabaTz+U+9%smazfJXyU;mxCXTYFly6ZM7b9~-%$X1}WVu6phv
z>9s-O7u4vLY52y#Mz|G*j*%6L)hT@C2oF(vQ^!Y~3wOdniIJ>=@T^4m0JZWax{yKg
zp^6EF%MXoY7!#;GL*zEUXrp#^4#L=35i2TvBRoZnp79vDav$e_K}_VV$U=Blac8{K
zGag~AX~RKgMI41A-8~?B?sT&eVoe)QVk;`qTg%xh$p^x{UL{^e#^C7-;jOp}-9cXF
tXn+Q2fCgy5i-G_Cu|*IBK@bG-9#6$BFeoiTS5W`}002ovPDHLkV1l^$k+T2*
diff --git a/app/src/main/res/drawable-hdpi/ic_action_placeholder.png b/app/src/main/res/drawable-hdpi/ic_action_placeholder.png
deleted file mode 100644
index cde7713adafb858e31d495ae647969ec49a05c61..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 678
zcmV;X0$KfuP)1U{E6lkfK>?`8Ro<9JAsNaQ_u?V)`w7;{V|bp8-5
zf{YuqO#wf^W5;BIfKl*{%S!@9pqzLBlDRqo@P*YiZ6F`~0;Ql6dq!#6eb!1!(d->fg7eeLlj3llRWJZ
z)#(RMbO$<;!Eb>uCN__|)fUCgPNMftrb0~CfHhzZ+;Ia*f|yxUSPr*I+!oYhd1-yD`tqnKN@g&oecrW;1iHGr#Zkc4p3;fseU?>o)={bp*!iyss~mH5E`97SAJ
zW7*e0beiyf-S~=kc#W5Mfgg!&z4f#<`#^{f&$qD&LErHl^LUEityR_-q>9NEUw-vR
z+{NR*KvDow(x$CbKjAi>wKXiyZvyDc^HnS&E+qdV{O@k`s;P01&!E
z{FO=fYQ?dXDO48v8JF>)4M7t?tTl@wUPxnzzc^{VNgOEv1w_sskR+lsDfWtMh$3$s
zsQ`-&aSIO{)o1LgP3aU~dy5rVjdfU?BBV6u8!n`DrZy2M-ci?Ht3KvdVI#I;8+J^t
zxL-G(;Cd5$4nSQxrGAY@WOiXMc4K9Q&^Q=4kN0&Dxd01wr&NGxO`C8C`zk$nX}dyfgG>(Y4Z>NhHNn~
SmN@PJ0000LR%7E-o%E-hiD1MWqx(tsjWsq8A`8j=DGtYO%HVls<(V
z$k1Z6vFH5D`@(N2bai=~69ykMsVQ#y7y*oP>8u%c0W_SIZ-I+79v!3Tz$>nl2;41hCroafu
zf?Ch@0?8(po;NT9&VgmF${%6Lc^?KrwM*hlKz9If$$MvlfJh_Afaf8Dct*j;DZUsa
z48hzE5kxx9yZ#w`0zDw9weJUC0tC<>hkQABp^40aUQnf_)7L%$jK}o^7J+?WKoj~(
z_2RhIK0&;-EuI9c#P0-XWpO3-8yptL)Pl)80rc3E&+tF}10I29HHh(d9cLBUrPAWu
zg9iC&P-jb?1aE<#n#4nD<73Le9qmapiEG@`0!+ox_t%1pET?2B+w2jOnhatbRB+o4
zQJ=LTyB=KUCBjO>SdfF0o=mfN5`&_xTa1?vppWJd8}eg9;yaIla&gQGa9;~zmq?*g
zqP~*rJ1H~SmY2MvuAr@hZi@B^>So+_Le#f$-BKHabGs|t4xNZyBZ6h^?l~?=%+r+hQ
zaQ%?2yuJp!Do|cQ-EKKwZ!6c`wKXX%R9o6p?(#e|et(I(X_YJ$Vtt25=Od1(%B;f7*sLy;#)bX?w5$
z`7^fedK)jUXsYk0mkH6fnOBK!%CqEvL14RR-y1TBj7|B*JQ5??Yhi=-{+f?$}=*rZMIK8+LdW!g@eiD6K$oi|~Uk7Ms972;*&ia2jrYwxsr=Y`1AkeQ{5
z&y!zSy5f>=C}7r2i_NOJ*yLH_LIJt`i8%j2obo{iuL;_1-sHl^w$_m1-?+Qfc`g))
zJPs&M+2&Z}FWw>L>wO0AH1FB$^js{QvrXc(o!w6RKc1_F2k)e|@~
diff --git a/app/src/main/res/drawable-hdpi/ic_notification_full_node.png b/app/src/main/res/drawable-hdpi/ic_notification_full_node.png
deleted file mode 100644
index fa17418e84855938eecc9a756ee280f2ddfca0bc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 391
zcmV;20eJq2P)Y8D{RBGv`i17?Y5YkoW^AisB$mQ#a4^$1KZU@q7UvFy>Jd?QbkBgxG@cd6Fb=
zzV8dyb%o^5k35s;UO)
z>ll%5!!TUfwk_Ha_wls0RS@1q%zKK3N<&>yH^uKQ~QN^g+B`*9>lTUj}H`oEe5O
z1w|i(NzLFg>dOG#nK0b=Hk@XC7~p<~&6@<1Jzdvlpy-O4rsgko3f3D6
l)4qwSszdpslaTmNcn1ovAN9_7+*beq002ovPDHLkV1l3RucQC~
diff --git a/app/src/main/res/drawable-hdpi/ic_notification_new_message.png b/app/src/main/res/drawable-hdpi/ic_notification_new_message.png
deleted file mode 100644
index 096746b4dfec5c879cbbf9a98c43a180cd3d7fcc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 356
zcmV-q0h|7bP)AXWg$Q?wiy@7W2c6J^?B(+^C5eq>NAc%!s8eRXwfJ;zU
zOeTrAA6~V^K4vnrkX+8h{#y2LHi5Yckxn6My%kk9c^dl7`j970Y6p$>;oo}PnmvIjK|DT|(i
zOi7jHb3hw78&V`@%MC1-p4>BXv}v1<Nkll1WumU5n0uxZM0Tlxv7GVe@B&z5R-HT(P9Pet!=l5~qD2C2I
z>%4vlz^@gQ0<%=W-PZti1-P@B-C6@qv5>oO0UU~Ak7jlefPw)jFk}f?h-eg9NERaO
zG88Hc$wIPFkO5gJNZ{x$^cjg4mHC$dHpSX2fJbG%=h!Iz4ZsP&s`7`em)*^5Pn`qq
zE&vT>_)i7i_u77&I3m9;Gz5E^Mm0(hcA*ZkNM1ED!Je8}O-$HDO+1w>?Lt$T0&-p{
z=b%8}PfUaZ!l5Y#S-2`9fdCL>rG!d>6k3U-FJDc#F#+#y(f|Me07*qoM6N<$g4UgJ
ACjbBd
diff --git a/app/src/main/res/drawable-mdpi-v11/ic_notification_full_node.png b/app/src/main/res/drawable-mdpi-v11/ic_notification_full_node.png
deleted file mode 100644
index 074a2acbab3ea5e7e8b8b3e2a0d9c1afcb6ec32f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 291
zcmV+;0o?wHP)!fI47>s2<_%IL~6UuaU
pKpYIjp(NlSAU3B;F+K{Y3IIqoOQx*0F#7-i002ovPDHLkV1gDtat{Ci
diff --git a/app/src/main/res/drawable-mdpi/ic_action_close.png b/app/src/main/res/drawable-mdpi/ic_action_close.png
deleted file mode 100644
index c71f1c4468bb206c78608d3816dc4c27e63ea067..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 182
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJT2B|pkcwMxr|srtP~>rzY~+-f
zr77{OjLTBC;VXEat8`4xSz1)w|r>+-}0gLFtbBHLlx)3^8!{K3l>Z4>&c5a
geuJOWHBfHV9tKI_06*qKK!-4Ry85}Sb4q9e0PF8W1poj5
diff --git a/app/src/main/res/drawable-mdpi/ic_action_delete.png b/app/src/main/res/drawable-mdpi/ic_action_delete.png
deleted file mode 100755
index 864553a0637d42fb1fcfdf3d41b1151e535c2338..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 257
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ6P_-PArbCxuNihV845T&^w-IG
z^H%5RG3|=(w|CrbXmiYS_`ucF8zz^$K0!GrJ$?UKG44rzQ+hw1Z{jdExSR6nnd*cs
zHkMKT_u?6BvKBP+fBA2*OF8U^rtK{mhg&H%S68%8*=eEpG_^+Q;9VEKgqH7@Jl|c(
z-B54YP%mY7f7ufuKP}H~JHM(joc3ynWN2wL5MVpxAi=@Bl}#+eyk=6p;d<5?NjC%@
zG?eN(i04b#Bq;g*Yn9!X%_zkezirJE@33nt6GIv1Fbd68RxG|Dkp}b=gQu&X%Q~lo
FCIH>gWCs8M
diff --git a/app/src/main/res/drawable-mdpi/ic_action_mark_unread.png b/app/src/main/res/drawable-mdpi/ic_action_mark_unread.png
deleted file mode 100644
index f74f84a9259a037b6fc5ee3aea349dc1f52e364e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 257
zcmV+c0sj7pP)x(8`erqZQmXkKnF7J
z)eC}Hhv2Q_Xed827xh`7<;{FQDMJ
zrGe{$XX74ozy>MFC*xp)NH2ULN=C5+I7EQo{*Z`7qP_J35O?VYq08Ei00000NkvXX
Hu0mjf{?BgO
diff --git a/app/src/main/res/drawable-mdpi/ic_action_placeholder.png b/app/src/main/res/drawable-mdpi/ic_action_placeholder.png
deleted file mode 100644
index 6fd4dcd7dd3393a258d3c18c09cb4ff9d84f1d5b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 433
zcmV;i0Z#sjP)U*FBpwgMS`4%RK!b~bI0c9o0r3eS
zJ_E%d_A($&1>!1NS?&SEdyy=~g%1F65Vb8&Bf?^ITu3d;y^#!U1mYGvmi7Q~1rk4;
zQp#oS|li;IiBf&E=LryqO9ium^~B(Zsy5IUoZ~Q8E=B5P>FELW~1a
zsOW&GQ3s4VVAKJ`I3OKOQ4$p$5KfE(%+VAXQqcjbKztHO%o$g4Yy-q)pkf%xr-}oh
zW*Gr-DGWR(W-x#4ee}zI-;^j;^IKO0EmwQaXAn(
b5^E*^zvitJ#sOu800000NkvXXu0mjf_qV67
diff --git a/app/src/main/res/drawable-mdpi/ic_action_reply.png b/app/src/main/res/drawable-mdpi/ic_action_reply.png
deleted file mode 100755
index a25803b295f16129331b38dd17b1260d13d9aad8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 412
zcmV;N0b~A&P)3jwYpT@${LQ4@#EiDBLu@q4dEi42PEG$G3uM8xx
z#@)C%iPI>RwTiF$D6aE9Dsvg-L1Y)vAjUC?DNJLuNi258Is)cLlmW==M5|3WfEmoyp&Eia
zI86m;hA6v=XR(Zt`qtd&1Rx7h79euQu!0G!;UNoAb_Cg+@I=hCogb1g>MG80*eO8d
zr~Hz|7?!Z#4S+vRUg7H)$77WMzsOQNkXn6iULTueFA3(N2j_8Vg(Vgf}^XW?^J)G0SOduO^;v>
zd~5SV+a!)-$Bvzd34$Oi9Z&MAjkEw|gQoEi7N|r7
zC|k6UHWiS25}@qRM#e;h|6;`59-UZ2c-Zuf0Of#gEPDwL$)kh@`WRr031)EN;e?A8
zazyW|kT9V95HQpN7N!F}c?Eu)uR!i26#or>VIvaXiuJ?DOZqU9JC0ebAbKGYzmnOp
b^EYz?Sa7w0eRmHZ00000NkvXXu0mjfh^uUu
diff --git a/app/src/main/res/drawable-mdpi/ic_fab_compose_message.png b/app/src/main/res/drawable-mdpi/ic_fab_compose_message.png
deleted file mode 100644
index ea4de0230320ba8211b9fe709ef68d6a9e064d68..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 593
zcmV-X05Ua@g}bIF2&t4N-%5Tz?p6bYQa2sqreU*=ChF~
z4&3Sz&IZFE!21f$f{0uLKkai74lL_(U;?}=!Bqv)z#?r|pa^7ubJ}jq*|8&>rTi`f
ztL*#*bTSVt(Y6U(V1P^1XjeSIfRhmof>hdjDewV07=(v(q6L(LAzk9?dLDpMK5wHF
zFN_BX&QGwwS#jABuLF-3+e+58n(y_|7Ucapn6x``5r2r0;lzm&zQ0CWApT@p{nAlqp-O06hOuJX=TLZ7ZGj(AJ@x@zL1TCGL;t_)f|1
zlK+n^l1`4UbA2v~z@<`XxFQZAt>T_v^8CA5K;n8rn;fyZI_tUa7(sT<8JMDYp6-Hj
z>kpCMz;au=cvTGHSJrnv!--}Qe8L64?YvHZ!>Pe1rBje)l{*<9kzLB3pO)&@NM?iJ
f40nLX_=oll%_gz8oQR?A00000NkvXXu0mjfFPs=j
diff --git a/app/src/main/res/drawable-mdpi/ic_notification_full_node.png b/app/src/main/res/drawable-mdpi/ic_notification_full_node.png
deleted file mode 100644
index 02890154438263739941e580fa861ebc388c20ff..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 317
zcmV-D0mA-?P)X1^@s6IQ*`u00035NklEzCXJ;o-803=4lP811W)INI{0u<9
zJtkH&G6q=+G-M6~&{;n^Iy(N7gMo&8U;vtSmRtjXdf$T#2x)I`|4$AE8Zs9gkgct)
z*==oYpMm&433wkc{16EXXc|AzAa|h2q4+RRV@OL&i^>20{~1R!{9pk9XLEoAr+3aC
P00000NkvXXu0mjfw+4as
diff --git a/app/src/main/res/drawable-mdpi/ic_notification_new_message.png b/app/src/main/res/drawable-mdpi/ic_notification_new_message.png
deleted file mode 100644
index 456614bfb69f6e8024e54d99ae303d66fb5dc3c0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 273
zcmV+s0q*{ZP)s*
z8>m<=7E88~Yk@7)fM-Zz(pW6`2gEYuSdfKeNG{ay8UL{Z4{|I>|4%${A;$t^A`Sly
z#3JOz!!aT(cmTw_|qO^-9
g?&t|jS%Nzly`R=7`X*V_0G-a@>FVdQ&MBb@07>y!jsO4v
diff --git a/app/src/main/res/drawable-xhdpi-v11/ic_notification_full_node.png b/app/src/main/res/drawable-xhdpi-v11/ic_notification_full_node.png
deleted file mode 100644
index 1d59a55d4ddcbbe07c7ea8892afda0c416554dc4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 584
zcmV-O0=NB%P)8wG%zwz!7#O2C@6?K^)Cq82uUj!twazLv5jUSA}H9Rjp#zqqI8w++o%w_
z5?qLiD+?u1(L#)=MjbtV54*3^_EBkS;HL^s
zUYi<-1gL>UQv-(qYGB{gz-oXRh?p7}4^RVprUst+a1)D{1ycj}Wd;dCdgIOidW8NL
zfPJ7U(J{%ehx30r=`-%c*N#iZGB_@AE2o%>I|~`sL%)o(Q6EgB`c-xUk5hTM$-@&&
zV;u*wTYK@Ac7_vq$zMcAQdd5~dqM-c@Lo>iW?iJuhd#<$Y{4U69R}Oj*x1~)o#oAUSb>N2iP*YotJIBYTPnjpwu`aQ1
zy0qW%W#@!1ArV!EDtl$7-4mF2PiXQzk*W8@rrSwOw3C`_FY~k_=5NyxO_sCTMi8eO
Z80x=@O59$z(7*sB;OXk;vd$@?2>`T0cToTU
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_delete.png b/app/src/main/res/drawable-xhdpi/ic_action_delete.png
deleted file mode 100755
index 37e9c219cb4f028f2715714dad4f178f5c726040..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 491
zcmVQPBdOYsVAW(5m75?BxJb1sL1Y_f8FGs
zTko0K`F3{hDR#ubztO`11I1sFz^QO5NvS;7J+SGy0F_`fm7hVP*=2k(g5aw
zor>beMFfNs;Hjvpg2lA}7J%75^2CX+3&sD0Z~+92-@a$yp`iB9rL_PyfYs7u6JCD>
zoR{V>fKp=JdUt@Yz`$of<<04ztab?Yuae3gWdK;I%$+5>Rsv-JI8ru{pxskq7=S{r
z)4Br^ASxkz1r&Oo0SZ0OfG+|bf(c!ugzykl=y?b#^gIMT1pOEAZ_qx#M#xUkRye^+
zC?RZx6?(S93O!q4TVY#aTVY#aTVY#aTj2yRp@jH%D|{$Cw^Ira?K`lq1j(?%2f&Q7
z2|@b;ME>e81HcxrT)hKLcnh2002ovPDHLkV1g#?&=3Fs
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_mark_unread.png b/app/src/main/res/drawable-xhdpi/ic_action_mark_unread.png
deleted file mode 100644
index 35083d1a58497d7967701dd54f9d11e914ef1b63..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 394
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
bPhi5saH0VCo+M@6z-`>e3;ZY|#2YSQQ_us%
z3j!onfV2v*ssik&0GCDtP>;ZHg&u)S#UFtRy#yD6^b&N+IPgGz2Ce@Q^7~gfVdG?I
z(um2BOozQ$5V^xKQx`<6UlOx-QPlcn@e(&iQeoT}v3_gJ-px_#x5wpx#P<=IZd;GY
n*nLP!5ClOG1VIo4!F0X={LZTJ@@%^i00000NkvXXu0mjfpA6hh
diff --git a/app/src/main/res/drawable-xhdpi/ic_fab_compose_message.png b/app/src/main/res/drawable-xhdpi/ic_fab_compose_message.png
deleted file mode 100644
index af0217a8945cb027787a822dab4d41938fa9226f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1174
zcmV;H1Zn$;P)fNtm6eo8+4~7*MJYs98c9Tn1x1PU
z0DEa!t-aj;$L*wTGK
z6ObV(w+LG_(h9huv-lj~mBNU%0CQP+KX4S7jGzKu=v)D%z*tzlF^n{MLEfiLLgT@qHB
zPgNNBe2|E_MJoYkj|UFoe*^hCiLX?6c!NNdWOf*kl)X%c1N@x_{7_WDA>CSk6>z~}
zP8U&MIw_w9^h(O@WzRh#DRWIV)O4tb4B()mH;6dDn0bYK{{JIp5K<-+2(liPs)NvU
zjOu(2PEfa`62!Dv#(KgaEAyPTFeXdvd-HSFEs+Rs|*sH-^p4qgyXu5d4iu=
znFeyb5oeDzx{2pqS2#Xdl6zK21d7%yBxTkyFK~cdTLv7~L42A*JP%dZE0Q21tgMI=
z(j;9ygx+8-u@!z@TVBQ_Ix^hDD*`^TvS-<}H$kq|>g3M$xro+8izZ8kLy)<{CFFXC
z%nq0+o+dK`l7NSn=_1!E@LZ4R`lgGw>0}z?~S24-uy+gZx$ro)1#TDA6rHQ{rt-k>5)aX)Rf1
z$gAQ*IL|MnF@r9t>#jJ6w>h9&-aek<1y6JlA4q_BJ0t9yt>Q%#xH#dNTik&WZ}DRy
zwAEqEcP2pmS77OE6+fnfcwZR%alF~>NhQ>Y<)jD~AfsVC;VrMIh-{z+*pBOPLo+14
zT$=!An(GZSAbzDz>8xQ)PwfFVVe4nIX>q`F;!)gI#f!GGa)nXu+0m=p6Jh-h+s$%V
z*;2(iemMNps^v*8-pS&3OH$Xl(=1D?#8>KQ?c2k6`D2p%M51CF@XloM0o<$*P75BF
zt-RnfoQ6bDOY!*f^$~XCUfJ$T3|-A>dGg{9T^O?OxK%BSJm;~ZrdcTw18<9&=!NS->k)IjZ4qZO&~Lg%iy&}f1?L4zr{ta?j+r*W%Ln2
z1osTs!9Q3qU3`IJ8#*;=o%pd*lI69-!T5qs|+Ni}A@&p|J0pSK-ga+l*1^@s607*qoM6N<$f~5>Dd;kCd
diff --git a/app/src/main/res/drawable-xhdpi/ic_notification_full_node.png b/app/src/main/res/drawable-xhdpi/ic_notification_full_node.png
deleted file mode 100644
index 0b1cf07633c0efcd87500e580117e26f3d2615c7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 562
zcmV-20?qx2P)c*lgmkKR{_$V%2bS3@=u9{6r;pY8*Ke&h+H`(M52;ByR
zLLjzXwxB2_S@lI1NgaPj5=kQX%Hvv?4?gDJ+?n~lIp@qw3`0XhLqkJD<9~x?Sx>Xs
z>^k&kGMQc49q7&H^K0^LXu^ohrqk&V?Vn^asbaBM7v(p;{}yAkGXoP=NssANyy8%uZP3orr+;Z{g63o
zQbX5@ld~nns}!1Q=eu8Vq0GbF(JRFfo}klL3E3b-dl`vD4oT@dNvrItUh#3lU6PJI
zpKmB^nUJECnkci_148PeA_nSq86XNj4IVz&WdQz=2sk_*&nZ-+CfXH)>vNKqk2V-+kb<}8
zmk&eNp240ev3vem-JOBUy07*qoM6N<$g4OE)
Ag#Z8m
diff --git a/app/src/main/res/drawable-xhdpi/ic_notification_new_message.png b/app/src/main/res/drawable-xhdpi/ic_notification_new_message.png
deleted file mode 100644
index 5621edb8c8bd24d0a5b37aa83f15cbff25d12b0a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 455
zcmV;&0XY7NP)C+V^IPfqY!;iD~a!~z{Ww~
z6V!|7Hfv+%D?7&BIj+KlTcB+eFtd!SISOn+nNwh76tJ+2yGU^st~mwfI|{fo#>9GS
zczKxVhBdRHJzt}lpQLQ5Lr#JJ^nP0goC4Dv1iG98y&MFZoC1xEi+|U53#UL#ugdWD
ze?p=~ugWa)2F{9*=x4YJ{1W;-Pfy~YB})1hrB`Lp+o?{s?{-hO8Bme_Nsvex+|a5F
zso<{e^FOUp7w5Hvqo_!Tgh>3BI05IxLy!^)ncHAj!a*R2?R2bvV-xoliDfANcsDHq
xuOh%CaB69>VF)DdiKQ+&!BZrWNFzRN002ovPDHLkV1n~Z%QgT2
diff --git a/app/src/main/res/drawable-xhdpi/ic_plus_sign.png b/app/src/main/res/drawable-xhdpi/ic_plus_sign.png
deleted file mode 100755
index d320ebf7ce139a50fe6d8a85b8d27f57240b6035..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 383
zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV080zaSW-5dpmP4FOwlp>-=(u
z00pZTkxgBk5e=LILdpRFL5CztdJZt~G&txasU)@ocDcH{Lxx<*7Y`g!e7ho;kB`ax!o!F)(vA{k?PQ
zZXsh5gX4tohV%(G3nUqZ6pb8%60;b)7EXF;c{IRti)Pyjw&)1H{Z$ozd)66E+QPMF
z`?QjCJFc5vOYUKFET8Wgm0}Zea_P3TZU46@G8|dQ%=UokNW-hA9a$$EKfF=3T{FXYgkA!WT>&${Nld$;hymV*&3XD69(&PnQyT%awlX`CgvC48It^
zFjq}l#(3T8NL9to*i98YCvqKLRWVHHO1S;}aKpCy39o)8I%qZJ&X2ccmaBUD#c^Iv
SelIX!89ZJ6T-G@yGywqmahHJr
diff --git a/app/src/main/res/drawable-xxhdpi-v11/ic_notification_full_node.png b/app/src/main/res/drawable-xxhdpi-v11/ic_notification_full_node.png
deleted file mode 100644
index 9b736bfbc9a79b9db4edf8551b2937648969c568..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 976
zcmV;>126oEP)|CKQ&1j1km*bYvB``|VB40=E}_yC&t*-@|=ECORdMmicZ7R(0~;5fJm
z9?^t0@B{RMe$WSgf=+(+5V4j
zRTX4|ri0a73B6|cB%$~TtN{5zG$zb&x=eE;v`2TS@Z12X^tDLVhqP6HEk8Snzo*sl=aivj}@(NH)j=yFm@O%dqM<{?S)Z
zIbt=E)EHnAx6%XP5_kq$Xim>C*Ey+5iqczbNiy6vM{0|FPzuh0M)pg7mb4{bz;ck|
zwn1~i7WPnnH|AgM1ch#zvj$vX(HAkn(^*;hZdJsEG^fP`S1)Li%#+H%0x&J5yu^eo
zU$TiqtRSn8zoC)++I|{Uz%n2+8G~{eTAcw6t3*a65*6#f%w!B&$)2Xqq^BY@NhX!m
zoIHevvZYrsc5ToraGvAfoJ0(g*u3Jis@QEwDme&dBx2AG@YvWV=>qmjO7w3cqu6dPD&&0WRR?$@5Wxq0$J;1keKtwVuNIX)HoT`mB#f?B9in{
z=VXv{?7uBGNG77KP6jnwo`WQMx}6NVWAQF#n18#R465cTvQ;vwZF4ecn~7aZu~m{@
znw<>Fx3Cu*EIH@D7_Xa`1HcAL4SEVH^tcBr;tzu~QAXYcp`F5l!>Zs%O;X4Rt@4IAX!Np*{7si;;yGTVUz4t8HStWq*Cr~4FNYwR?R!+oPjg4P^u@b1GhU$
zSSQKN(uZtIq<8CNALF+$>}UHR@ArmvPAzvUNyt;&y6qt+uUo+>Hn>fLO!8fC#rKmd
yJ91~J2#hvV9fP&aSW-r_4bZq-ys7Yhl_bH
zA|Le0FuXe=Shd_wOp-J7Rfd@H4ZnNS_qcAG{KqL^uMSWz3@lLlz3+b1o#-{KMRC>V
zw!b>Ne_O@Y8&NjVFd@{<=D9mXs`-E3|xDP2yCuQ}uFh1!Pmt<^G5@TT`Yb
zVzZ~rNd9N$mdS75Z~Eg534w@j&A^(~88M;Vi-qjlr%sbx&1F4m1!i{?7W
zUi4egm!Tf#zD0PA@-5E=P`pU_)%zFMGpIe+Zp<5;wG-kHv-jiFL-8;GGxw*#$FP&>yniAqz
z6WCVDBAycC+tkF9$Z5r#V6Bq1YAqAvAMDAm7T)W16Zr@TNkg%t#pUXO@geCy^
CK(D|6
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_delete.png b/app/src/main/res/drawable-xxhdpi/ic_action_delete.png
deleted file mode 100755
index ef8e4bb424fe7f4ac8587f423d15167d4a64fbb6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 849
zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>V3zQ7aSW-5dpmb`m#CwN>-8TV
zCW3#M49$dmd3sC*m|6cHu>Wwh<YKg^EIh8J!ea4|Fz+wWj-@rb%=+`;2_e7|2=
zciH$&pPI#1|Lak;tKRz*q&LSbWij*Gz1&hT;E#Zd1B-~TM&5kRj)o+rqi>BF1p|B*
z?5I^!VCv!&*?ykI<$yiQE$2cu3*NhR!T^BA<TZ;LBQMzmQDxe
z*n9ijXxh7F?(c2cEe+AzcFPOb9KM;>(olVlm*>R3M{fifXXUYExLxbw*zoA;L%{`-
zk=jZJy29Jt8`4tNb}(qi$;vU#nz&VoX-!3G#gJBb<0DfZ^V`=t<&UoJQ~tH<^D+0D
z*t4MzHWUjVd-MH3Y;xW9{{b7{$>}qw&z)_Mwx2~#@^d?f1yc;$Hw*Km6aU!mu-}v1
zRPWwr(G<10`vB*2H=dj88`|6M*ekhn-r$d6>f334Me{%J2ZkSaH1ki-2xPj&Yr^@w
z@iDhu->r?Gr7CQg>Y9y$4!qLLc;BM-P@^D&Q9kgt`&s@2x8pyoP5*a)ae(3h+pE@E
o_Do%+u7uK~gJI*NZ}tpTuL}|nY}zsjm{k}&UHx3vIVCg!0Dm)ZegFUf
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_mark_unread.png b/app/src/main/res/drawable-xxhdpi/ic_action_mark_unread.png
deleted file mode 100644
index 968b84969b6cfddd35c457f341a77d6883af16a5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 620
zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U^4b}aSW-r^>)r_ze526Z97G!
z6xLM8#hz$#>7CB1SF-T@18Kn^PD2(Up~eY6nDzc|W{ZZJHLt1Ud
zj~tDB6CN(N`u1yKsl~JF7uG!qnZ*C&{;DT&M&1q&)2*&$9hmdU>U*BdJLalM!k&f+
z(&ooN`gb!HYrKl7F5Dv+&ATd9Ah35L$NmqY&JUxdTl?S6-LSk_SHk6v=RGBjKUwo-
zogZ>riR*XvEB%^e?5X)+vzAtpkkdo;UF*FL%#3f&rB})7|CL#P!jd&>ZdV*p|Cjk@JFsuAJjmtI+jd%PxSEpY
znxnDPL}Y7DhG}2jwF#;x|GG~3CK0dMawt8`w_?fL!-hSl^G%h-p7s~J#pGsN-|AcE
zZ1u?af7p@ht>urK&SYyUrVCyAtjzKuP5=@SNO1yWF8Bb9Ax8!#4yH{S4e~i%pV()k
d#43nW_L)tj?6Yi
z3{lS68dGxYRIZ_MPm~-_So;U;^X%t&-uLr-etDngec$K#CFVQA9+@E0^8keNSL@@#@RH<28Y+`lMQQ?^A>%LbK#gSWyiGuJ5#6MHrTQ-NdcWRZ)Wh@snI&%>>x;B@r|NpoRB#OE
zkzOLN^98)MH1o7a{>c3?z1>7d`AhgmXBMW)W)l3%=2bV$mSTGp2tN)2s5JVBz0vJ
zGj;5W^yVfR34hJld5`;^s;_}Bc%$#HT_%N-9vVLCXFxD;S6xtjahe8e&0ch+XOK>&
zish=vMH!opuPl#=DLrnSc9qQCPyfKi%F-Yy-Xn}aJ-~e=K2b_^whQFCf386l}2PBfn2CFKxDSyz#^f9dpr<
zq-KZ4m5C2Tt;uP-zM896kZ~H0s;D6rif|qe!H6YTXZ@{CGcjMOtzKJ*7<-SbjA_W#
zl#7ElvjDF@7V8A!M1>NSZCyCsTO_Fk;*73DNSv?{xsE7HV%X~fLzro2AP>03*JS|q
zB9z*P0UK6A_2x2NyWyqNQX7Qmj3LKU1u#$YotM#gR%Y&1eRl9sr6hzqv2c@ldIoZ&6_ze
zl0`I2iPe#I*q?$ADTRR<3;s`YOyxrN85La}q|_Xn64CIdyYGP$w9xWF7qAMz`D39j
z7{o6?aX7}3kD;rvjkdfRf8Hzcc38U>_=d77!jB2M8KL1@LCdnEmL--=;f&g>Z=<=Yv*hlYy6(7|kTBW*40a$AMA!gPgIQEwbC$*AWq`VM
z{Bs!-eyKoAuC0-yv73Iuw*Qkb1nFhuTk#-GClHo(P-^6LU7?F$HX=1Z6`RKfk5kl8O!J)lsGy(n;V~J`j
iv-su1boLxG{MqUxq+4w)#k(&U9E{6pH-{#BT;@OKQFf02
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_reply.png b/app/src/main/res/drawable-xxhdpi/ic_action_reply.png
deleted file mode 100755
index 15a3089bef7e8cfb774de2f9521f5eee81acda66..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1364
zcmcIk`8(8k0RDXEV6evhgxs{QCn`-uG>$PDW=wWU3XOCPo76aFP4S&_grXR9OqONI
zlgT)CBqpC-#Y5XRWx^_qCLL6!B$D0M{s;TZ{_tMU`~LjqGZ|D}ZF6k^fNsdPpokS^
z{|kb~3O~D;?gapTbx4puix>M=^kgP2(711FlgE@WezWl^nw!vW>I8$96y3p{bT{az
zx@q@(AScKv&mr3D$Fh?1bI!)c|7bXRe?NcAgVu#Nmq;GnW0y1dGYgHriJul)he!EC
zzmIpShggCbx~!9HK~@z)#0%}!-k3IPpakZw@(~#o#U5@X$1hkR#Hwb@xiLQOKMcg$
zBBTo}|GCT2V?h>-_NJ~+_D&XK*QvUtDyP3c!w1Bw8;c*(v~1qvpE+tW^~hZx+)Zz$
zfU=L)byp`(_9HCJx-g%>3L-Rxx7t+TETwqtD9wjhWr)%_eTXU6G}MO(^`UU3`vwUM
zSqXql8$AYcklH#+O{OW#fs|@#>F6)vcOp#oG)Klzf7n{zV7H{JHc?X+7qrxTM!n1;
zvBS#d{f@zQ^?Q5udbO=O4IM133sFh*saT0|);#Vj#!t^?9NcC^R5dr_QA3U+wcK4W
zEU5S`BY?5@MPIoFb8f)eh{~BZQBsso)~j}QSK#EOi-Epb_)4S_i~ITdPHpl`n+Js@
z;92nu7mo}er0;3q)%?Ij?ZhG21NkJJ)!YRgc749}yxgzmkf0CU+8fle?5hbG+kE0j
zIs4Mx)vqsBKc3|xZxpUsSBtuV9;PWOze_x^8I(I@DuPQl`^)LK61d=N*`CsN&4lq)
zFM#}fg(==3C*q+moFE0nxuFEx_D4}FiyPGN{Gaa3K-V0iow`
zV|qziS1<*~Bp3;c;1V~1Tua$r8-;PYP{eY{bQP)J!Ackl$Kh?5Ihi#xXIdbhetnOk
z@EqOH;w=@m+!daS;)5?(O(YMK2lBAgobIyRngjQ*AikCd+8>>MvazZ|zYdH%=eC1q
zhm}0#P2jkvP14&Kbv*4lo}J`9fJj`5B1W2F2+W6ZX44${=OwijH`sGi=a5v_iDXE_
z?6Mp-fE?Hl5f9c07op2Ri=|mxlD$m^UBK3|DWZDLeTTLRP8%r{GG*OUvD;cuTU%oe
zetPjG`;3>4SF+t1>hZ!pT4T$dRH(-#e8jMgvSY#F6Su6R@ghm^t1mqjvJ$h8IChNpv=-W1zguAf8(e8K
zYp-^eJZ@s?&@6|OE9I+Ep4(FS*cA3J)<(r3^8=qCqmZ}!N~nGrUM{|!lDU^>=J5K|
zj0ri6dMItVe*-7oIXQ{BOjo{hnD?Rk_i*KrMmzYkpIgfcaFoVJQ@Us@?$XnYBDCM}
z;RutPbG>Kq;ak}0tU3mq6OKrCkmfH-?#48c=}AO(3#%sACFWXg?V5Z2_mQyjgp%r=
vV}2L+o1L{F7wp!M5+PY3bhG>){8uFM+ljamTKK+|w*(;+M$nA__NjjWBUxk#
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_send.png b/app/src/main/res/drawable-xxhdpi/ic_action_send.png
deleted file mode 100644
index d36f994db6136de671ab12aa242217a6da1b86af..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 814
zcmV+}1JV46P)4IyD;Ardwv;t?U<
zuaqMCKV9F6-$^F!Z9DhgnK@(T^GQB?Js)?@%$YN%R0041000000000000000h)B6y
zULj{O68-{QkYjSQY-U8#53o~Cnn8#ygh)3)ZzzECk=!bq7@_0?G|8`3A_P8>{c;W?
zm28ANQv?Wy*e>TXTFC@BF+%|7bGeH-BK`oIA_j22kh^6IqZdzr&Kd(aU&;YOG#+5K
zd{t)z7h*3V8jEnffdI}oa-W>Xh}It9Pz(W_ujPK(%E(3!uqMU;&bRU)zldl7+U1V~
zA_RVrN924)din^D6ABOxahMQO2e_PY0Ou!pln|8x22u*({9+*%F#3N3tV}t8Ggu5f
zE<1`Ipjl3Mir{_`C*`6dN4V!Pfb*Lik&BBM;7kSrILGbZ(^;ed+cFd&{EIjzmlPpD
zR|W$(Cu|eJ(!5W^?=l==(w^8a<~D@>uv-}q5dK935071W3$Q_6lGp5g@tCdo2lwmW
zlc8KLSIc#_b7Dvyv&nK)-j?^}GrOdXrx4<&ydryetgf6_
zT4Y;r-Il9lpY1&wv<12m`(J!R-n9(?jf5B_L}h^XP=K{|%R6XG)u%1M%@_mp=J^uT
zZI__+a)-T&9JWi)Rl5W|uuIT;yO&R6F8Kd1LHYwW{xbd8)9lBzYoXg(
zss~7GYhoLtT{-wkZqEJ4=G>VBusz*#fH*(U2)>j#zy}(&1>h4UkAok_M|wkiq*s3c
zK2!A^pq>x4_b~AB1>mRx&jF$w*3r*l9mx#-bjQ^^<+z&U1N3lUlivUwS>`#wc@FLK
s8-Qag0RR9100000000000002QA0iFHV}!On_5c6?07*qoM6N<$f^KM8v;Y7A
diff --git a/app/src/main/res/drawable-xxhdpi/ic_fab_compose_message.png b/app/src/main/res/drawable-xxhdpi/ic_fab_compose_message.png
deleted file mode 100644
index 40ae82aa53495add93496912ac01be443b2bd801..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1821
zcmV+&2jcjNP)`&~6pry%1K!4eM3`#%ch4fJutuoB-@VBdpN3
z3GkC8wc_2dp>@<0XqkFlR+{bbSUw=?S7Dh-n3yl0gK=S{>V@^{A
z(B*qrJWf20ae0AZ#nq4mOiR3^gdm`o3Ltkeau*B_^;`h21hX0H1#zGeLEqm2b)3GkjT)}Tdra2-b+l1Z2^&n3+KDm7
zss>z;tfUG?zjcC1FoUbaHlKf3K@cASmNCXy4){*c?;Xy)k8#>}*yw7aAoc*pB|;ct
zg&=4pj0jG+HgN)X{nlZoR4G`|&lPRkqaO@Avv^lZFBhvOi$f
z!W1RdmI}s1FXt=47)SgB;-L*EaqC@QyA^)hU=#UXe1Qg7Fm{DR20Vw*si9Itw$-
z;O15ks{zl_+vQg&;yFhTJ)b86=(46}8y#lgx$0Uf1DWd(w4DW#JOVk9L$zbp%!h}$
zlhR140`ys*gH@0w-?*&h*F70#Lu7>UL7%5GFZG;$y*beN#*x32-lGyd_<*4Ax6a^Z
zCxC|)OZBc3cuSW;CjS*v4QVme)Knp1P*517#*C
z&^L{)+3zvFL26^l-d0Rd^$R
z8IW&&ctJyX_Z##Ud$Hs`!vV%TXbbtZns%|Xl=6MM;9eI3%>0rf8!mbmN~f!cD(Pv|
z{fv8^ROo-mnlBVly`9mJeD*QM{oauDIbziZ(?|!Y0e7(k3hE|44I>8~o
z#5VHd5#)8g&A4x$^)o*t$>ch=R7?~Ep++E1C&Znj5gd{b1rf0bi1v#@h2Lm&Pu
z9a%1MOh#vX$0=M;@6?PQ0eq@R{6)(DT;^EQM}Dm&?2JbBL(21avpquNdzlJnuXHSh
zM}C>FX7Wu6#I^e4^zI5r013~hKze!K$8uMA0_dc=o#l>==&yePN;341;A@f%00000
LNkvXXu0mjfsW5L{
diff --git a/app/src/main/res/drawable-xxhdpi/ic_notification_full_node.png b/app/src/main/res/drawable-xxhdpi/ic_notification_full_node.png
deleted file mode 100644
index 006b25ee9e3d2b102bd82dca7f94207fae85f736..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 699
zcmV;s0!00ZP)(y#CQ>)cp!w;0d@!5gz``29VxmqX`&ILwzxm-Svut#u@vdQQ3CY#NgbUJNPsgy@4
z%Qg8;?&01~m|Mfhg}I7HNC+W&2pJK46y;udhUa%1jmFKn#D&HS#bVJDluRZkqC6{g
zNL}G@_@r;*>GkKiTyA3FhbeV2H#VehKVp-WJWosfunDPqrsC=O+tcj%znJLJ#%$(<
ztQh3=E__Vze3-(trVA7bcw^A^dbqH}4+j>Rxb?@WG!ludV&njtAQSQK*mnaN3Ai6*
z@kjmvjFDJ?>paj6kob2nbgb7*Cif*A--R!E_$}=CD7e#a^BL_gbMic^|HM!z6bgkx
hp-?Ck3Wee~ege<<9~^<3M?(Mr002ovPDHLkV1jtXN2ve+
diff --git a/app/src/main/res/drawable-xxhdpi/ic_notification_new_message.png b/app/src/main/res/drawable-xxhdpi/ic_notification_new_message.png
deleted file mode 100644
index 2b218dfb6a0474b591659aa72fc3e29f10b88f37..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 660
zcmV;F0&D$=P)6y1a1?_a+FZh+u_2oz$fY5$QTzZwMJ_>&(i&7tOA*e|CkTSRfJ95wRt*W!
zP!E+}nT(7A*P{=uT4Z3zd(
z6N`doB?u~5l5M^uAyW?d
zCXg??_&$fPEVwG?!jrPY#kz^pZ0!f`Eg&j#1NWw^hB&xgd8Xbs@-2NnHwZa^dFJ-u1S;1(1|?bxj)4MR6yJ5ClOG1VI+d5_bg!
uEO6Zxq$TlBAc`KDiU9xs00000`p7RR(^KE_>(m_p0000@v
diff --git a/app/src/main/res/drawable-xxhdpi/ic_plus_sign.png b/app/src/main/res/drawable-xxhdpi/ic_plus_sign.png
deleted file mode 100755
index 24e567d7429c6eacdeafdbdc6b19bbeb031c599d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 759
zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>VA|*D;uum9_jdNitk6IK*Y6=x
z6Q_s?`P+#VKH^7KtS8I
z@E!*F<(ov9PF?ubCHUZR$TTMh$*6ckrkXjYf;cpsUu(NH^an?BF{WnJ9_9E@sO7D=
zfM@M`2}V1=R85vC3%`m|YUpXEyn8`)uU7l}+D`rwcIma}>zzydC)F*>`#yE3+vV
zf9Z<~ZeaYeVUvpHZ--05p8aaI*C(A*$z8wl{jXmcY4PFH+*oA1er?+HL@u@e?3K;^{MQgrE^ctwI;7hr;ASbQ=th?T9D42X`hc7TeGkCiCxvX%{i@6FwN{$BPup7kf0eopaASor0OI4Z1RS7+wH@It9E_yAWy-lEKH4W$nr
zyHpuZewoPZ6Z>zz(XNJsdyE!*G4ns1yI-r$Ct$<4@7x=)xgT4fOExV0v--fL9^+f@
zKg~X{xw17Oj&Z}ae{lw9-abz7VrUcJ^7L=sa^`=3c{WrWc<=XhYwm-;ik-O(%pu1A
zeK-%eCX_xC{;IfvZO^QvDGUa#ryiR!9r$r(mz5yHu2sc<3>Xt?(qiXwFvMQ9tee4L
zV7GalA4|i!S2FfK3=;Dr!_}D_!b|()mw7WBJ3c|!*gxS^JX5-z56dxi0fuAg*RFOl
zTnL@}xSf;XvGMCyF5C<;ueC0IJZvLd|Kx+;7KQ`Oho#f?)|cEak!3jZr9PXTVL$U#
zM}~mM-;Xjk+;4oPz_8-u??;RW-aC{EFkJaj`;p;6`2s5rhO9sPDi}Uk2gtH8nAXMH
zF#M2R!N=4fwO?P3;SXO3JEKGIeQ|z3vjQ$}c^~Xtai4|ZdBf}jfyNw;
zzpX!TRA^`XpPKVfHo;&sQ;bowz?OKX*G=#2C#_}Jz;TDc?^dJFlK+wwJURYLwlDY5
zX5e9KcR!fL$YIBrePCMbzXkV&7(^8^R{arUl(6CLZ$5pXwJ(mRU3}m51KncR{+&B}
z`4-!am$?-xI*iX7FCW-w`RnKh_7A*281^ulMMwVJEpM&MeBqGtrfPo11;4xg+b1v}
uvWvz%hmRjOGcq}RWa;Xk&r2xB?PsVIX>YU%Fs}xd1Pq?8elF{r5}E*~Z^_^Q
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_reply.png b/app/src/main/res/drawable-xxxhdpi/ic_action_reply.png
deleted file mode 100755
index 2f08cc88d29c1b6abd86c457052a15378c8b801f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1929
zcmcIldpOj27ytf#b1^d*_e)GQXpBP0WsJ~}S@(Izu5}F~$|9F`WUa)ww=d-`3C*)1
zx78$ti7|>?Dz~jzxz*BO#gt@A@yqD-
z1<(N8W1<+d2~bDid>`B$(*iL~!134q`1ykZen}a!xqKrEr>>RQ9qA03u5HM2h9EI^
zyAP}ojVus+I%=@+Hie+PADR)}d6DV_(Qxm)
zO>~I@^el1~F&lH%$PNcQyW18ha};5cTqmkiCJFOp@jPqrYblcWreeQe`t_Mdiap}!
zr6N(Bpau+(R`WKyYO(Z8(X^*WfTs`4`L=KUp|*VM%xd^NeSZD+fyJp5Ecmf<<7UKr
z3o%lRCmR1d+62-IAHJ^rtM-FGYhvs#p=h$fb5b~W)QF{g@_Q<=&DI3`K>s2r^*fuS
zoKVvmu7w77pMDYq`O(uwsoAM>NpdbTMhC#%kxv4@gBsQtJ>MsSOqkop>t;;P1q5>M
zXEsgX?E&lct#9nwF8Z0a9}C0SgVB|Wb^}v_A5npA0Y{i?4h)f-hFrjl2zb
z6~dtL?P*iwt`7V$7t2{hCfkS0rT@xlC{l}Y1uSY0uZeHi`Lv{7ZVNvdg8gS&$xVUQ
zmYrj3?S})8v0sP@z0Wm2Z{kNK7iU0LS9RM~y(J~kSktI=#7Po9w`LmGdd9SCL@X9A-!Q9#4hy&y~EfKTWNe_z7kJ|XUdc2UE5y8uVR
zPQz#QC&U}SK`Eq#7_ox3sPdM;5;MBK-K!d0v=OOR7$JS*9syh|P|Af^mFb%z5gvt)
zKPHF3`z}?Y8}vK-qMUQkc6iV`fVGEsWAENy;aCzZVasuPo)3Ibt5g5Q;L-km>)kT;
zPX$B=8#@DFF?B~O);iW8){L8yea26D3YVnzzWOVBQ4#taf-6umK+#gBhe(%U26UO7
z(q)zrJ;EP)Eial{BT!*^ZL;K|=Q>=7|AHClkJsue;`hubH*(D!f&Buq9$GS+D30al
z;Mi-rRdN2qr(0UTzUqKSvso^Td}&bGPud9=)Taq~;B*+*_--1M#_ePR)6NN%eZXs9uxw0LdaH
z%tt|sv+J{R#lx|#&(cqJgdwLQRGUg*;ba9D39J;({gqJQA4O37DC^CzeKxYa>k6~n
z7)(VFU^aTbXwxHfvMD@xsXV`CfdtPNDHWq>mV>#i>qy%4iO1*d-f?!0AWJ~R~3Z5oE0uM?{L#;t`8@&+BNG?oJ&+Y
zcZp<4V*vIC)a}SA-=?X4-`{k>XKL!lxyZ5V+FEjs_lH`3+6
z%jjTGy>UU++XA%YYt0a4IB|lJ*F$KU>XB;A3@Cqi%lE_|V8A{rF5MW6f3nTd*95);
z`O)%dn$=v`*;5Fj^qz6q2f#_RZP0uMglZk<+o^-)r0abpvK)g@r~fIogL)K-%P(af
R>XE!y;7n&YG~2V%{sTO)I`#kn
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_plus_sign.png b/app/src/main/res/drawable-xxxhdpi/ic_plus_sign.png
deleted file mode 100755
index 491d801ec719d0ad6a9327922992ba7e8ff0275f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1043
zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV7}$);uum9_jayseu$$;+k8V-
z#$~)M>k~XCa2T+(x`s6$_#FL9`Uk5;5PRE_gAE5A3^+Wr7BpxpwB>BtRDOB$c5CDB
z=QjW1d48rk?p*D%;_bdaUPd)u`TFjzjnsl-;S2`e3p<(S=HKUBz-Se|;PYE+MiYnU
zTqXNz)f?De#5A7U{+{Im!(8nPKfldo0BT^hy1!4@f%!~y5-+d9V@Y0lJ
zzwWD5^G#Uc`5xvw>}Ab!Z?f|Rd2uVB`F6RPaUD~CL;68IJNCF`Q}(d{6~-|0Z1-mN
zIdzKp=(9O<8MLKdvJ^0#dHDb52e~;6tAD=+@+=tHLNLA}a>LxgELWAW=SO%|?3rv(BU
z5K7_+$9;AVu4^efU?O0N1c9KI0}B#-+qjX`YOt^=x^nPfSA3acTCp8_49mIsYWtkd
zs6J5qpfck(>j$nMVlm-bfAl|CFa474bLe6|>+?D58Oj@^leum_xYcTzuU{XYpmMhQ
zf$|6AO)C=K2!1Gg^WM;goB0m&JSKjwyn7)ZIB$4s?v++Q%h$ZnhQons%{fH0=5netsR}s_hH%7?HI&7_;r*
z(|O07ckODj!Ee?FVg=?A_t_tOesoNC$GVUoGX-`0zW1OS@r46ihA>g*I;Ygly%|EQ^NLatdUx8LwXTnQwAoV;L~BGkCiCxvX
+
+
diff --git a/app/src/main/res/drawable/ic_action_close.xml b/app/src/main/res/drawable/ic_action_close.xml
new file mode 100644
index 0000000..a9f3069
--- /dev/null
+++ b/app/src/main/res/drawable/ic_action_close.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_action_compose_message.xml b/app/src/main/res/drawable/ic_action_compose_message.xml
new file mode 100644
index 0000000..fc450f7
--- /dev/null
+++ b/app/src/main/res/drawable/ic_action_compose_message.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_action_mark_unread.xml b/app/src/main/res/drawable/ic_action_mark_unread.xml
new file mode 100644
index 0000000..d07b8cd
--- /dev/null
+++ b/app/src/main/res/drawable/ic_action_mark_unread.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_action_reply.xml b/app/src/main/res/drawable/ic_action_reply.xml
new file mode 100644
index 0000000..1cfa52c
--- /dev/null
+++ b/app/src/main/res/drawable/ic_action_reply.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_action_send.xml b/app/src/main/res/drawable/ic_action_send.xml
new file mode 100644
index 0000000..121d6e8
--- /dev/null
+++ b/app/src/main/res/drawable/ic_action_send.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_notification_full_node.xml b/app/src/main/res/drawable/ic_notification_full_node.xml
new file mode 100644
index 0000000..4790d6e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_notification_full_node.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/fragment_message_list.xml b/app/src/main/res/layout/fragment_message_list.xml
index cd73e5b..ba540ad 100644
--- a/app/src/main/res/layout/fragment_message_list.xml
+++ b/app/src/main/res/layout/fragment_message_list.xml
@@ -22,7 +22,7 @@
android:id="@+id/fab_compose_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/ic_fab_compose_message"
+ android:src="@drawable/ic_action_compose_message"
app:elevation="8dp"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
diff --git a/app/src/main/res/layout/fragment_subscribtions.xml b/app/src/main/res/layout/fragment_subscribtions.xml
index cd73e5b..ba540ad 100644
--- a/app/src/main/res/layout/fragment_subscribtions.xml
+++ b/app/src/main/res/layout/fragment_subscribtions.xml
@@ -22,7 +22,7 @@
android:id="@+id/fab_compose_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:src="@drawable/ic_fab_compose_message"
+ android:src="@drawable/ic_action_compose_message"
app:elevation="8dp"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
diff --git a/app/src/main/res/layout/toolbar_layout.xml b/app/src/main/res/layout/toolbar_layout.xml
index 049a0b0..ade8b53 100644
--- a/app/src/main/res/layout/toolbar_layout.xml
+++ b/app/src/main/res/layout/toolbar_layout.xml
@@ -1,34 +1,33 @@
-
+
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/content"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_below="@id/toolbar"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior"
+ tools:context=".MessageListActivity"
+ tools:layout="@android:layout/list_content" />
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content">
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ android:elevation="4dp"
+ android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+ app:layout_scrollFlags="scroll|enterAlways"
+ app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
diff --git a/app/src/main/res/menu/message.xml b/app/src/main/res/menu/message.xml
index aee2121..dc31fc3 100644
--- a/app/src/main/res/menu/message.xml
+++ b/app/src/main/res/menu/message.xml
@@ -5,21 +5,21 @@
\ No newline at end of file
diff --git a/app/src/main/res/menu/message_list.xml b/app/src/main/res/menu/message_list.xml
index 75f182b..295a7e1 100644
--- a/app/src/main/res/menu/message_list.xml
+++ b/app/src/main/res/menu/message_list.xml
@@ -5,7 +5,7 @@
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 8cbeca3..eb1f6e8 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -3,6 +3,7 @@
#FFC107
#FFA000
+ #DEFFFFFF
#FFECB3
#607D8B
#212121
diff --git a/build.gradle b/build.gradle
index 37a428b..8eb7947 100644
--- a/build.gradle
+++ b/build.gradle
@@ -9,7 +9,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:1.3.0'
+ classpath 'com.android.tools.build:gradle:1.4.+'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
From 32a36e57f69aea1a3e889ecf29d463aa11285617 Mon Sep 17 00:00:00 2001
From: Christian Basler
Date: Sun, 18 Oct 2015 18:20:58 +0200
Subject: [PATCH 007/110] Changed to using vector drawables for action icons
---
app/src/main/res/drawable/ic_action_delete.xml | 9 +++++++++
.../main/res/drawable/ic_notification_new_message.xml | 9 +++++++++
2 files changed, 18 insertions(+)
create mode 100644 app/src/main/res/drawable/ic_action_delete.xml
create mode 100644 app/src/main/res/drawable/ic_notification_new_message.xml
diff --git a/app/src/main/res/drawable/ic_action_delete.xml b/app/src/main/res/drawable/ic_action_delete.xml
new file mode 100644
index 0000000..d555d63
--- /dev/null
+++ b/app/src/main/res/drawable/ic_action_delete.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_notification_new_message.xml b/app/src/main/res/drawable/ic_notification_new_message.xml
new file mode 100644
index 0000000..395fdb0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_notification_new_message.xml
@@ -0,0 +1,9 @@
+
+
+
From ed5fb69eafef6fadac59b9bf431869c8d1d661f2 Mon Sep 17 00:00:00 2001
From: Christian Basler
Date: Sun, 18 Oct 2015 21:47:07 +0200
Subject: [PATCH 008/110] Bugfixes
---
.../dissem/apps/abit/MessageListActivity.java | 41 +++++++++----------
.../dissem/apps/abit/MessageListFragment.java | 24 ++++++-----
.../abit/repository/AndroidInventory.java | 2 +-
3 files changed, 35 insertions(+), 32 deletions(-)
diff --git a/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java b/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
index 1da5bf0..70891ea 100644
--- a/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
+++ b/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java
@@ -12,15 +12,6 @@ import android.view.View;
import android.widget.AdapterView;
import android.widget.CompoundButton;
-import ch.dissem.apps.abit.listener.ActionBarListener;
-import ch.dissem.apps.abit.listener.ListSelectionListener;
-import ch.dissem.apps.abit.notification.NetworkNotification;
-import ch.dissem.apps.abit.service.Singleton;
-import ch.dissem.bitmessage.BitmessageContext;
-import ch.dissem.bitmessage.entity.BitmessageAddress;
-import ch.dissem.bitmessage.entity.Plaintext;
-import ch.dissem.bitmessage.entity.valueobject.Label;
-
import com.mikepenz.community_material_typeface_library.CommunityMaterial;
import com.mikepenz.google_material_typeface_library.GoogleMaterial;
import com.mikepenz.iconics.IconicsDrawable;
@@ -42,11 +33,10 @@ import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.util.ArrayList;
-import java.util.Timer;
-import java.util.TimerTask;
-import ch.dissem.apps.abit.listeners.ActionBarListener;
-import ch.dissem.apps.abit.listeners.ListSelectionListener;
+import ch.dissem.apps.abit.listener.ActionBarListener;
+import ch.dissem.apps.abit.listener.ListSelectionListener;
+import ch.dissem.apps.abit.notification.NetworkNotification;
import ch.dissem.apps.abit.service.Singleton;
import ch.dissem.apps.abit.synchronization.Authenticator;
import ch.dissem.bitmessage.BitmessageContext;
@@ -277,14 +267,7 @@ public class MessageListActivity extends AppCompatActivity
public boolean onItemClick(AdapterView> adapterView, View view, int i, long l, IDrawerItem item) {
if (item.getTag() instanceof Label) {
selectedLabel = (Label) item.getTag();
- if (!(getSupportFragmentManager().findFragmentById(R.id.item_list) instanceof MessageListFragment)) {
- MessageListFragment listFragment = new MessageListFragment(getApplicationContext());
- changeList(listFragment);
- listFragment.updateList(selectedLabel);
- } else {
- ((MessageListFragment) getSupportFragmentManager()
- .findFragmentById(R.id.item_list)).updateList(selectedLabel);
- }
+ showSelectedLabel();
return false;
} else if (item instanceof Nameable>) {
Nameable> ni = (Nameable>) item;
@@ -300,6 +283,10 @@ public class MessageListActivity extends AppCompatActivity
case R.string.settings:
startActivity(new Intent(MessageListActivity.this, SettingsActivity.class));
break;
+ case R.string.archive:
+ selectedLabel = null;
+ showSelectedLabel();
+ break;
case R.string.full_node:
return true;
}
@@ -311,6 +298,17 @@ public class MessageListActivity extends AppCompatActivity
.build();
}
+ private void showSelectedLabel() {
+ if (getSupportFragmentManager().findFragmentById(R.id.item_list) instanceof MessageListFragment) {
+ ((MessageListFragment) getSupportFragmentManager()
+ .findFragmentById(R.id.item_list)).updateList(selectedLabel);
+ } else {
+ MessageListFragment listFragment = new MessageListFragment(getApplicationContext());
+ changeList(listFragment);
+ listFragment.updateList(selectedLabel);
+ }
+ }
+
/**
* Callback method from {@link ListSelectionListener}
* indicating that the item with the given ID was selected.
@@ -354,6 +352,7 @@ public class MessageListActivity extends AppCompatActivity
@Override
public void updateTitle(CharSequence title) {
+ //noinspection ConstantConditions
getSupportActionBar().setTitle(title);
}
diff --git a/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java b/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java
index c31b091..5de7c7e 100644
--- a/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java
+++ b/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java
@@ -1,25 +1,24 @@
package ch.dissem.apps.abit;
-import android.app.Activity;
+import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
-import android.support.v4.app.ListFragment;
-import android.view.*;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
-import android.widget.ListView;
import android.widget.TextView;
+
import ch.dissem.apps.abit.listener.ActionBarListener;
import ch.dissem.apps.abit.listener.ListSelectionListener;
-
-import ch.dissem.apps.abit.listeners.ActionBarListener;
-import ch.dissem.apps.abit.listeners.ListSelectionListener;
import ch.dissem.apps.abit.service.Singleton;
-import ch.dissem.bitmessage.BitmessageContext;
-import ch.dissem.bitmessage.entity.BitmessageAddress;
import ch.dissem.bitmessage.entity.Plaintext;
import ch.dissem.bitmessage.entity.valueobject.Label;
import ch.dissem.bitmessage.ports.MessageRepository;
@@ -45,6 +44,7 @@ public class MessageListFragment extends AbstractItemListFragment {
public MessageListFragment() {
}
+ @SuppressLint("ValidFragment")
public MessageListFragment(Context ctx) {
bmc = Singleton.getBitmessageContext(ctx);
}
@@ -98,7 +98,11 @@ public class MessageListFragment extends AbstractItemListFragment {
}
});
if (getActivity() instanceof ActionBarListener) {
- ((ActionBarListener) getActivity()).updateTitle(label.toString());
+ if (label != null) {
+ ((ActionBarListener) getActivity()).updateTitle(label.toString());
+ } else {
+ ((ActionBarListener) getActivity()).updateTitle(getString(R.string.archive));
+ }
}
if (emptyTrashMenuItem != null) {
emptyTrashMenuItem.setVisible(label != null && label.getType() == Label.Type.TRASH);
diff --git a/app/src/main/java/ch/dissem/apps/abit/repository/AndroidInventory.java b/app/src/main/java/ch/dissem/apps/abit/repository/AndroidInventory.java
index 32b9ed8..5e5f1c5 100644
--- a/app/src/main/java/ch/dissem/apps/abit/repository/AndroidInventory.java
+++ b/app/src/main/java/ch/dissem/apps/abit/repository/AndroidInventory.java
@@ -187,7 +187,7 @@ public class AndroidInventory implements Inventory {
"hash = X'" + object.getInventoryVector() + "'",
null, null, null, null
);
- return c.getColumnCount() > 0;
+ return c.getCount() > 0;
}
@Override
From e149efcfff135fb9ce5ce9087361f73b7ad89417 Mon Sep 17 00:00:00 2001
From: Christian Basler
Date: Tue, 20 Oct 2015 21:17:52 +0200
Subject: [PATCH 009/110] Changed string resource
---
.../ch/dissem/apps/abit/notification/NetworkNotification.java | 2 +-
app/src/main/res/values-de/strings.xml | 2 +-
app/src/main/res/values/strings.xml | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/src/main/java/ch/dissem/apps/abit/notification/NetworkNotification.java b/app/src/main/java/ch/dissem/apps/abit/notification/NetworkNotification.java
index b51cc47..99f78d6 100644
--- a/app/src/main/java/ch/dissem/apps/abit/notification/NetworkNotification.java
+++ b/app/src/main/java/ch/dissem/apps/abit/notification/NetworkNotification.java
@@ -27,7 +27,7 @@ public class NetworkNotification extends AbstractNotification {
bmc = Singleton.getBitmessageContext(ctx);
builder = new NotificationCompat.Builder(ctx);
builder.setSmallIcon(R.drawable.ic_notification_full_node)
- .setContentTitle(ctx.getString(R.string.bitmessage_active))
+ .setContentTitle(ctx.getString(R.string.bitmessage_full_node))
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
}
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 28b28b6..383adde 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -4,7 +4,7 @@
Einstellungen
Nur WLAN
Nicht mit Mobilfunknetz verbinden
- Bitmessage ist aktiv
+ Bitmessage Netzknoten
Betreff
An
Nachricht
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 727b3eb..b493dc2 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -2,7 +2,7 @@
Abit
Message Detail
Subscription Detail
- Bitmessage active
+ Bitmessage Node
Wi-Fi Connection Mode
Settings
Wi-Fi only
From f19996f79c06baafa6d9b3ed1a001f8aa3d4c122 Mon Sep 17 00:00:00 2001
From: Christian Basler
Date: Wed, 21 Oct 2015 16:15:57 +0200
Subject: [PATCH 010/110] Removed unused icons
---
.../ic_action_notification_sync.png | Bin 967 -> 0 bytes
.../ic_action_notification_sync_disabled.png | Bin 1059 -> 0 bytes
.../ic_action_notification_sync.png | Bin 580 -> 0 bytes
.../ic_action_notification_sync_disabled.png | Bin 641 -> 0 bytes
.../ic_action_notification_sync.png | Bin 1296 -> 0 bytes
.../ic_action_notification_sync_disabled.png | Bin 1388 -> 0 bytes
.../ic_action_notification_sync.png | Bin 1943 -> 0 bytes
.../ic_action_notification_sync_disabled.png | Bin 2048 -> 0 bytes
.../ic_action_notification_sync.png | Bin 2779 -> 0 bytes
.../ic_action_notification_sync_disabled.png | Bin 2864 -> 0 bytes
10 files changed, 0 insertions(+), 0 deletions(-)
delete mode 100755 app/src/main/res/drawable-hdpi/ic_action_notification_sync.png
delete mode 100755 app/src/main/res/drawable-hdpi/ic_action_notification_sync_disabled.png
delete mode 100755 app/src/main/res/drawable-mdpi/ic_action_notification_sync.png
delete mode 100755 app/src/main/res/drawable-mdpi/ic_action_notification_sync_disabled.png
delete mode 100755 app/src/main/res/drawable-xhdpi/ic_action_notification_sync.png
delete mode 100755 app/src/main/res/drawable-xhdpi/ic_action_notification_sync_disabled.png
delete mode 100755 app/src/main/res/drawable-xxhdpi/ic_action_notification_sync.png
delete mode 100755 app/src/main/res/drawable-xxhdpi/ic_action_notification_sync_disabled.png
delete mode 100755 app/src/main/res/drawable-xxxhdpi/ic_action_notification_sync.png
delete mode 100755 app/src/main/res/drawable-xxxhdpi/ic_action_notification_sync_disabled.png
diff --git a/app/src/main/res/drawable-hdpi/ic_action_notification_sync.png b/app/src/main/res/drawable-hdpi/ic_action_notification_sync.png
deleted file mode 100755
index d938029163421b0b20417517e44df7ed0ef7cff3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 967
zcmV;&133JNP)^$&{q`T)1Af4X%}k
zUn|6*010s=uzdtkR-uSk1-Pu<3mDA95Kl;Yy9J^NAR;cbVM)JFGFmDzsfV
zL#}r?J=BsDtpJY!mjgQ_{n-I=QVB^9c3d~a(}fZTB<-zLp&B3}E(Kl&9PfvLJ(B+E
zQbN)%T~0-W!^rXPoN#q|pti)e0NevSnoc=x9lws_>XA9I3%E5GzaVLU%|hB`F3V8#rEh@yYub)lfJ=Z^
zGyZLGy`+C@PHY0eX~0MMz1xoamdcy)^|b)LAsN8$9_w1;f8CB`tDf;;7udK3FpM~*edCrzQ!iaiwGA47Y2{n
zCUF9kW%MoJ$<{E+GWt|e)mEg8T5{jWRs$!1M0$)
zRX{i=-pkil8P{cgEU82b#IgVq!cQF@F2ZS=A5K=c;h#;L*ysAP0TRMFaR+d7R;OvU
z-vD+=ifI$4T^|HsWF+sZHv-oIR{-Y$?w`uxyR8)%4
z#QEkjI!)Fw5SLMpK~H{UV`d5zVP$~9Pkto<4h$Ldk8k}$;8V3|XP*Biq5JWKIfD2tHiXy={p%_qN9O6RMg#(yuL<9#E6$K%S
zECh`hag_wYl?dX(8I229Do#*xLiMB5fA`;gU*|mu^o8*F)396|ph&Ud25jeBMIq!cN*s%}*>HMR>*=gv_3PePl2y6r{1O5ay
zNcyb>z#G6>EdVO#XJ;OA1|s5WU@LGeV1qA7dfkRHx{oD*Z|4B;Jn&WrxQ&0@woFR5R9Fgf#$`
zQmf5-z~jKWJm(!r&n+B4M4SP<0-Ow(eh0y+vnmq_!0)|Zu@w<^emihem_FFQa2Cm4L
zEUO;^*8%s{CAP07YV~wE@JtmDNj`J%Dq!;WlHYM
z|Nj!WL((5Z5tIUO0lo&TO#>HIdY>RxFi~B0T@FQrd!xPi-1)yz(l3hwa7qI3uh+V!
z=0`;5W!L6ZM63b!Ub_}r#I_I-Hv$i(!4KRU)nw7>a24Q^;TkEUPe}+4cX(&=7Bzm%`WzdoW!>EIoy0cF8~iUFVy7pd%)9}Z`Kv_K$pbU
zS_*fnYb5=;6adM>rCEH<8MkYoajeI
zZfH(+C5~5n=K@eGSkJ-D)dj#Q<`MLymUosjQfBH{D(}pKts+_XsSkj^X6y#O18!}b
z>`Is@VjyMDdF+2}&fB&N`kt1r5+`Ik{aMxXw_J9<2X-tHz!4cS|8^}$_@^P?c4}>h
zFFP~$l%y{f2B75NlD+xK=9^OIZKEiKN}O8O-U-06BHd+YVqjumWCW%Z8X3URuTKn&
d4&lfH{sWr?uRudbvR?oI002ovPDHLkV1fpW-(~;+
diff --git a/app/src/main/res/drawable-mdpi/ic_action_notification_sync.png b/app/src/main/res/drawable-mdpi/ic_action_notification_sync.png
deleted file mode 100755
index f051d5ec3d3de66def49e39d2461e33039baa43b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 580
zcmV-K0=xZ*P)@D
ztV9zlAyptjqA4Qil^f=T@g;e8c2*Js?^Mg~?A~Y2oO^b}E)VT;eVPD!TLCk>Ch2t*
zA7v}x#eqAL&hI#YnLPw9g~AtsHA#PRKuRlMW>puNcMBMn^gC+NW55$&P|{*{7epWQ==I=P@}P+!%Le^br2pfR{#gvYK%&9(BzQ}5P`TSJQ>db$3u(O9zQO7
zLMjbV_b)gE%!hk#Bn>7nJxt67h(O!}-lAD&!~X$L>0nwJpseKe^P2!o1^xooe8C~E
S!y|M60000F)9X
diff --git a/app/src/main/res/drawable-mdpi/ic_action_notification_sync_disabled.png b/app/src/main/res/drawable-mdpi/ic_action_notification_sync_disabled.png
deleted file mode 100755
index d8e45269053600a30ca7004c3c5cb9aee6fffa9e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 641
zcmV-{0)G98P)m)C`5^cvSe>X>@_T;
z$Xmuw-`ja~dS>o@ZqL1SOZU{R+kN?+@AUGS(vJ+lJz!VMbm8pHf;rcLKofwgES1xu2GfLXIpIFS-H165Iqf
zSc2S8iHRBINM&^gc#|Y(+6C>z@RTzRT$Xe_op2}c1XvABlOrPb0mofrlFrmNVOG74
zq1Opu6R^E#!iSzQ3mNqXB6fCSj)e9_1
z1K*bb%mGdUJDQbMtrVoqeJLFQhO;4M07YC4#HV&8cjYp23J#^0-xtf5&Hn5*bSE4H
zo|Ve#k|bZ#9W~)nAm7}>T0UqbW1a^L;CXETRR(JHy`LwF>$)cZ+67-(MC}f$`@24X
bJ_CON+;#UMEIbiV00000NkvXXu0mjfMFkG{
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_notification_sync.png b/app/src/main/res/drawable-xhdpi/ic_action_notification_sync.png
deleted file mode 100755
index 7e1ffedb3e0c682c98bd9b7ee51d8b07c5cf2d1a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1296
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