From 733288678698bd42ff9bb72aace785690b0bb0ae Mon Sep 17 00:00:00 2001 From: Christian Basler Date: Tue, 25 Oct 2016 07:30:16 +0200 Subject: [PATCH] Added UI for sending broadcasts - UI shouldn't block until the first identity is ready anymore --- app/build.gradle | 16 ++-- .../apps/abit/AddressDetailFragment.java | 14 +++- .../apps/abit/ComposeMessageActivity.java | 1 + .../apps/abit/ComposeMessageFragment.java | 74 +++++++++++-------- .../ch/dissem/apps/abit/MainActivity.java | 25 +++---- .../dissem/apps/abit/MessageListFragment.java | 43 +++++++++-- .../repository/AndroidMessageRepository.java | 15 ++-- .../abit/service/BitmessageIntentService.java | 1 + .../dissem/apps/abit/service/Singleton.java | 37 +++++++++- .../main/res/drawable/ic_action_broadcast.xml | 24 ++++++ .../main/res/drawable/ic_action_personal.xml | 25 +++++++ .../main/res/drawable/ic_action_qr_code.xml | 4 +- .../main/res/layout/fragment_address_list.xml | 6 +- .../main/res/layout/fragment_message_list.xml | 9 ++- app/src/main/res/menu/fab_message.xml | 27 +++++++ app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + build.gradle | 2 +- 18 files changed, 244 insertions(+), 83 deletions(-) create mode 100644 app/src/main/res/drawable/ic_action_broadcast.xml create mode 100644 app/src/main/res/drawable/ic_action_personal.xml create mode 100644 app/src/main/res/menu/fab_message.xml diff --git a/app/build.gradle b/app/build.gradle index 81387e4..1f657e3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,13 +11,13 @@ if (project.hasProperty("project.configs") //noinspection GroovyMissingReturnStatement android { - compileSdkVersion 24 - buildToolsVersion "24.0.3" + compileSdkVersion 25 + buildToolsVersion "25.0.0" defaultConfig { applicationId "ch.dissem.apps." + appName.toLowerCase() minSdkVersion 19 - targetSdkVersion 24 + targetSdkVersion 25 versionCode 9 versionName "1.0-beta9" jackOptions.enabled = true @@ -36,12 +36,12 @@ android { } } -ext.jabitVersion = '2.0.2' +ext.jabitVersion = '2.0.3' dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:24.2.1' - compile 'com.android.support:support-v4:24.2.1' - compile 'com.android.support:design:24.2.1' + compile 'com.android.support:appcompat-v7:25.0.0' + compile 'com.android.support:support-v4:25.0.0' + compile 'com.android.support:design:25.0.0' compile "ch.dissem.jabit:jabit-core:$jabitVersion" compile "ch.dissem.jabit:jabit-networking:$jabitVersion" @@ -63,7 +63,7 @@ dependencies { compile 'com.journeyapps:zxing-android-embedded:3.3.0@aar' compile 'com.google.zxing:core:3.3.0' - compile 'io.github.yavski:fab-speed-dial:1.0.4' + compile 'io.github.yavski:fab-speed-dial:1.0.6' compile 'com.github.amlcurran.showcaseview:library:5.4.3' compile('com.h6ah4i.android.widget.advrecyclerview:advrecyclerview:0.9.3@aar') { transitive = true diff --git a/app/src/main/java/ch/dissem/apps/abit/AddressDetailFragment.java b/app/src/main/java/ch/dissem/apps/abit/AddressDetailFragment.java index 439823f..eff915a 100644 --- a/app/src/main/java/ch/dissem/apps/abit/AddressDetailFragment.java +++ b/app/src/main/java/ch/dissem/apps/abit/AddressDetailFragment.java @@ -33,6 +33,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.Switch; import android.widget.TextView; +import android.widget.Toast; import com.google.zxing.BarcodeFormat; import com.google.zxing.MultiFormatWriter; @@ -115,10 +116,15 @@ public class AddressDetailFragment extends Fragment { final Activity ctx = getActivity(); switch (menuItem.getItemId()) { case R.id.write_message: { - Intent intent = new Intent(ctx, ComposeMessageActivity.class); - intent.putExtra(ComposeMessageActivity.EXTRA_IDENTITY, Singleton.getIdentity(ctx)); - intent.putExtra(ComposeMessageActivity.EXTRA_RECIPIENT, item); - startActivity(intent); + BitmessageAddress identity = Singleton.getIdentity(ctx); + if (identity == null) { + Toast.makeText(ctx, R.string.no_identity_warning, Toast.LENGTH_LONG).show(); + } else { + Intent intent = new Intent(ctx, ComposeMessageActivity.class); + intent.putExtra(ComposeMessageActivity.EXTRA_IDENTITY, identity); + intent.putExtra(ComposeMessageActivity.EXTRA_RECIPIENT, item); + startActivity(intent); + } return true; } case R.id.delete: { diff --git a/app/src/main/java/ch/dissem/apps/abit/ComposeMessageActivity.java b/app/src/main/java/ch/dissem/apps/abit/ComposeMessageActivity.java index 97a18c1..6bcccf6 100644 --- a/app/src/main/java/ch/dissem/apps/abit/ComposeMessageActivity.java +++ b/app/src/main/java/ch/dissem/apps/abit/ComposeMessageActivity.java @@ -34,6 +34,7 @@ public class ComposeMessageActivity extends AppCompatActivity { public static final String EXTRA_RECIPIENT = "ch.dissem.abit.Message.RECIPIENT"; public static final String EXTRA_SUBJECT = "ch.dissem.abit.Message.SUBJECT"; public static final String EXTRA_CONTENT = "ch.dissem.abit.Message.CONTENT"; + public static final String EXTRA_BROADCAST = "ch.dissem.abit.Message.IS_BROADCAST"; @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/app/src/main/java/ch/dissem/apps/abit/ComposeMessageFragment.java b/app/src/main/java/ch/dissem/apps/abit/ComposeMessageFragment.java index 688812a..0308ced 100644 --- a/app/src/main/java/ch/dissem/apps/abit/ComposeMessageFragment.java +++ b/app/src/main/java/ch/dissem/apps/abit/ComposeMessageFragment.java @@ -34,6 +34,7 @@ import ch.dissem.apps.abit.adapter.ContactAdapter; import ch.dissem.apps.abit.service.Singleton; import ch.dissem.bitmessage.entity.BitmessageAddress; +import static ch.dissem.apps.abit.ComposeMessageActivity.EXTRA_BROADCAST; import static ch.dissem.apps.abit.ComposeMessageActivity.EXTRA_CONTENT; import static ch.dissem.apps.abit.ComposeMessageActivity.EXTRA_IDENTITY; import static ch.dissem.apps.abit.ComposeMessageActivity.EXTRA_RECIPIENT; @@ -50,6 +51,7 @@ public class ComposeMessageFragment extends Fragment { private AutoCompleteTextView recipientInput; private EditText subjectInput; private EditText bodyInput; + private boolean broadcast; /** * Mandatory empty constructor for the fragment manager to instantiate the @@ -67,6 +69,7 @@ public class ComposeMessageFragment extends Fragment { } else { throw new RuntimeException("No identity set for ComposeMessageFragment"); } + broadcast = getArguments().getBoolean(EXTRA_BROADCAST, false); if (getArguments().containsKey(EXTRA_RECIPIENT)) { recipient = (BitmessageAddress) getArguments().getSerializable(EXTRA_RECIPIENT); } @@ -87,23 +90,28 @@ public class ComposeMessageFragment extends Fragment { Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_compose_message, container, false); recipientInput = (AutoCompleteTextView) rootView.findViewById(R.id.recipient); - final ContactAdapter adapter = new ContactAdapter(getContext()); - recipientInput.setAdapter(adapter); - recipientInput.setOnItemClickListener( - (parent, view, position, id) -> recipient = adapter.getItem(position) - ); - recipientInput.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - recipient = adapter.getItem(position); - } + if (broadcast) { + recipientInput.setVisibility(View.GONE); + } else { + final ContactAdapter adapter = new ContactAdapter(getContext()); + recipientInput.setAdapter(adapter); + recipientInput.setOnItemClickListener( + (parent, view, position, id) -> recipient = adapter.getItem(position) + ); + recipientInput.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long + id) { + recipient = adapter.getItem(position); + } - @Override - public void onNothingSelected(AdapterView parent) { + @Override + public void onNothingSelected(AdapterView parent) { + } + }); + if (recipient != null) { + recipientInput.setText(recipient.toString()); } - }); - if (recipient != null) { - recipientInput.setText(recipient.toString()); } subjectInput = (EditText) rootView.findViewById(R.id.subject); subjectInput.setText(subject); @@ -132,25 +140,31 @@ public class ComposeMessageFragment extends Fragment { public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.send: - String inputString = recipientInput.getText().toString(); - if (recipient == null || !recipient.toString().equals(inputString)) { - try { - recipient = new BitmessageAddress(inputString); - } catch (Exception e) { - List contacts = Singleton.getAddressRepository - (getContext()).getContacts(); - for (BitmessageAddress contact : contacts) { - if (inputString.equalsIgnoreCase(contact.getAlias())) { - recipient = contact; - if (inputString.equals(contact.getAlias())) - break; + if (broadcast) { + Singleton.getBitmessageContext(getContext()).broadcast(identity, + subjectInput.getText().toString(), + bodyInput.getText().toString()); + } else { + String inputString = recipientInput.getText().toString(); + if (recipient == null || !recipient.toString().equals(inputString)) { + try { + recipient = new BitmessageAddress(inputString); + } catch (Exception e) { + List contacts = Singleton.getAddressRepository + (getContext()).getContacts(); + for (BitmessageAddress contact : contacts) { + if (inputString.equalsIgnoreCase(contact.getAlias())) { + recipient = contact; + if (inputString.equals(contact.getAlias())) + break; + } } } } + Singleton.getBitmessageContext(getContext()).send(identity, recipient, + subjectInput.getText().toString(), + bodyInput.getText().toString()); } - Singleton.getBitmessageContext(getContext()).send(identity, recipient, - subjectInput.getText().toString(), - bodyInput.getText().toString()); getActivity().finish(); return true; default: diff --git a/app/src/main/java/ch/dissem/apps/abit/MainActivity.java b/app/src/main/java/ch/dissem/apps/abit/MainActivity.java index 7e418c2..d90194b 100644 --- a/app/src/main/java/ch/dissem/apps/abit/MainActivity.java +++ b/app/src/main/java/ch/dissem/apps/abit/MainActivity.java @@ -16,7 +16,6 @@ package ch.dissem.apps.abit; -import android.app.AlertDialog; import android.content.Intent; import android.graphics.Point; import android.os.Bundle; @@ -26,6 +25,7 @@ import android.support.v7.widget.Toolbar; import android.view.View; import android.view.ViewGroup; import android.widget.RelativeLayout; +import android.widget.Toast; import com.github.amlcurran.showcaseview.ShowcaseView; import com.mikepenz.community_material_typeface_library.CommunityMaterial; @@ -66,6 +66,7 @@ import ch.dissem.bitmessage.entity.BitmessageAddress; import ch.dissem.bitmessage.entity.Plaintext; import ch.dissem.bitmessage.entity.valueobject.Label; +import static android.widget.Toast.LENGTH_LONG; import static ch.dissem.apps.abit.ComposeMessageActivity.launchReplyTo; import static ch.dissem.apps.abit.service.BitmessageService.isRunning; @@ -223,13 +224,7 @@ public class MainActivity extends AppCompatActivity } if (profiles.isEmpty()) { // Create an initial identity - BitmessageAddress identity = Singleton.getIdentity(this); - profiles.add(new ProfileDrawerItem() - .withIcon(new Identicon(identity)) - .withName(identity.toString()) - .withEmail(identity.getAddress()) - .withTag(identity) - ); + Singleton.getIdentity(this); } profiles.add(new ProfileSettingDrawerItem() .withName(getString(R.string.add_identity)) @@ -256,11 +251,15 @@ public class MainActivity extends AppCompatActivity addIdentityDialog(); break; case MANAGE_IDENTITY: - Intent show = new Intent(MainActivity.this, - AddressDetailActivity.class); - show.putExtra(AddressDetailFragment.ARG_ITEM, - Singleton.getIdentity(getApplicationContext())); - startActivity(show); + BitmessageAddress identity = Singleton.getIdentity(this); + if (identity == null) { + Toast.makeText(this, R.string.no_identity_warning, LENGTH_LONG).show(); + } else { + Intent show = new Intent(MainActivity.this, + AddressDetailActivity.class); + show.putExtra(AddressDetailFragment.ARG_ITEM, identity); + startActivity(show); + } break; default: if (profile instanceof ProfileDrawerItem) { 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 0d22d98..fbd2f00 100644 --- a/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java +++ b/app/src/main/java/ch/dissem/apps/abit/MessageListFragment.java @@ -18,7 +18,6 @@ package ch.dissem.apps.abit; import android.content.Intent; import android.os.Bundle; -import android.support.design.widget.FloatingActionButton; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.support.v7.widget.LinearLayoutManager; @@ -29,6 +28,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.Toast; import com.h6ah4i.android.widget.advrecyclerview.animator.GeneralItemAnimator; import com.h6ah4i.android.widget.advrecyclerview.animator.SwipeDismissItemAnimator; @@ -43,10 +43,15 @@ import ch.dissem.apps.abit.adapter.SwipeableMessageAdapter; import ch.dissem.apps.abit.listener.ActionBarListener; import ch.dissem.apps.abit.listener.ListSelectionListener; import ch.dissem.apps.abit.service.Singleton; +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; +import io.github.yavski.fabspeeddial.FabSpeedDial; +import io.github.yavski.fabspeeddial.SimpleMenuListenerAdapter; +import static ch.dissem.apps.abit.ComposeMessageActivity.EXTRA_BROADCAST; +import static ch.dissem.apps.abit.ComposeMessageActivity.EXTRA_IDENTITY; import static ch.dissem.apps.abit.MessageDetailFragment.isInTrash; /** @@ -128,14 +133,36 @@ public class MessageListFragment extends Fragment implements ListHolder { layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false); // Show the dummy content as text in a TextView. - FloatingActionButton fab = (FloatingActionButton) rootView.findViewById(R.id + FabSpeedDial fab = (FabSpeedDial) rootView.findViewById(R.id .fab_compose_message); - fab.setOnClickListener(view -> { - Intent intent = new Intent(getActivity().getApplicationContext(), - ComposeMessageActivity.class); - intent.putExtra(ComposeMessageActivity.EXTRA_IDENTITY, Singleton.getIdentity - (getActivity())); - startActivity(intent); + fab.setMenuListener(new SimpleMenuListenerAdapter() { + @Override + public boolean onMenuItemSelected(MenuItem menuItem) { + BitmessageAddress identity = Singleton.getIdentity(getActivity()); + if (identity == null) { + Toast.makeText(getActivity(), R.string.no_identity_warning, + Toast.LENGTH_LONG).show(); + return false; + } else { + switch (menuItem.getItemId()) { + case R.id.action_compose_message: { + Intent intent = new Intent(getActivity(), ComposeMessageActivity.class); + intent.putExtra(EXTRA_IDENTITY, identity); + startActivity(intent); + return true; + } + case R.id.action_compose_broadcast: { + Intent intent = new Intent(getActivity(), ComposeMessageActivity.class); + intent.putExtra(EXTRA_IDENTITY, identity); + intent.putExtra(EXTRA_BROADCAST, true); + startActivity(intent); + return true; + } + default: + return false; + } + } + } }); // touch guard manager (this class is required to suppress scrolling while swipe-dismiss diff --git a/app/src/main/java/ch/dissem/apps/abit/repository/AndroidMessageRepository.java b/app/src/main/java/ch/dissem/apps/abit/repository/AndroidMessageRepository.java index 8c6aad8..03420bd 100644 --- a/app/src/main/java/ch/dissem/apps/abit/repository/AndroidMessageRepository.java +++ b/app/src/main/java/ch/dissem/apps/abit/repository/AndroidMessageRepository.java @@ -244,16 +244,19 @@ public class AndroidMessageRepository extends AbstractMessageRepository { db.beginTransaction(); // save from address if necessary + BitmessageAddress savedAddress = ctx.getAddressRepository().getAddress(message + .getFrom().getAddress()); if (message.getId() == null) { - BitmessageAddress savedAddress = ctx.getAddressRepository().getAddress(message - .getFrom().getAddress()); - if (savedAddress == null || savedAddress.getPrivateKey() == null) { - if (savedAddress != null && savedAddress.getAlias() != null) { - message.getFrom().setAlias(savedAddress.getAlias()); - } + if (savedAddress == null) { ctx.getAddressRepository().save(message.getFrom()); + } else if (savedAddress.getPubkey() == null) { + savedAddress.setPubkey(message.getFrom().getPubkey()); + ctx.getAddressRepository().save(savedAddress); } } + if (savedAddress != null) { + message.getFrom().setAlias(savedAddress.getAlias()); + } // save message if (message.getId() == null) { diff --git a/app/src/main/java/ch/dissem/apps/abit/service/BitmessageIntentService.java b/app/src/main/java/ch/dissem/apps/abit/service/BitmessageIntentService.java index ecce911..84a5ed8 100644 --- a/app/src/main/java/ch/dissem/apps/abit/service/BitmessageIntentService.java +++ b/app/src/main/java/ch/dissem/apps/abit/service/BitmessageIntentService.java @@ -53,6 +53,7 @@ public class BitmessageIntentService extends IntentService { Plaintext item = (Plaintext) intent.getSerializableExtra(EXTRA_DELETE_MESSAGE); bmc.labeler().delete(item); bmc.messages().save(item); + Singleton.getMessageListener(this).resetNotification(); } if (intent.hasExtra(EXTRA_STARTUP_NODE)) { if (Preferences.isConnectionAllowed(this)) { 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 a92521d..db3360b 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 @@ -17,9 +17,12 @@ package ch.dissem.apps.abit.service; import android.content.Context; +import android.os.AsyncTask; +import android.widget.Toast; import java.util.List; +import ch.dissem.apps.abit.MainActivity; import ch.dissem.apps.abit.R; import ch.dissem.apps.abit.adapter.AndroidCryptography; import ch.dissem.apps.abit.adapter.SwitchingProofOfWorkEngine; @@ -34,6 +37,7 @@ import ch.dissem.apps.abit.repository.SqlHelper; import ch.dissem.apps.abit.util.Constants; import ch.dissem.bitmessage.BitmessageContext; import ch.dissem.bitmessage.entity.BitmessageAddress; +import ch.dissem.bitmessage.entity.payload.Pubkey; import ch.dissem.bitmessage.networking.nio.NioNetworkHandler; import ch.dissem.bitmessage.ports.AddressRepository; import ch.dissem.bitmessage.ports.MessageRepository; @@ -50,6 +54,7 @@ public class Singleton { private static MessageListener messageListener; private static BitmessageAddress identity; private static AndroidProofOfWorkRepository powRepo; + private static boolean creatingIdentity; public static BitmessageContext getBitmessageContext(Context context) { if (bitmessageContext == null) { @@ -110,15 +115,39 @@ public class Singleton { BitmessageContext bmc = getBitmessageContext(ctx); synchronized (Singleton.class) { if (identity == null) { - // FIXME: this may block the UI, there must be a better way! List identities = bmc.addresses() .getIdentities(); if (identities.size() > 0) { identity = identities.get(0); } else { - identity = bmc.createIdentity(false); - identity.setAlias(ctx.getString(R.string.alias_default_identity)); - bmc.addresses().save(identity); + if (!creatingIdentity) { + creatingIdentity = true; + new AsyncTask() { + @Override + protected BitmessageAddress doInBackground(Void... args) { + BitmessageAddress identity = bmc.createIdentity(false, + Pubkey.Feature.DOES_ACK); + identity.setAlias( + ctx.getString(R.string.alias_default_identity) + ); + bmc.addresses().save(identity); + return identity; + } + + @Override + protected void onPostExecute(BitmessageAddress identity) { + Singleton.identity = identity; + Toast.makeText(ctx, + R.string.toast_identity_created, + Toast.LENGTH_SHORT).show(); + MainActivity mainActivity = MainActivity.getInstance(); + if (mainActivity != null) { + mainActivity.addIdentityEntry(identity); + } + } + }.execute(); + } + return null; } } } diff --git a/app/src/main/res/drawable/ic_action_broadcast.xml b/app/src/main/res/drawable/ic_action_broadcast.xml new file mode 100644 index 0000000..2fc1345 --- /dev/null +++ b/app/src/main/res/drawable/ic_action_broadcast.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_action_personal.xml b/app/src/main/res/drawable/ic_action_personal.xml new file mode 100644 index 0000000..74c7332 --- /dev/null +++ b/app/src/main/res/drawable/ic_action_personal.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_action_qr_code.xml b/app/src/main/res/drawable/ic_action_qr_code.xml index ee40a97..6a0ad45 100644 --- a/app/src/main/res/drawable/ic_action_qr_code.xml +++ b/app/src/main/res/drawable/ic_action_qr_code.xml @@ -3,5 +3,5 @@ android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"> - - \ No newline at end of file + + diff --git a/app/src/main/res/layout/fragment_address_list.xml b/app/src/main/res/layout/fragment_address_list.xml index 018bf6f..ad4b671 100644 --- a/app/src/main/res/layout/fragment_address_list.xml +++ b/app/src/main/res/layout/fragment_address_list.xml @@ -8,12 +8,10 @@ android:id="@id/android:list" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:choiceMode="singleChoice" - android:layout_alignParentBottom="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" - + android:choiceMode="singleChoice" android:clipToPadding="false" android:paddingBottom="88dp" android:scrollbarStyle="outsideOverlay"/> @@ -26,8 +24,8 @@ android:layout_alignParentEnd="true" android:layout_gravity="bottom|end" android:layout_margin="16dp" - android:src="@drawable/ic_action_add_contact" app:elevation="8dp" + app:fabDrawable="@drawable/ic_action_add_contact" app:fabGravity="bottom_end" app:fabMenu="@menu/fab_address"/> diff --git a/app/src/main/res/layout/fragment_message_list.xml b/app/src/main/res/layout/fragment_message_list.xml index 0fe153d..2cbf5e8 100644 --- a/app/src/main/res/layout/fragment_message_list.xml +++ b/app/src/main/res/layout/fragment_message_list.xml @@ -19,13 +19,16 @@ android:scrollbars="vertical" tools:listitem="@layout/message_row"/> - + app:elevation="8dp" + app:fabDrawable="@drawable/ic_action_compose_message" + app:fabGravity="bottom_end" + app:fabMenu="@menu/fab_message"/> diff --git a/app/src/main/res/menu/fab_message.xml b/app/src/main/res/menu/fab_message.xml new file mode 100644 index 0000000..839de8d --- /dev/null +++ b/app/src/main/res/menu/fab_message.xml @@ -0,0 +1,27 @@ + + + + + + + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a72fb64..3a5b347 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -99,4 +99,6 @@ Als Alternative kann in den Einstellungen ein vertrauenswürdiger Knoten konfigu Knoten starten Knoten beenden Knoten starten + Nachricht + Bitte versuchs nochmals wenn eine Identität verfügbar ist. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4fb16d4..68f92a0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -98,4 +98,6 @@ As an alternative you could configure a trusted node in the settings, but as of shutdown node restart node Startup node + Message + Please try again once an identity is available. diff --git a/build.gradle b/build.gradle index ec2dca6..554b46e 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.1' + classpath 'com.android.tools.build:gradle:2.2.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files