From cb2040b0cedbeabf0fd600ae9df5b83ed67059f5 Mon Sep 17 00:00:00 2001 From: Christian Basler Date: Fri, 14 Aug 2015 17:25:05 +0200 Subject: [PATCH] Receiving almost works, unfortunately, JDBC doesn't so I have to rewrite the whole damn repository code. --- app/build.gradle | 2 + app/src/main/AndroidManifest.xml | 49 ++++ .../apps/abit/ComposeMessageActivity.java | 28 +++ .../apps/abit/ComposeMessageFragment.java | 77 +++++++ .../java/ch/dissem/apps/abit/Identicon.java | 102 +++++++++ .../dissem/apps/abit/MessageListActivity.java | 43 +++- .../dissem/apps/abit/MessageListFragment.java | 5 +- .../apps/abit/OpenBitmessageLinkActivity.java | 113 ++++++++++ .../ch/dissem/apps/abit/SQLiteConfig.java | 37 --- .../abit/repositories/AndroidInventory.java | 7 + .../delight/android/identicons/Identicon.java | 213 ------------------ .../res/drawable-hdpi/ic_action_close.png | Bin 0 -> 246 bytes .../main/res/drawable-hdpi/ic_action_send.png | Bin 0 -> 371 bytes .../drawable-hdpi/ic_fab_compose_message.png | Bin 0 -> 862 bytes .../main/res/drawable-hdpi/ic_plus_sign.png | Bin 293 -> 302 bytes .../res/drawable-mdpi/ic_action_close.png | Bin 0 -> 182 bytes .../main/res/drawable-mdpi/ic_action_send.png | Bin 0 -> 277 bytes .../drawable-mdpi/ic_fab_compose_message.png | Bin 0 -> 593 bytes .../main/res/drawable-mdpi/ic_plus_sign.png | Bin 230 -> 232 bytes .../res/drawable-xhdpi/ic_action_close.png | Bin 0 -> 280 bytes .../res/drawable-xhdpi/ic_action_send.png | Bin 0 -> 497 bytes .../drawable-xhdpi/ic_fab_compose_message.png | Bin 0 -> 1174 bytes .../main/res/drawable-xhdpi/ic_plus_sign.png | Bin 409 -> 383 bytes .../res/drawable-xxhdpi/ic_action_close.png | Bin 0 -> 422 bytes .../res/drawable-xxhdpi/ic_action_send.png | Bin 0 -> 814 bytes .../ic_fab_compose_message.png | Bin 0 -> 1821 bytes .../main/res/drawable-xxhdpi/ic_plus_sign.png | Bin 600 -> 759 bytes .../res/drawable-xxxhdpi/ic_plus_sign.png | Bin 895 -> 1043 bytes .../layout/activity_open_bitmessage_link.xml | 66 ++++++ .../res/layout/fragment_compose_message.xml | 51 +++++ .../main/res/layout/fragment_message_list.xml | 5 +- app/src/main/res/layout/toolbar_layout.xml | 54 +++-- app/src/main/res/menu/compose.xml | 9 + app/src/main/res/values-de/strings.xml | 10 + app/src/main/res/values-w820dp/dimens.xml | 22 ++ app/src/main/res/values/colors.xml | 10 +- app/src/main/res/values/dimens.xml | 21 ++ app/src/main/res/values/strings.xml | 18 ++ 38 files changed, 657 insertions(+), 285 deletions(-) create mode 100644 app/src/main/java/ch/dissem/apps/abit/ComposeMessageActivity.java create mode 100644 app/src/main/java/ch/dissem/apps/abit/ComposeMessageFragment.java create mode 100644 app/src/main/java/ch/dissem/apps/abit/Identicon.java create mode 100644 app/src/main/java/ch/dissem/apps/abit/OpenBitmessageLinkActivity.java delete mode 100644 app/src/main/java/ch/dissem/apps/abit/SQLiteConfig.java create mode 100644 app/src/main/java/ch/dissem/apps/abit/repositories/AndroidInventory.java delete mode 100644 app/src/main/java/im/delight/android/identicons/Identicon.java create mode 100644 app/src/main/res/drawable-hdpi/ic_action_close.png create mode 100644 app/src/main/res/drawable-hdpi/ic_action_send.png create mode 100644 app/src/main/res/drawable-hdpi/ic_fab_compose_message.png create mode 100644 app/src/main/res/drawable-mdpi/ic_action_close.png create mode 100644 app/src/main/res/drawable-mdpi/ic_action_send.png create mode 100644 app/src/main/res/drawable-mdpi/ic_fab_compose_message.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_action_close.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_action_send.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_fab_compose_message.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_close.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_send.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_fab_compose_message.png create mode 100644 app/src/main/res/layout/activity_open_bitmessage_link.xml create mode 100644 app/src/main/res/layout/fragment_compose_message.xml create mode 100644 app/src/main/res/menu/compose.xml create mode 100644 app/src/main/res/values-w820dp/dimens.xml create mode 100644 app/src/main/res/values/dimens.xml diff --git a/app/build.gradle b/app/build.gradle index 679e0a6..957eac4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,6 +37,8 @@ dependencies { compile('com.mikepenz:materialdrawer:3.1.0@aar') { transitive = true } + compile 'com.mikepenz:iconics:1.6.2@aar' + compile 'com.mikepenz:community-material-typeface:1.1.71@aar' } idea.module { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3f38a3f..e94bbb0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -30,12 +30,45 @@ android:name="android.support.PARENT_ACTIVITY" android:value=".MessageListActivity"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -46,6 +79,22 @@ android:exported="true" android:permission=""> + + + + + + + + + + + + + diff --git a/app/src/main/java/ch/dissem/apps/abit/ComposeMessageActivity.java b/app/src/main/java/ch/dissem/apps/abit/ComposeMessageActivity.java new file mode 100644 index 0000000..c64fde7 --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/ComposeMessageActivity.java @@ -0,0 +1,28 @@ +package ch.dissem.apps.abit; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; + +/** + * Compose a new message. + */ +public class ComposeMessageActivity extends AppCompatActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.toolbar_layout); + + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_action_close); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setHomeButtonEnabled(false); + + // Display the fragment as the main content. + getSupportFragmentManager().beginTransaction() + .replace(R.id.content, new ComposeMessageFragment()) + .commit(); + } +} diff --git a/app/src/main/java/ch/dissem/apps/abit/ComposeMessageFragment.java b/app/src/main/java/ch/dissem/apps/abit/ComposeMessageFragment.java new file mode 100644 index 0000000..27615a0 --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/ComposeMessageFragment.java @@ -0,0 +1,77 @@ +package ch.dissem.apps.abit; + +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.*; +import android.view.inputmethod.EditorInfo; +import android.widget.EditText; +import android.widget.Toast; +import ch.dissem.bitmessage.BitmessageContext; +import ch.dissem.bitmessage.entity.BitmessageAddress; + +/** + * Compose a new message. + */ +public class ComposeMessageFragment extends Fragment { + /** + * The fragment argument representing the sender identity. + */ + public static final String ARG_IDENTITY = "from"; + /** + * The fragment argument representing the recipient. + */ + public static final String ARG_RECIPIENT = "to"; + + private BitmessageContext bmCtx; + private BitmessageAddress identity; + private BitmessageAddress recipient; + + /** + * Mandatory empty constructor for the fragment manager to instantiate the + * fragment (e.g. upon screen orientation changes). + */ + public ComposeMessageFragment() { + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + if (getArguments().containsKey(ARG_IDENTITY)) { + identity = (BitmessageAddress) getArguments().getSerializable(ARG_IDENTITY); + } + if (getArguments().containsKey(ARG_RECIPIENT)) { + recipient = (BitmessageAddress) getArguments().getSerializable(ARG_RECIPIENT); + } + } + setHasOptionsMenu(true); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_compose_message, container, false); + EditText body = (EditText) rootView.findViewById(R.id.body); + body.setInputType(EditorInfo.TYPE_TEXT_VARIATION_SHORT_MESSAGE | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE); + body.setImeOptions(EditorInfo.IME_ACTION_SEND | EditorInfo.IME_FLAG_NO_ENTER_ACTION); + return rootView; + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.compose, menu); + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.send: + Toast.makeText(getActivity(), "TODO: Send", Toast.LENGTH_SHORT).show(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } +} + diff --git a/app/src/main/java/ch/dissem/apps/abit/Identicon.java b/app/src/main/java/ch/dissem/apps/abit/Identicon.java new file mode 100644 index 0000000..3222b78 --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/Identicon.java @@ -0,0 +1,102 @@ +/* + * Copyright 2015 Christian Basler + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.dissem.apps.abit; + + +import android.graphics.*; +import android.graphics.drawable.Drawable; +import ch.dissem.bitmessage.entity.BitmessageAddress; + +/** + * + */ +public class Identicon extends Drawable { + private static final int SIZE = 9; + private static final int CENTER_COLUMN = 5; + + private final Paint paint; + private float cellWidth; + private float cellHeight; + private byte[] hash; + private int color; + private int background; + private boolean[][] fields; + + public Identicon(BitmessageAddress input) { + paint = new Paint(); + paint.setStyle(Paint.Style.FILL); + paint.setAntiAlias(true); + + hash = input.getRipe(); + + fields = new boolean[SIZE][SIZE]; + color = Color.HSVToColor(new float[]{Math.abs(hash[0] * hash[1] + hash[2]) % 360, 0.8f, 1.0f}); + background = Color.HSVToColor(new float[]{Math.abs(hash[1] * hash[2] + hash[0]) % 360, 0.8f, 1.0f}); + + for (int row = 0; row < SIZE; row++) { + for (int column = 0; column < SIZE; column++) { + fields[row][column] = hash[(row * (column < CENTER_COLUMN ? column : SIZE - column - 1)) % hash.length] >= 0; + } + } + } + + protected byte getByte(int index) { + return hash[index % hash.length]; + } + + @Override + public void draw(Canvas canvas) { + float x, y; + paint.setColor(background); + canvas.drawPaint(paint); + paint.setColor(color); + for (int row = 0; row < SIZE; row++) { + for (int column = 0; column < SIZE; column++) { + if (fields[row][column]) { + x = cellWidth * column; + y = cellHeight * row; + + canvas.drawCircle(x + cellWidth / 2, y + cellHeight / 2, cellHeight / 2, paint); + } + } + } + } + + @Override + public void setAlpha(int alpha) { + paint.setAlpha(alpha); + } + + @Override + public void setColorFilter(ColorFilter cf) { + paint.setColorFilter(cf); + } + + @Override + public int getOpacity() { + return PixelFormat.OPAQUE; + } + + @Override + protected void onBoundsChange(Rect bounds) { + super.onBoundsChange(bounds); + + cellWidth = bounds.width() / (float) SIZE; + cellHeight = bounds.height() / (float) SIZE; + } + +} \ No newline at end of file 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 94376e3..ec02e0c 100644 --- a/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java +++ b/app/src/main/java/ch/dissem/apps/abit/MessageListActivity.java @@ -5,13 +5,16 @@ import android.os.Bundle; 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 android.widget.Toast; 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; import com.mikepenz.materialdrawer.Drawer; @@ -59,6 +62,7 @@ public class MessageListActivity extends AppCompatActivity private AccountHeader accountHeader; private BitmessageContext bmc; private Label selectedLabel; + private Menu menu; @Override protected void onCreate(Bundle savedInstanceState) { @@ -68,7 +72,7 @@ public class MessageListActivity extends AppCompatActivity setContentView(R.layout.activity_message_list); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); if (findViewById(R.id.message_detail_container) != null) { @@ -109,7 +113,7 @@ public class MessageListActivity extends AppCompatActivity .withIdentifier(ADD_IDENTITY) ); profiles.add(new ProfileSettingDrawerItem() - .withName("Manage Account") + .withName(getString(R.string.manage_identity)) .withIcon(GoogleMaterial.Icon.gmd_settings) ); // Create the AccountHeader @@ -150,6 +154,9 @@ public class MessageListActivity extends AppCompatActivity .withAccountHeader(accountHeader) .withDrawerItems(drawerItems) .addStickyDrawerItems( + new SecondaryDrawerItem() + .withName(getString(R.string.subscriptions)) + .withIcon(CommunityMaterial.Icon.cmd_rss), new SecondaryDrawerItem() .withName(R.string.settings) .withIcon(GoogleMaterial.Icon.gmd_settings) @@ -162,6 +169,9 @@ public class MessageListActivity extends AppCompatActivity } else if (item instanceof Nameable) { Nameable ni = (Nameable) item; switch (ni.getNameRes()) { + case R.string.subscriptions: + // TODO + break; case R.string.settings: startActivity(new Intent(MessageListActivity.this, SettingsActivity.class)); break; @@ -176,10 +186,37 @@ public class MessageListActivity extends AppCompatActivity @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); - return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.sync_disabled: + bmc.startup(new BitmessageContext.Listener() { + @Override + public void receive(Plaintext plaintext) { + // TODO + Toast.makeText(MessageListActivity.this, plaintext.getSubject(), Toast.LENGTH_LONG).show(); + } + }); + updateMenu(); + return true; + case R.id.sync_enabled: + bmc.shutdown(); + updateMenu(); + return true; + default: + return super.onOptionsItemSelected(item); + } } /** 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 f6d09d8..9bcf399 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.Intent; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.v4.app.ListFragment; @@ -9,8 +10,6 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; -import android.widget.TextView; -import android.widget.Toast; import ch.dissem.apps.abit.service.Singleton; import ch.dissem.bitmessage.BitmessageContext; import ch.dissem.bitmessage.entity.Plaintext; @@ -97,7 +96,7 @@ public class MessageListFragment extends ListFragment { fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - Toast.makeText(MessageListFragment.this.getActivity(), "TODO", Toast.LENGTH_SHORT).show(); + startActivity(new Intent(getActivity().getApplicationContext(), ComposeMessageActivity.class)); } }); diff --git a/app/src/main/java/ch/dissem/apps/abit/OpenBitmessageLinkActivity.java b/app/src/main/java/ch/dissem/apps/abit/OpenBitmessageLinkActivity.java new file mode 100644 index 0000000..cff4772 --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/OpenBitmessageLinkActivity.java @@ -0,0 +1,113 @@ +/* + * Copyright 2015 Christian Basler + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ch.dissem.apps.abit; + +import android.app.Activity; +import android.net.Uri; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.Switch; +import android.widget.TextView; +import ch.dissem.apps.abit.service.Singleton; +import ch.dissem.bitmessage.BitmessageContext; +import ch.dissem.bitmessage.entity.BitmessageAddress; + +public class OpenBitmessageLinkActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_open_bitmessage_link); + + final TextView addressView = (TextView) findViewById(R.id.address); + final EditText label = (EditText) findViewById(R.id.label); + final Switch importContact = (Switch) findViewById(R.id.import_contact); + final Switch subscribe = (Switch) findViewById(R.id.subscribe); + + Uri uri = getIntent().getData(); + final String address = getAddress(uri); + String[] parameters = getParameters(uri); + for (String parameter : parameters) { + String name = parameter.substring(0, 6).toLowerCase(); + if (name.startsWith("label")) { + label.setText(parameter.substring(parameter.indexOf('=') + 1).trim()); + } else if (name.startsWith("action")) { + parameter = parameter.toLowerCase(); + importContact.setChecked(parameter.contains("add")); + subscribe.setChecked(parameter.contains("subscribe")); + } + } + + addressView.setText(address); + + + final Button cancel = (Button) findViewById(R.id.cancel); + cancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + setResult(Activity.RESULT_CANCELED); + finish(); + } + }); + final Button ok = (Button) findViewById(R.id.do_import); + ok.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + BitmessageContext bmc = Singleton.getBitmessageContext(OpenBitmessageLinkActivity.this); + BitmessageAddress bmAddress = new BitmessageAddress(address); + bmAddress.setAlias(label.getText().toString()); + if (subscribe.isChecked()) { + bmc.addSubscribtion(bmAddress); + } + if (importContact.isChecked()) { + bmc.addContact(bmAddress); + } + setResult(Activity.RESULT_OK); + finish(); + } + }); + } + + private String getAddress(Uri uri) { + StringBuilder result = new StringBuilder(); + String schemeSpecificPart = uri.getSchemeSpecificPart(); + if (!schemeSpecificPart.startsWith("BM-")) { + result.append("BM-"); + } + if (schemeSpecificPart.contains("?")) { + result.append(schemeSpecificPart.substring(0, schemeSpecificPart.indexOf('?'))); + } else if (schemeSpecificPart.contains("#")) { + result.append(schemeSpecificPart.substring(0, schemeSpecificPart.indexOf('#'))); + } else { + result.append(schemeSpecificPart); + } + return result.toString(); + } + + private String[] getParameters(Uri uri) { + int index = uri.getSchemeSpecificPart().indexOf('?'); + if (index >= 0) { + String parameterPart = uri.getSchemeSpecificPart().substring(index + 1); + return parameterPart.split("&"); + } else { + return new String[0]; + } + } +} diff --git a/app/src/main/java/ch/dissem/apps/abit/SQLiteConfig.java b/app/src/main/java/ch/dissem/apps/abit/SQLiteConfig.java deleted file mode 100644 index 6b230d2..0000000 --- a/app/src/main/java/ch/dissem/apps/abit/SQLiteConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package ch.dissem.apps.abit; - -import android.content.Context; -import android.database.sqlite.SQLiteDatabase; -import android.os.Environment; -import ch.dissem.bitmessage.repository.JdbcConfig; -import org.flywaydb.core.api.android.ContextHolder; -import org.sqldroid.SQLDroidDriver; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.util.Properties; - -/** - * Created by chris on 14.07.15. - */ -public class SQLiteConfig extends JdbcConfig { - - public SQLiteConfig(Context ctx) { - super(getDbUrl(ctx), "", ""); - } - - private static String getDbUrl(Context ctx) { - SQLiteDatabase db = ctx.openOrCreateDatabase(Environment.getExternalStorageDirectory() - + "/jabit.db", Context.MODE_PRIVATE, null); - ContextHolder.setContext(ctx); - return "jdbc:sqlite:" + db.getPath() + "?timeout=5"; - } - - @Override - public Connection getConnection() throws SQLException { - Properties removeLocale = new Properties(); - removeLocale.put(SQLDroidDriver.ADDITONAL_DATABASE_FLAGS, android.database.sqlite.SQLiteDatabase.NO_LOCALIZED_COLLATORS); - return DriverManager.getConnection(dbUrl, removeLocale); - } -} diff --git a/app/src/main/java/ch/dissem/apps/abit/repositories/AndroidInventory.java b/app/src/main/java/ch/dissem/apps/abit/repositories/AndroidInventory.java new file mode 100644 index 0000000..80d9bdd --- /dev/null +++ b/app/src/main/java/ch/dissem/apps/abit/repositories/AndroidInventory.java @@ -0,0 +1,7 @@ +package ch.dissem.apps.abit.repositories; + +/** + * Created by chris on 14.08.15. + */ +public class AndroidInventory { +} diff --git a/app/src/main/java/im/delight/android/identicons/Identicon.java b/app/src/main/java/im/delight/android/identicons/Identicon.java deleted file mode 100644 index c419318..0000000 --- a/app/src/main/java/im/delight/android/identicons/Identicon.java +++ /dev/null @@ -1,213 +0,0 @@ -package im.delight.android.identicons; - -/** - * Copyright 2014 www.delight.im - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.security.MessageDigest; -import android.annotation.SuppressLint; -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.os.Build; -import android.util.AttributeSet; -import android.view.View; - -abstract public class Identicon extends View { - - private static final String HASH_ALGORITHM = "SHA-256"; - private final int mRowCount; - private final int mColumnCount; - private final Paint mPaint; - private volatile int mCellWidth; - private volatile int mCellHeight; - private volatile byte[] mHash; - private volatile int[][] mColors; - private volatile boolean mReady; - - public Identicon(Context context) { - super(context); - - mRowCount = getRowCount(); - mColumnCount = getColumnCount(); - mPaint = new Paint(); - - init(); - } - - public Identicon(Context context, AttributeSet attrs) { - super(context, attrs); - - mRowCount = getRowCount(); - mColumnCount = getColumnCount(); - mPaint = new Paint(); - - init(); - } - - public Identicon(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - - mRowCount = getRowCount(); - mColumnCount = getColumnCount(); - mPaint = new Paint(); - - init(); - } - - @SuppressLint("NewApi") - protected void init() { - mPaint.setStyle(Paint.Style.FILL); - mPaint.setAntiAlias(true); - mPaint.setDither(true); - - setWillNotDraw(false); - if (Build.VERSION.SDK_INT >= 11) { - setLayerType(View.LAYER_TYPE_SOFTWARE, null); - } - } - - public void show(String input) { - // if the input was null - if (input == null) { - // we can't create a hash value and have nothing to show (draw to the view) - mHash = null; - } - // if the input was a proper string (non-null) - else { - // generate a hash from the string to get unique but deterministic byte values - try { - final MessageDigest digest = java.security.MessageDigest.getInstance(HASH_ALGORITHM); - digest.update(input == null ? new byte[0] : input.getBytes()); - mHash = digest.digest(); - } - catch (Exception e) { - mHash = null; - } - } - - // set up the cell colors according to the input that was provided via show(...) - setupColors(); - - // this view may now be drawn (and thus must be re-drawn) - mReady = true; - invalidate(); - } - - public void show(int input) { - show(String.valueOf(input)); - } - - public void show(long input) { - show(String.valueOf(input)); - } - - public void show(float input) { - show(String.valueOf(input)); - } - - public void show(double input) { - show(String.valueOf(input)); - } - - public void show(byte input) { - show(String.valueOf(input)); - } - - public void show(char input) { - show(String.valueOf(input)); - } - - public void show(boolean input) { - show(String.valueOf(input)); - } - - public void show(Object input) { - if (input == null) { - mHash = null; - } - else { - show(String.valueOf(input)); - } - } - - protected void setupColors() { - mColors = new int[mRowCount][mColumnCount]; - int colorVisible = getIconColor(); - - for (int r = 0; r < mRowCount; r++) { - for (int c = 0; c < mColumnCount; c++) { - if (isCellVisible(r, c)) { - mColors[r][c] = colorVisible; - } - else { - mColors[r][c] = Color.TRANSPARENT; - } - } - } - } - - protected byte getByte(int index) { - if (mHash == null) { - return -128; - } - else { - return mHash[index % mHash.length]; - } - } - - abstract protected int getRowCount(); - - abstract protected int getColumnCount(); - - abstract protected boolean isCellVisible(int row, int column); - - abstract protected int getIconColor(); - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - - mCellWidth = w / mColumnCount; - mCellHeight = h / mRowCount; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - int size = Math.min(getMeasuredWidth(), getMeasuredHeight()); - setMeasuredDimension(size, size); - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - if (mReady) { - int x, y; - for (int r = 0; r < mRowCount; r++) { - for (int c = 0; c < mColumnCount; c++) { - x = mCellWidth * c; - y = mCellHeight * r; - - mPaint.setColor(mColors[r][c]); - - canvas.drawRect(x, y + mCellHeight, x + mCellWidth, y, mPaint); - } - } - } - } - -} \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/ic_action_close.png b/app/src/main/res/drawable-hdpi/ic_action_close.png new file mode 100644 index 0000000000000000000000000000000000000000..7031319f71d73acfdff14ec2746be72c7de7fc57 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUty`CJ;|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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_action_send.png b/app/src/main/res/drawable-hdpi/ic_action_send.png new file mode 100644 index 0000000000000000000000000000000000000000..e6c165d03909ecc64fd5b0b5ae3ceb029c7de8ea GIT binary patch literal 371 zcmV-(0gV2MP)LR%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|@~ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_plus_sign.png b/app/src/main/res/drawable-hdpi/ic_plus_sign.png index b1fbbf8c1241ae497eee6fd7cc01ef31536acc6c..54aef0566744e0ce8e5335b666401256d624613e 100755 GIT binary patch delta 275 zcmV+u0qp*z0Y_XcSpU79#926e_)i7i_u77&I3m9;Gz5E^Mm0(hcA*Zk zNM1ED!Je8}O-$HDO+1w>?Lt$T0&-p{=b%8}PfUaZ!l5Y#S-2`9fdCL>rG!d>6k3U- ZFJDc#F#+#y(hL9q002ovPDHLkV1lmBZx{do delta 266 zcmV+l0rmc_0;K|wB!BElL_t(&L+zKr4Z<)G1oz6}&7VqWf=XzDO8DnZIYvl+poln! zR|&G1eB(R&X4gJDH24>TuU{1KYXwmN1xx~1$OLGIqkxUjOn?F=Ks$Uh1xhIgNyoav zDIy;BYCj~{vVgOsOP%u?5jP4zfiFBzO2I-IUToqeN?0i4AAhOuO+0H-OH;j?*s1=! zOPW^J)Ya^|_Q1>@Nmi@Fx|-eJ7Vv)08P7tiW{|`wl%dpn3T1MmK!y?uG$>&qER-bB zxQ&kes5k3Rhj-nD(%E+yNC7)QZcc#$C}0x6LMA{v90hEIW&#v20ovhDnsjn8K}bkr Q00000NkvXXt^-0~f{(9qIsgCw diff --git a/app/src/main/res/drawable-mdpi/ic_action_close.png b/app/src/main/res/drawable-mdpi/ic_action_close.png new file mode 100644 index 0000000000000000000000000000000000000000..c71f1c4468bb206c78608d3816dc4c27e63ea067 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_action_send.png b/app/src/main/res/drawable-mdpi/ic_action_send.png new file mode 100644 index 0000000000000000000000000000000000000000..ca5ad5ce44752a535bffbc419ec5488bd2aaa26d GIT binary patch literal 277 zcmV+w0qXvVP)ueFA3(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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..ea4de0230320ba8211b9fe709ef68d6a9e064d68 GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_plus_sign.png b/app/src/main/res/drawable-mdpi/ic_plus_sign.png index 478b2c74615c150e3a08ff95872000a346e83147..72840771415e2e1392147e5268798aa1286e96e3 100755 GIT binary patch delta 204 zcmV;-05kvQ0q6mcB!90-L_t(oN9~o%2?9Y7L|+Brrl4n|a8nR83F9yc7d8cr!n3BJ zL9{3%$m*eK2Uely+@G3PP%TD&8hJk{AWXo_RzO=U+)L^rc77vZ11!tZUeY!NB!MK5 z1ga1y3D-D=&4F2|I{`;W&t;gHZ%JroJur0)iOTaW^35x4NOFA;fC^B7OA4rJXE7F$JsRgQfES;=@G}Z=1)vA8IKU_( zTSNr{+(Q93Tn%d;c=@|e0BR5D8DlmTDBS+2OlErrpL+w)YD0Ym&`ihw1K6!npWrCl zs>*+W3Rox1Yeq#na@ujE^L^XX{D^*4=;#~*Pys6N0Wrx~A!~{y_5c6?07*qoM6N<$ Ef-(D7Hvj+t diff --git a/app/src/main/res/drawable-xhdpi/ic_action_close.png b/app/src/main/res/drawable-xhdpi/ic_action_close.png new file mode 100644 index 0000000000000000000000000000000000000000..2eb9589dd6307b9d20c948744606920c00047669 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=_dQ)4Ln>~)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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_action_send.png b/app/src/main/res/drawable-xhdpi/ic_action_send.png new file mode 100644 index 0000000000000000000000000000000000000000..04daa14977652e133c72ff22e8599edbd080b3bb GIT binary patch literal 497 zcmVi5saH0VCo+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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..af0217a8945cb027787a822dab4d41938fa9226f GIT binary patch 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_plus_sign.png b/app/src/main/res/drawable-xhdpi/ic_plus_sign.png index e94e8136ca4576f6cfaec84a377f84ca42b73f43..d320ebf7ce139a50fe6d8a85b8d27f57240b6035 100755 GIT binary patch delta 356 zcmbQq{GVxpO1+z>i(^Pd+}oLZd6^7(TIZKL1SnX&h-~WOjA-B#5K;~Z2s$KD(sO`; zr@=udQKe;t9?KMs7gOHfIz2yrp6u=OAwScn-qvSmV4SMlz#Zbp(3DUpUhutdiDyHl zyYcSnDNpSgB)o62_RN`mlaqlF=FWcMBPl7#t^rH`J$3uvs9s>sCjqDt5+hs^B@1>+q_I vVM15J?dOLZw%t#7^)t~yt0{MWye+d_)zdGI^K$Zg8Gyjk)z4*}Q$iB}zmAn( delta 382 zcmV-^0fGMi0+|DlB!6H@L_t(|UhSGOYQsPfMc?2iMGQWGAx$86%LNQMfWa5=-3)00 zIY1yO(u4_ubt4-j;T>zye6?DycK-ao`@du(`DMxLM*xTc$q|qQk`q9ipd=s(Bu79J zNKOEq0+N6vkQ{+oB;fAdb02|K!T%5VF*Cn+Kjs2p4ZHzQrGMZLU~gvMSpe7oN8qIt zd;(t0>`MUL8G*SZAO=VR+5@x+>J-p1C?Bv8BXq^v580W{2ONOsGVmSP0b`wDwd_#E z2)TRT+YbTIg`h3)PzL@2pFmgGn5$ZLs0BdZ*^MdUmNC_`g8;at4d>rV0+%m1hHzch zCOA}W|Gv8`4RV9fP&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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_send.png b/app/src/main/res/drawable-xxhdpi/ic_action_send.png new file mode 100644 index 0000000000000000000000000000000000000000..d36f994db6136de671ab12aa242217a6da1b86af GIT binary patch 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 literal 0 HcmV?d00001 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 new file mode 100644 index 0000000000000000000000000000000000000000..40ae82aa53495add93496912ac01be443b2bd801 GIT binary patch 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{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_plus_sign.png b/app/src/main/res/drawable-xxhdpi/ic_plus_sign.png index 86791667b88fde7e8ec34cc9a75f3a5121c6bca7..24e567d7429c6eacdeafdbdc6b19bbeb031c599d 100755 GIT binary patch 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*>`#yEK;^{MQgrE^ctwI;7hr;ASbQ=th?T9D42X`hc7TeGkCiCxvXV3PNAaSW-5dppa~i^WlZW%v22 z5B~R9_iO!Ns9*A^HpP+u5nqt0=kawd&sUu>P2z4TPn{UhidKJ;3syN}pt@E1WsE%c}FT&;1PaPc~ooj%nY6{cjR>&oAD$ z$s_wM*NTr_{@MzCTf|m0NUi^|h3Sz;b|Zy?-mGu-rd+lAWU;r+_Wc{19>aTGmHUr{ z?^~lQ{NcFwwZOEOe^d3dxh&TEF}_@1V(8E4n((rabxEh#XORGwX>$MTnfzL|U{6AvvF7b_5^y@S&xf*<_8X>@F{N;as-krqr^>Plt6vN=@>gTe~ HDWM4f^tkR1 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_plus_sign.png b/app/src/main/res/drawable-xxxhdpi/ic_plus_sign.png index 1958de16cfd97974858f0ca8cf12fa71ebbdb90f..491d801ec719d0ad6a9327922992ba7e8ff0275f 100755 GIT binary patch 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~BGkCiCxvXpU4DT3X_HimO6tF+|d15*JrGoyvs5tbXp zUn;qF?A@)_z`5ah^1q1LoC!=3OuCJIjqN-)7~e3IH88WwFn{l9R=psU!MTMc3Mf}6 zS#q`^xFPt!yzKe&S@hnn1M1N++%*5cHJcR*tO|T#&+g^Rm>#p;{+7plwaWQVj-GM) zyXk|ur(OTP3uiu`zFQu^+pzTYH}~&L?@L_jesFkZYn|%PX-od!eH8d^Uvn0N&ekuw zW=|(&Py4+ql0k3h-%f@(pMLl7XX)*ZeZ7Ac1Bb)f=<_zLYwD-WkGjZW!06Ku$+j%B zYSNR#otCvjHwgw;gFJCa@_JY8> zvKxx+IBsP%|6+FxpIXhJ<_}*3IT`N1wtmXZFo$bElHh;+>v9 + + + + + + + + + + + + + + +