From b34e678c685c5cb1a503f5ac1f9859cb612a23a9 Mon Sep 17 00:00:00 2001 From: Christian Basler Date: Thu, 3 Nov 2016 23:04:41 +0100 Subject: [PATCH] Disabled Jack I'd love to use Java 8 features, but Jack just isn't ready yet. --- app/build.gradle | 6 +- .../apps/abit/AbstractItemListFragment.java | 9 +- .../apps/abit/AddressDetailFragment.java | 52 +++--- .../dissem/apps/abit/AddressListFragment.java | 42 ++--- .../apps/abit/ComposeMessageFragment.java | 7 +- .../apps/abit/CreateAddressActivity.java | 43 +++-- .../apps/abit/ImportIdentitiesFragment.java | 17 +- .../ch/dissem/apps/abit/InputWifFragment.java | 55 +++--- .../ch/dissem/apps/abit/MainActivity.java | 156 ++++++++++-------- .../apps/abit/MessageDetailFragment.java | 8 +- .../ch/dissem/apps/abit/SettingsFragment.java | 30 ++-- .../abit/adapter/AddressSelectorAdapter.java | 10 +- .../abit/adapter/SwipeableMessageAdapter.java | 14 +- .../dialog/AddIdentityDialogFragment.java | 136 ++++++++------- .../DeterministicIdentityDialogFragment.java | 122 +++++++------- .../abit/dialog/FullNodeDialogActivity.java | 19 ++- .../apps/abit/listener/MessageListener.java | 46 +++--- .../dissem/apps/abit/pow/ServerPowEngine.java | 52 +++--- .../apps/abit/service/ProofOfWorkService.java | 35 ++-- .../dissem/apps/abit/service/Singleton.java | 4 +- 20 files changed, 499 insertions(+), 364 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7571cbe..cf33c47 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,11 +20,11 @@ android { targetSdkVersion 25 versionCode 9 versionName "1.0-beta9" - jackOptions.enabled = true + jackOptions.enabled = false } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 } buildTypes { release { 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 df96b43..b61de46 100644 --- a/app/src/main/java/ch/dissem/apps/abit/AbstractItemListFragment.java +++ b/app/src/main/java/ch/dissem/apps/abit/AbstractItemListFragment.java @@ -37,8 +37,13 @@ public abstract class AbstractItemListFragment extends ListFragment implement * A dummy implementation of the {@link ListSelectionListener} interface that does * nothing. Used only when this fragment is not attached to an activity. */ - private static final ListSelectionListener dummyCallbacks = plaintext -> { - }; + private static final ListSelectionListener dummyCallbacks = + new ListSelectionListener() { + @Override + public void onItemSelected(Object item) { + // NO OP + } + }; /** * The fragment's current callback object, which is notified of list item * clicks. 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 5af7c3d..40b2410 100644 --- a/app/src/main/java/ch/dissem/apps/abit/AddressDetailFragment.java +++ b/app/src/main/java/ch/dissem/apps/abit/AddressDetailFragment.java @@ -18,6 +18,7 @@ package ch.dissem.apps.abit; import android.app.Activity; import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; @@ -31,6 +32,7 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.Switch; import android.widget.TextView; @@ -137,14 +139,17 @@ public class AddressDetailFragment extends Fragment { warning = R.string.delete_contact_warning; new AlertDialog.Builder(ctx) .setMessage(warning) - .setPositiveButton(android.R.string.yes, (dialog, which) -> { - Singleton.getAddressRepository(ctx).remove(item); - MainActivity mainActivity = MainActivity.getInstance(); - if (item.getPrivateKey() != null && mainActivity != null) { - mainActivity.removeIdentityEntry(item); + .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Singleton.getAddressRepository(ctx).remove(item); + MainActivity mainActivity = MainActivity.getInstance(); + if (item.getPrivateKey() != null && mainActivity != null) { + mainActivity.removeIdentityEntry(item); + } + item = null; + ctx.onBackPressed(); } - item = null; - ctx.onBackPressed(); }) .setNegativeButton(android.R.string.no, null) .show(); @@ -153,17 +158,20 @@ public class AddressDetailFragment extends Fragment { case R.id.export: { new AlertDialog.Builder(ctx) .setMessage(R.string.confirm_export) - .setPositiveButton(android.R.string.yes, (dialog, which) -> { - Intent shareIntent = new Intent(Intent.ACTION_SEND); - shareIntent.setType("text/plain"); - shareIntent.putExtra(Intent.EXTRA_TITLE, item + - EXPORT_POSTFIX); - WifExporter exporter = new WifExporter(Singleton - .getBitmessageContext(ctx)); - exporter.addIdentity(item); - shareIntent.putExtra(Intent.EXTRA_TEXT, exporter.toString - ()); - startActivity(Intent.createChooser(shareIntent, null)); + .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + Intent shareIntent = new Intent(Intent.ACTION_SEND); + shareIntent.setType("text/plain"); + shareIntent.putExtra(Intent.EXTRA_TITLE, item + + EXPORT_POSTFIX); + WifExporter exporter = new WifExporter(Singleton + .getBitmessageContext(ctx)); + exporter.addIdentity(item); + shareIntent.putExtra(Intent.EXTRA_TEXT, exporter.toString + ()); + startActivity(Intent.createChooser(shareIntent, null)); + } }) .setNegativeButton(android.R.string.no, null) .show(); @@ -225,8 +233,12 @@ public class AddressDetailFragment extends Fragment { if (item.getPrivateKey() == null) { Switch active = (Switch) rootView.findViewById(R.id.active); active.setChecked(item.isSubscribed()); - active.setOnCheckedChangeListener((buttonView, isChecked) -> - item.setSubscribed(isChecked)); + active.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton button, boolean checked) { + item.setSubscribed(checked); + } + }); ImageView pubkeyAvailableImg = (ImageView) rootView.findViewById(R.id .pubkey_available); diff --git a/app/src/main/java/ch/dissem/apps/abit/AddressListFragment.java b/app/src/main/java/ch/dissem/apps/abit/AddressListFragment.java index df6785c..93e1f2e 100644 --- a/app/src/main/java/ch/dissem/apps/abit/AddressListFragment.java +++ b/app/src/main/java/ch/dissem/apps/abit/AddressListFragment.java @@ -33,6 +33,7 @@ import android.widget.TextView; import com.google.zxing.integration.android.IntentIntegrator; import java.util.Collections; +import java.util.Comparator; import java.util.List; import ch.dissem.apps.abit.listener.ActionBarListener; @@ -56,28 +57,31 @@ public class AddressListFragment extends AbstractItemListFragment addresses = Singleton.getAddressRepository(getContext()) .getContacts(); - Collections.sort(addresses, (lhs, rhs) -> { - // Yields the following order: - // * Subscribed addresses come first - // * Addresses with Aliases (alphabetically) - // * Addresses (alphabetically) - if (lhs.isSubscribed() == rhs.isSubscribed()) { - if (lhs.getAlias() != null) { - if (rhs.getAlias() != null) { - return lhs.getAlias().compareTo(rhs.getAlias()); + Collections.sort(addresses, new Comparator() { + @Override + public int compare(BitmessageAddress lhs, BitmessageAddress rhs) { + // Yields the following order: + // * Subscribed addresses come first + // * Addresses with Aliases (alphabetically) + // * Addresses (alphabetically) + if (lhs.isSubscribed() == rhs.isSubscribed()) { + if (lhs.getAlias() != null) { + if (rhs.getAlias() != null) { + return lhs.getAlias().compareTo(rhs.getAlias()); + } else { + return -1; + } + } else if (rhs.getAlias() != null) { + return 1; } else { - return -1; + return lhs.getAddress().compareTo(rhs.getAddress()); } - } else if (rhs.getAlias() != null) { - return 1; - } else { - return lhs.getAddress().compareTo(rhs.getAddress()); } - } - if (lhs.isSubscribed()) { - return -1; - } else { - return 1; + if (lhs.isSubscribed()) { + return -1; + } else { + return 1; + } } }); setListAdapter(new ArrayAdapter( 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 0308ced..a73a566 100644 --- a/app/src/main/java/ch/dissem/apps/abit/ComposeMessageFragment.java +++ b/app/src/main/java/ch/dissem/apps/abit/ComposeMessageFragment.java @@ -96,7 +96,12 @@ public class ComposeMessageFragment extends Fragment { final ContactAdapter adapter = new ContactAdapter(getContext()); recipientInput.setAdapter(adapter); recipientInput.setOnItemClickListener( - (parent, view, position, id) -> recipient = adapter.getItem(position) + new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int pos, long id) { + adapter.getItem(pos); + } + } ); recipientInput.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override diff --git a/app/src/main/java/ch/dissem/apps/abit/CreateAddressActivity.java b/app/src/main/java/ch/dissem/apps/abit/CreateAddressActivity.java index eff13da..cf5d51f 100644 --- a/app/src/main/java/ch/dissem/apps/abit/CreateAddressActivity.java +++ b/app/src/main/java/ch/dissem/apps/abit/CreateAddressActivity.java @@ -20,6 +20,7 @@ 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; @@ -60,28 +61,34 @@ public class CreateAddressActivity extends AppCompatActivity { } final Button cancel = (Button) findViewById(R.id.cancel); - cancel.setOnClickListener(v -> { - setResult(Activity.RESULT_CANCELED); - finish(); + cancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + setResult(Activity.RESULT_CANCELED); + finish(); + } }); final Button ok = (Button) findViewById(R.id.do_import); - ok.setOnClickListener(v -> { - String addressText = String.valueOf(address.getText()).trim(); - try { - BitmessageAddress bmAddress = new BitmessageAddress(addressText); - bmAddress.setAlias(label.getText().toString()); + ok.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + String addressText = String.valueOf(address.getText()).trim(); + try { + BitmessageAddress bmAddress = new BitmessageAddress(addressText); + bmAddress.setAlias(label.getText().toString()); - BitmessageContext bmc = Singleton.getBitmessageContext - (CreateAddressActivity.this); - bmc.addContact(bmAddress); - if (subscribe.isChecked()) { - bmc.addSubscribtion(bmAddress); + BitmessageContext bmc = Singleton.getBitmessageContext + (CreateAddressActivity.this); + bmc.addContact(bmAddress); + if (subscribe.isChecked()) { + bmc.addSubscribtion(bmAddress); + } + + setResult(Activity.RESULT_OK); + finish(); + } catch (RuntimeException e) { + address.setError(getString(R.string.error_illegal_address)); } - - setResult(Activity.RESULT_OK); - finish(); - } catch (RuntimeException e) { - address.setError(getString(R.string.error_illegal_address)); } }); } diff --git a/app/src/main/java/ch/dissem/apps/abit/ImportIdentitiesFragment.java b/app/src/main/java/ch/dissem/apps/abit/ImportIdentitiesFragment.java index 4d335b0..be9d954 100644 --- a/app/src/main/java/ch/dissem/apps/abit/ImportIdentitiesFragment.java +++ b/app/src/main/java/ch/dissem/apps/abit/ImportIdentitiesFragment.java @@ -67,15 +67,18 @@ public class ImportIdentitiesFragment extends Fragment { } catch (IOException e) { return super.onCreateView(inflater, container, savedInstanceState); } - view.findViewById(R.id.finish).setOnClickListener(v -> { - importer.importAll(adapter.getSelected()); - MainActivity mainActivity = MainActivity.getInstance(); - if (mainActivity != null) { - for (BitmessageAddress selected : adapter.getSelected()) { - mainActivity.addIdentityEntry(selected); + view.findViewById(R.id.finish).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + importer.importAll(adapter.getSelected()); + MainActivity mainActivity = MainActivity.getInstance(); + if (mainActivity != null) { + for (BitmessageAddress selected : adapter.getSelected()) { + mainActivity.addIdentityEntry(selected); + } } + getActivity().finish(); } - getActivity().finish(); }); return view; } diff --git a/app/src/main/java/ch/dissem/apps/abit/InputWifFragment.java b/app/src/main/java/ch/dissem/apps/abit/InputWifFragment.java index d1498ed..2e6f227 100644 --- a/app/src/main/java/ch/dissem/apps/abit/InputWifFragment.java +++ b/app/src/main/java/ch/dissem/apps/abit/InputWifFragment.java @@ -28,6 +28,7 @@ import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; +import com.github.angads25.filepicker.controller.DialogSelectionListener; import com.github.angads25.filepicker.model.DialogConfigs; import com.github.angads25.filepicker.model.DialogProperties; import com.github.angads25.filepicker.view.FilePickerDialog; @@ -60,16 +61,19 @@ public class InputWifFragment extends Fragment { View view = inflater.inflate(R.layout.fragment_import_input, container, false); wifData = (TextView) view.findViewById(R.id.wif_input); - view.findViewById(R.id.next).setOnClickListener(v -> { - Bundle bundle = new Bundle(); - bundle.putString(WIF_DATA, wifData.getText().toString()); + view.findViewById(R.id.next).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Bundle bundle = new Bundle(); + bundle.putString(WIF_DATA, wifData.getText().toString()); - ImportIdentitiesFragment fragment = new ImportIdentitiesFragment(); - fragment.setArguments(bundle); + ImportIdentitiesFragment fragment = new ImportIdentitiesFragment(); + fragment.setArguments(bundle); - getFragmentManager().beginTransaction() - .replace(R.id.content, fragment) - .commit(); + getFragmentManager().beginTransaction() + .replace(R.id.content, fragment) + .commit(); + } }); return view; } @@ -89,23 +93,26 @@ public class InputWifFragment extends Fragment { properties.extensions = null; FilePickerDialog dialog = new FilePickerDialog(getActivity(), properties); dialog.setTitle(getString(R.string.select_file_title)); - dialog.setDialogSelectionListener(files -> { - if (files.length > 0) { - try (InputStream in = new FileInputStream(files[0])) { - ByteArrayOutputStream data = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int length; - //noinspection ConstantConditions - while ((length = in.read(buffer)) != -1) { - data.write(buffer, 0, length); + dialog.setDialogSelectionListener(new DialogSelectionListener() { + @Override + public void onSelectedFilePaths(String[] files) { + if (files.length > 0) { + try (InputStream in = new FileInputStream(files[0])) { + ByteArrayOutputStream data = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int length; + //noinspection ConstantConditions + while ((length = in.read(buffer)) != -1) { + data.write(buffer, 0, length); + } + wifData.setText(data.toString("UTF-8")); + } catch (IOException e) { + Toast.makeText( + getActivity(), + R.string.error_loading_data, + Toast.LENGTH_SHORT + ).show(); } - wifData.setText(data.toString("UTF-8")); - } catch (IOException e) { - Toast.makeText( - getActivity(), - R.string.error_loading_data, - Toast.LENGTH_SHORT - ).show(); } } }); 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 af705e0..812f6cf 100644 --- a/app/src/main/java/ch/dissem/apps/abit/MainActivity.java +++ b/app/src/main/java/ch/dissem/apps/abit/MainActivity.java @@ -24,10 +24,12 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.ViewGroup; +import android.widget.CompoundButton; import android.widget.RelativeLayout; import android.widget.Toast; import com.github.amlcurran.showcaseview.ShowcaseView; +import com.github.amlcurran.showcaseview.targets.Target; import com.mikepenz.community_material_typeface_library.CommunityMaterial; import com.mikepenz.google_material_typeface_library.GoogleMaterial; import com.mikepenz.iconics.IconicsDrawable; @@ -35,6 +37,7 @@ import com.mikepenz.materialdrawer.AccountHeader; import com.mikepenz.materialdrawer.AccountHeaderBuilder; import com.mikepenz.materialdrawer.Drawer; import com.mikepenz.materialdrawer.DrawerBuilder; +import com.mikepenz.materialdrawer.interfaces.OnCheckedChangeListener; import com.mikepenz.materialdrawer.model.DividerDrawerItem; import com.mikepenz.materialdrawer.model.PrimaryDrawerItem; import com.mikepenz.materialdrawer.model.ProfileDrawerItem; @@ -182,13 +185,16 @@ public class MainActivity extends AppCompatActivity .setStyle(R.style.CustomShowcaseTheme) .setContentTitle(R.string.full_node) .setContentText(R.string.full_node_description) - .setTarget(() -> { - View view = drawer.getStickyFooter(); - int[] location = new int[2]; - view.getLocationInWindow(location); - int x = location[0] + 7 * view.getWidth() / 8; - int y = location[1] + view.getHeight() / 2; - return new Point(x, y); + .setTarget(new Target() { + @Override + public Point getPoint() { + View view = drawer.getStickyFooter(); + int[] location = new int[2]; + view.getLocationInWindow(location); + int x = location[0] + 7 * view.getWidth() / 8; + int y = location[1] + view.getHeight() / 2; + return new Point(x, y); + } }) .replaceEndButton(R.layout.showcase_button) .hideOnTouchOutside() @@ -246,32 +252,36 @@ public class MainActivity extends AppCompatActivity .withActivity(this) .withHeaderBackground(R.drawable.header) .withProfiles(profiles) - .withOnAccountHeaderListener((view, profile, currentProfile) -> { - switch ((int) profile.getIdentifier()) { - case ADD_IDENTITY: - addIdentityDialog(); - break; - case MANAGE_IDENTITY: - 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) { - Object tag = ((ProfileDrawerItem) profile).getTag(); - if (tag instanceof BitmessageAddress) { - Singleton.setIdentity((BitmessageAddress) tag); + .withOnAccountHeaderListener(new AccountHeader.OnAccountHeaderListener() { + @Override + public boolean onProfileChanged(View view, IProfile profile, boolean current) { + switch ((int) profile.getIdentifier()) { + case ADD_IDENTITY: + addIdentityDialog(); + break; + case MANAGE_IDENTITY: + BitmessageAddress identity = Singleton.getIdentity(MainActivity.this); + if (identity == null) { + Toast.makeText(MainActivity.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) { + Object tag = ((ProfileDrawerItem) profile).getTag(); + if (tag instanceof BitmessageAddress) { + Singleton.setIdentity((BitmessageAddress) tag); + } + } + } + // false if it should close the drawer + return false; } - // false if it should close the drawer - return false; }) .build(); if (profiles.size() > 2) { // There's always the add and manage identity items @@ -333,11 +343,15 @@ public class MainActivity extends AppCompatActivity .withName(R.string.full_node) .withIcon(CommunityMaterial.Icon.cmd_cloud_outline) .withChecked(isRunning()) - .withOnCheckedChangeListener((drawerItem, buttonView, isChecked) -> { - if (isChecked) { - checkAndStartNode(); - } else { - stopService(new Intent(this, BitmessageService.class)); + .withOnCheckedChangeListener(new OnCheckedChangeListener() { + @Override + public void onCheckedChanged(IDrawerItem drawerItem, CompoundButton buttonView, + boolean isChecked) { + if (isChecked) { + checkAndStartNode(); + } else { + stopService(new Intent(MainActivity.this, BitmessageService.class)); + } } }); @@ -347,36 +361,39 @@ public class MainActivity extends AppCompatActivity .withAccountHeader(accountHeader) .withDrawerItems(drawerItems) .addStickyDrawerItems(nodeSwitch) - .withOnDrawerItemClickListener((view, position, item) -> { - if (item.getTag() instanceof Label) { - selectedLabel = (Label) item.getTag(); - showSelectedLabel(); - return false; - } else if (item instanceof Nameable) { - Nameable ni = (Nameable) item; - switch (ni.getName().getTextRes()) { - case R.string.contacts_and_subscriptions: - if (!(getSupportFragmentManager().findFragmentById(R.id - .item_list) instanceof AddressListFragment)) { - changeList(new AddressListFragment()); - } else { - ((AddressListFragment) getSupportFragmentManager() - .findFragmentById(R.id.item_list)).updateList(); - } - break; - case R.string.settings: - startActivity(new Intent(MainActivity.this, SettingsActivity - .class)); - break; - case R.string.archive: - selectedLabel = null; - showSelectedLabel(); - break; - case R.string.full_node: - return true; + .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() { + @Override + public boolean onItemClick(View view, int position, IDrawerItem item) { + if (item.getTag() instanceof Label) { + selectedLabel = (Label) item.getTag(); + showSelectedLabel(); + return false; + } else if (item instanceof Nameable) { + Nameable ni = (Nameable) item; + switch (ni.getName().getTextRes()) { + case R.string.contacts_and_subscriptions: + if (!(getSupportFragmentManager().findFragmentById(R.id + .item_list) instanceof AddressListFragment)) { + changeList(new AddressListFragment()); + } else { + ((AddressListFragment) getSupportFragmentManager() + .findFragmentById(R.id.item_list)).updateList(); + } + break; + case R.string.settings: + startActivity(new Intent(MainActivity.this, SettingsActivity + .class)); + break; + case R.string.archive: + selectedLabel = null; + showSelectedLabel(); + break; + case R.string.full_node: + return true; + } } + return false; } - return false; }) .withShowDrawerOnFirstLaunch(true) .build(); @@ -461,11 +478,14 @@ public class MainActivity extends AppCompatActivity } public static void updateNodeSwitch() { - MainActivity i = getInstance(); + final MainActivity i = getInstance(); if (i != null) { - i.runOnUiThread(() -> { - i.nodeSwitch.withChecked(i.bmc.isRunning()); - i.drawer.updateStickyFooterItem(i.nodeSwitch); + i.runOnUiThread(new Runnable() { + @Override + public void run() { + i.nodeSwitch.withChecked(i.bmc.isRunning()); + i.drawer.updateStickyFooterItem(i.nodeSwitch); + } }); } } 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 25239f6..5dced97 100644 --- a/app/src/main/java/ch/dissem/apps/abit/MessageDetailFragment.java +++ b/app/src/main/java/ch/dissem/apps/abit/MessageDetailFragment.java @@ -31,6 +31,7 @@ import android.widget.TextView; import com.mikepenz.google_material_typeface_library.GoogleMaterial; import java.util.Iterator; +import java.util.regex.Matcher; import ch.dissem.apps.abit.listener.ActionBarListener; import ch.dissem.apps.abit.service.Singleton; @@ -110,7 +111,12 @@ public class MessageDetailFragment extends Fragment { Linkify.addLinks(messageBody, WEB_URLS); Linkify.addLinks(messageBody, BITMESSAGE_ADDRESS_PATTERN, BITMESSAGE_URL_SCHEMA, null, - (match, url) -> match.group() + new Linkify.TransformFilter() { + @Override + public String transformUrl(Matcher match, String url) { + return match.group(); + } + } ); messageBody.setLinksClickable(true); diff --git a/app/src/main/java/ch/dissem/apps/abit/SettingsFragment.java b/app/src/main/java/ch/dissem/apps/abit/SettingsFragment.java index c905f65..223e8de 100644 --- a/app/src/main/java/ch/dissem/apps/abit/SettingsFragment.java +++ b/app/src/main/java/ch/dissem/apps/abit/SettingsFragment.java @@ -46,21 +46,27 @@ public class SettingsFragment addPreferencesFromResource(R.xml.preferences); Preference about = findPreference("about"); - about.setOnPreferenceClickListener(preference -> { - new LibsBuilder() - .withActivityTitle(getActivity().getString(R.string.about)) - .withActivityStyle(Libs.ActivityStyle.LIGHT_DARK_TOOLBAR) - .withAboutIconShown(true) - .withAboutVersionShown(true) - .withAboutDescription(getString(R.string.about_app)) - .start(getActivity()); - return true; + about.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + new LibsBuilder() + .withActivityTitle(getActivity().getString(R.string.about)) + .withActivityStyle(Libs.ActivityStyle.LIGHT_DARK_TOOLBAR) + .withAboutIconShown(true) + .withAboutVersionShown(true) + .withAboutDescription(getString(R.string.about_app)) + .start(getActivity()); + return true; + } }); Preference status = findPreference("status"); - status.setOnPreferenceClickListener(preference -> { - startActivity(new Intent(getActivity(), StatusActivity.class)); - return true; + status.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + startActivity(new Intent(getActivity(), StatusActivity.class)); + return true; + } }); } diff --git a/app/src/main/java/ch/dissem/apps/abit/adapter/AddressSelectorAdapter.java b/app/src/main/java/ch/dissem/apps/abit/adapter/AddressSelectorAdapter.java index f35a52a..ffc7a4e 100644 --- a/app/src/main/java/ch/dissem/apps/abit/adapter/AddressSelectorAdapter.java +++ b/app/src/main/java/ch/dissem/apps/abit/adapter/AddressSelectorAdapter.java @@ -21,6 +21,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; +import android.widget.CompoundButton; import android.widget.TextView; import java.util.ArrayList; @@ -75,9 +76,12 @@ public class AddressSelectorAdapter super(v); checkbox = (CheckBox) v.findViewById(R.id.checkbox); address = (TextView) v.findViewById(R.id.address); - checkbox.setOnCheckedChangeListener((buttonView, isChecked) -> { - if (data != null) { - data.selected = isChecked; + checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { + if (data != null) { + data.selected = isChecked; + } } }); } diff --git a/app/src/main/java/ch/dissem/apps/abit/adapter/SwipeableMessageAdapter.java b/app/src/main/java/ch/dissem/apps/abit/adapter/SwipeableMessageAdapter.java index 6beb402..f50a3f6 100644 --- a/app/src/main/java/ch/dissem/apps/abit/adapter/SwipeableMessageAdapter.java +++ b/app/src/main/java/ch/dissem/apps/abit/adapter/SwipeableMessageAdapter.java @@ -105,8 +105,18 @@ public class SwipeableMessageAdapter } public SwipeableMessageAdapter() { - itemViewOnClickListener = this::onItemViewClick; - swipeableViewContainerOnClickListener = this::onSwipeableViewContainerClick; + itemViewOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View view) { + onItemViewClick(view); + } + }; + swipeableViewContainerOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View view) { + onSwipeableViewContainerClick(view); + } + }; // SwipeableItemAdapter requires stable ID, and also // have to implement the getItemId() method appropriately. diff --git a/app/src/main/java/ch/dissem/apps/abit/dialog/AddIdentityDialogFragment.java b/app/src/main/java/ch/dissem/apps/abit/dialog/AddIdentityDialogFragment.java index 59e16b6..76158e3 100644 --- a/app/src/main/java/ch/dissem/apps/abit/dialog/AddIdentityDialogFragment.java +++ b/app/src/main/java/ch/dissem/apps/abit/dialog/AddIdentityDialogFragment.java @@ -19,6 +19,7 @@ package ch.dissem.apps.abit.dialog; import android.annotation.SuppressLint; import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; @@ -60,47 +61,55 @@ public class AddIdentityDialogFragment extends AppCompatDialogFragment { getDialog().setTitle(R.string.add_identity); View view = inflater.inflate(R.layout.dialog_add_identity, container, false); final RadioGroup radioGroup = (RadioGroup) view.findViewById(R.id.radioGroup); - view.findViewById(R.id.ok).setOnClickListener(v -> { - final Context ctx = getActivity().getBaseContext(); - switch (radioGroup.getCheckedRadioButtonId()) { - case R.id.create_identity: - Toast.makeText(ctx, - R.string.toast_long_running_operation, - Toast.LENGTH_SHORT).show(); - new AsyncTask() { - @Override - protected BitmessageAddress doInBackground(Void... args) { - return bmc.createIdentity(false, Pubkey.Feature.DOES_ACK); - } - - @Override - protected void onPostExecute(BitmessageAddress chan) { - Toast.makeText(ctx, - R.string.toast_identity_created, - Toast.LENGTH_SHORT).show(); - MainActivity mainActivity = MainActivity.getInstance(); - if (mainActivity != null) { - mainActivity.addIdentityEntry(chan); + view.findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + final Context ctx = getActivity().getBaseContext(); + switch (radioGroup.getCheckedRadioButtonId()) { + case R.id.create_identity: + Toast.makeText(ctx, + R.string.toast_long_running_operation, + Toast.LENGTH_SHORT).show(); + new AsyncTask() { + @Override + protected BitmessageAddress doInBackground(Void... args) { + return bmc.createIdentity(false, Pubkey.Feature.DOES_ACK); } - } - }.execute(); - break; - case R.id.import_identity: - startActivity(new Intent(ctx, ImportIdentityActivity.class)); - break; - case R.id.add_chan: - addChanDialog(); - break; - case R.id.add_deterministic_address: - new DeterministicIdentityDialogFragment().show(getFragmentManager(), - "dialog"); - break; - default: - return; + + @Override + protected void onPostExecute(BitmessageAddress chan) { + Toast.makeText(ctx, + R.string.toast_identity_created, + Toast.LENGTH_SHORT).show(); + MainActivity mainActivity = MainActivity.getInstance(); + if (mainActivity != null) { + mainActivity.addIdentityEntry(chan); + } + } + }.execute(); + break; + case R.id.import_identity: + startActivity(new Intent(ctx, ImportIdentityActivity.class)); + break; + case R.id.add_chan: + addChanDialog(); + break; + case R.id.add_deterministic_address: + new DeterministicIdentityDialogFragment().show(getFragmentManager(), + "dialog"); + break; + default: + return; + } + dismiss(); + } + }); + view.findViewById(R.id.dismiss).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dismiss(); } - dismiss(); }); - view.findViewById(R.id.dismiss).setOnClickListener(v -> dismiss()); return view; } @@ -113,31 +122,34 @@ public class AddIdentityDialogFragment extends AppCompatDialogFragment { new AlertDialog.Builder(activity) .setTitle(R.string.add_chan) .setView(dialogView) - .setPositiveButton(R.string.ok, (dialogInterface, i) -> { - TextView passphrase = (TextView) dialogView.findViewById(R.id.passphrase); - Toast.makeText(ctx, R.string.toast_long_running_operation, - Toast.LENGTH_SHORT).show(); - new AsyncTask() { - @Override - protected BitmessageAddress doInBackground(String... args) { - String pass = args[0]; - BitmessageAddress chan = bmc.createChan(pass); - chan.setAlias(pass); - bmc.addresses().save(chan); - return chan; - } - - @Override - protected void onPostExecute(BitmessageAddress chan) { - Toast.makeText(ctx, - R.string.toast_chan_created, - Toast.LENGTH_SHORT).show(); - MainActivity mainActivity = MainActivity.getInstance(); - if (mainActivity != null) { - mainActivity.addIdentityEntry(chan); + .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + TextView passphrase = (TextView) dialogView.findViewById(R.id.passphrase); + Toast.makeText(ctx, R.string.toast_long_running_operation, + Toast.LENGTH_SHORT).show(); + new AsyncTask() { + @Override + protected BitmessageAddress doInBackground(String... args) { + String pass = args[0]; + BitmessageAddress chan = bmc.createChan(pass); + chan.setAlias(pass); + bmc.addresses().save(chan); + return chan; } - } - }.execute(passphrase.getText().toString()); + + @Override + protected void onPostExecute(BitmessageAddress chan) { + Toast.makeText(ctx, + R.string.toast_chan_created, + Toast.LENGTH_SHORT).show(); + MainActivity mainActivity = MainActivity.getInstance(); + if (mainActivity != null) { + mainActivity.addIdentityEntry(chan); + } + } + }.execute(passphrase.getText().toString()); + } }) .setNegativeButton(R.string.cancel, null) .show(); diff --git a/app/src/main/java/ch/dissem/apps/abit/dialog/DeterministicIdentityDialogFragment.java b/app/src/main/java/ch/dissem/apps/abit/dialog/DeterministicIdentityDialogFragment.java index a31b84b..d0832c0 100644 --- a/app/src/main/java/ch/dissem/apps/abit/dialog/DeterministicIdentityDialogFragment.java +++ b/app/src/main/java/ch/dissem/apps/abit/dialog/DeterministicIdentityDialogFragment.java @@ -56,68 +56,76 @@ public class DeterministicIdentityDialogFragment extends AppCompatDialogFragment getDialog().setTitle(R.string.add_deterministic_address); View view = inflater.inflate(R.layout.dialog_add_deterministic_identity, container, false); view.findViewById(R.id.ok) - .setOnClickListener(v -> { - dismiss(); - final Context context = getActivity().getBaseContext(); - View dialogView = getView(); - TextView label = (TextView) dialogView.findViewById(R.id.label); - TextView passphrase = (TextView) dialogView.findViewById(R.id.passphrase); - TextView numberOfAddresses = (TextView) dialogView.findViewById(R.id - .number_of_identities); - Switch shorter = (Switch) dialogView.findViewById(R.id.shorter); + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dismiss(); + final Context context = getActivity().getBaseContext(); + View dialogView = getView(); + assert dialogView != null; + TextView label = (TextView) dialogView.findViewById(R.id.label); + TextView passphrase = (TextView) dialogView.findViewById(R.id.passphrase); + TextView numberOfAddresses = (TextView) dialogView.findViewById(R.id + .number_of_identities); + Switch shorter = (Switch) dialogView.findViewById(R.id.shorter); - Toast.makeText(context, R.string.toast_long_running_operation, - Toast.LENGTH_SHORT).show(); - new AsyncTask>() { - @Override - protected List doInBackground(Object... args) { - String label = (String) args[0]; - String pass = (String) args[1]; - int numberOfAddresses = (int) args[2]; - boolean shorter = (boolean) args[3]; - List identities = bmc.createDeterministicAddresses - (pass, - numberOfAddresses, Pubkey.LATEST_VERSION, 1L, shorter); - int i = 0; - for (BitmessageAddress identity : identities) { - i++; - if (identities.size() == 1) { - identity.setAlias(label); - } else { - identity.setAlias(label + " (" + i + ")"); - } - bmc.addresses().save(identity); - } - return identities; - } - - @Override - protected void onPostExecute(List identities) { - int messageRes; - if (identities.size() == 1) { - messageRes = R.string.toast_identity_created; - } else { - messageRes = R.string.toast_identities_created; - } - Toast.makeText(context, - messageRes, - Toast.LENGTH_SHORT).show(); - MainActivity mainActivity = MainActivity.getInstance(); - if (mainActivity != null) { + Toast.makeText(context, R.string.toast_long_running_operation, + Toast.LENGTH_SHORT).show(); + new AsyncTask>() { + @Override + protected List doInBackground(Object... args) { + String label = (String) args[0]; + String pass = (String) args[1]; + int numberOfAddresses = (int) args[2]; + boolean shorter = (boolean) args[3]; + List identities = bmc.createDeterministicAddresses + (pass, + numberOfAddresses, Pubkey.LATEST_VERSION, 1L, shorter); + int i = 0; for (BitmessageAddress identity : identities) { - mainActivity.addIdentityEntry(identity); + i++; + if (identities.size() == 1) { + identity.setAlias(label); + } else { + identity.setAlias(label + " (" + i + ")"); + } + bmc.addresses().save(identity); + } + return identities; + } + + @Override + protected void onPostExecute(List identities) { + int messageRes; + if (identities.size() == 1) { + messageRes = R.string.toast_identity_created; + } else { + messageRes = R.string.toast_identities_created; + } + Toast.makeText(context, + messageRes, + Toast.LENGTH_SHORT).show(); + MainActivity mainActivity = MainActivity.getInstance(); + if (mainActivity != null) { + for (BitmessageAddress identity : identities) { + mainActivity.addIdentityEntry(identity); + } } } - } - }.execute( - label.getText().toString(), - passphrase.getText().toString(), - Integer.valueOf(numberOfAddresses.getText().toString()), - shorter.isChecked() - ); + }.execute( + label.getText().toString(), + passphrase.getText().toString(), + Integer.valueOf(numberOfAddresses.getText().toString()), + shorter.isChecked() + ); + } }); - view.findViewById(R.id.dismiss) - .setOnClickListener(v -> dismiss()); + view.findViewById(R.id.dismiss).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + dismiss(); + } + }); return view; } diff --git a/app/src/main/java/ch/dissem/apps/abit/dialog/FullNodeDialogActivity.java b/app/src/main/java/ch/dissem/apps/abit/dialog/FullNodeDialogActivity.java index 2f573b2..a0f48f5 100644 --- a/app/src/main/java/ch/dissem/apps/abit/dialog/FullNodeDialogActivity.java +++ b/app/src/main/java/ch/dissem/apps/abit/dialog/FullNodeDialogActivity.java @@ -19,6 +19,7 @@ package ch.dissem.apps.abit.dialog; import android.app.Activity; import android.content.Intent; import android.os.Bundle; +import android.view.View; import ch.dissem.apps.abit.R; import ch.dissem.apps.abit.service.BitmessageService; @@ -34,11 +35,19 @@ public class FullNodeDialogActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.dialog_full_node); - findViewById(R.id.ok).setOnClickListener(v -> { - startService(new Intent(this, BitmessageService.class)); - updateNodeSwitch(); - finish(); + findViewById(R.id.ok).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + startService(new Intent(FullNodeDialogActivity.this, BitmessageService.class)); + updateNodeSwitch(); + finish(); + } + }); + findViewById(R.id.dismiss).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + finish(); + } }); - findViewById(R.id.dismiss).setOnClickListener(v -> finish()); } } diff --git a/app/src/main/java/ch/dissem/apps/abit/listener/MessageListener.java b/app/src/main/java/ch/dissem/apps/abit/listener/MessageListener.java index e980d93..d9a3f7b 100644 --- a/app/src/main/java/ch/dissem/apps/abit/listener/MessageListener.java +++ b/app/src/main/java/ch/dissem/apps/abit/listener/MessageListener.java @@ -48,32 +48,38 @@ public class MessageListener implements BitmessageContext.Listener { @Override public void receive(final Plaintext plaintext) { - pool.submit(() -> { - unacknowledged.addFirst(plaintext); - numberOfUnacknowledgedMessages++; - if (unacknowledged.size() > 5) { - unacknowledged.removeLast(); - } - if (numberOfUnacknowledgedMessages == 1) { - notification.singleNotification(plaintext); - } else { - notification.multiNotification(unacknowledged, numberOfUnacknowledgedMessages); - } - notification.show(); + pool.submit(new Runnable() { + @Override + public void run() { + unacknowledged.addFirst(plaintext); + numberOfUnacknowledgedMessages++; + if (unacknowledged.size() > 5) { + unacknowledged.removeLast(); + } + if (numberOfUnacknowledgedMessages == 1) { + notification.singleNotification(plaintext); + } else { + notification.multiNotification(unacknowledged, numberOfUnacknowledgedMessages); + } + notification.show(); - // If MainActivity is shown, update the sidebar badges - MainActivity main = MainActivity.getInstance(); - if (main != null) { - main.updateUnread(); + // If MainActivity is shown, update the sidebar badges + MainActivity main = MainActivity.getInstance(); + if (main != null) { + main.updateUnread(); + } } }); } public void resetNotification() { - pool.submit(() -> { - notification.hide(); - unacknowledged.clear(); - numberOfUnacknowledgedMessages = 0; + pool.submit(new Runnable() { + @Override + public void run() { + notification.hide(); + unacknowledged.clear(); + numberOfUnacknowledgedMessages = 0; + } }); } } diff --git a/app/src/main/java/ch/dissem/apps/abit/pow/ServerPowEngine.java b/app/src/main/java/ch/dissem/apps/abit/pow/ServerPowEngine.java index e8812ea..fa91b5d 100644 --- a/app/src/main/java/ch/dissem/apps/abit/pow/ServerPowEngine.java +++ b/app/src/main/java/ch/dissem/apps/abit/pow/ServerPowEngine.java @@ -17,12 +17,14 @@ package ch.dissem.apps.abit.pow; import android.content.Context; +import android.support.annotation.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; import ch.dissem.apps.abit.service.Singleton; import ch.dissem.apps.abit.synchronization.SyncAdapter; @@ -50,34 +52,40 @@ public class ServerPowEngine implements ProofOfWorkEngine, InternalContext public ServerPowEngine(Context ctx) { this.ctx = ctx; - pool = Executors.newCachedThreadPool(r -> { - Thread thread = Executors.defaultThreadFactory().newThread(r); - thread.setPriority(Thread.MIN_PRIORITY); - return thread; + pool = Executors.newCachedThreadPool(new ThreadFactory() { + @Override + public Thread newThread(@NonNull Runnable r) { + Thread thread = Executors.defaultThreadFactory().newThread(r); + thread.setPriority(Thread.MIN_PRIORITY); + return thread; + } }); } @Override public void calculateNonce(final byte[] initialHash, final byte[] target, Callback callback) { - pool.execute(() -> { - BitmessageAddress identity = Singleton.getIdentity(ctx); - if (identity == null) throw new RuntimeException("No Identity for calculating POW"); + pool.execute(new Runnable() { + @Override + public void run() { + BitmessageAddress identity = Singleton.getIdentity(ctx); + if (identity == null) throw new RuntimeException("No Identity for calculating POW"); - ProofOfWorkRequest request = new ProofOfWorkRequest(identity, initialHash, - CALCULATE, target); - SyncAdapter.startPowSync(ctx); - try { - CryptoCustomMessage cryptoMsg = new CryptoCustomMessage<> - (request); - cryptoMsg.signAndEncrypt( - identity, - cryptography().createPublicKey(identity.getPublicDecryptionKey()) - ); - context.getNetworkHandler().send( - Preferences.getTrustedNode(ctx), Preferences.getTrustedNodePort(ctx), - cryptoMsg); - } catch (Exception e) { - LOG.error(e.getMessage(), e); + ProofOfWorkRequest request = new ProofOfWorkRequest(identity, initialHash, + CALCULATE, target); + SyncAdapter.startPowSync(ctx); + try { + CryptoCustomMessage cryptoMsg = new CryptoCustomMessage<> + (request); + cryptoMsg.signAndEncrypt( + identity, + cryptography().createPublicKey(identity.getPublicDecryptionKey()) + ); + context.getNetworkHandler().send( + Preferences.getTrustedNode(ctx), Preferences.getTrustedNodePort(ctx), + cryptoMsg); + } catch (Exception e) { + LOG.error(e.getMessage(), e); + } } }); } diff --git a/app/src/main/java/ch/dissem/apps/abit/service/ProofOfWorkService.java b/app/src/main/java/ch/dissem/apps/abit/service/ProofOfWorkService.java index 3b41df7..e171edf 100644 --- a/app/src/main/java/ch/dissem/apps/abit/service/ProofOfWorkService.java +++ b/app/src/main/java/ch/dissem/apps/abit/service/ProofOfWorkService.java @@ -92,23 +92,26 @@ public class ProofOfWorkService extends Service { } private void calculateNonce(final PowItem item) { - engine.calculateNonce(item.initialHash, item.targetValue, (initialHash, nonce) -> { - try { - item.callback.onNonceCalculated(initialHash, nonce); - } finally { - PowItem next; - synchronized (queue) { - next = queue.poll(); - if (next == null) { - calculating = false; - stopForeground(true); - stopSelf(); - } else { - notification.update(queue.size()).show(); + engine.calculateNonce(item.initialHash, item.targetValue, new ProofOfWorkEngine.Callback() { + @Override + public void onNonceCalculated(byte[] initialHash, byte[] nonce) { + try { + item.callback.onNonceCalculated(initialHash, nonce); + } finally { + PowItem next; + synchronized (queue) { + next = queue.poll(); + if (next == null) { + calculating = false; + stopForeground(true); + stopSelf(); + } else { + notification.update(queue.size()).show(); + } + } + if (next != null) { + calculateNonce(next); } - } - if (next != null) { - calculateNonce(next); } } }); 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 db3360b..1bceb0b 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 @@ -110,9 +110,9 @@ public class Singleton { return powRepo; } - public static BitmessageAddress getIdentity(Context ctx) { + public static BitmessageAddress getIdentity(final Context ctx) { if (identity == null) { - BitmessageContext bmc = getBitmessageContext(ctx); + final BitmessageContext bmc = getBitmessageContext(ctx); synchronized (Singleton.class) { if (identity == null) { List identities = bmc.addresses()