From fee419ec7c0b951138042d7af41a16e4645fa177 Mon Sep 17 00:00:00 2001 From: Vincenzo Palazzo Date: Sat, 27 Mar 2021 01:31:02 +0100 Subject: [PATCH 1/6] Add kotlin linter plugin to and update all the code This code introduces a koltin linter, in particular a plugin called kotlinter, and it is available on https://github.com/jeremymailen/kotlinter-gradle This commit adds the support in all the app and also in the Github cli, so now all the commit need to pass also the kotlin format check. To make easy the support of the guideline a .editorconfig is added but an additional configuration of Android studio is needed. The Android Studio configuration that is needed is Settings -> Editor -> CodeStyle -> Kotlin -> import -> enable Use single name import. Signed-off-by: Vincenzo Palazzo --- .editorconfig | 25 ++++++ .github/workflows/android-master.yml | 2 + README.md | 12 +++ app/build.gradle | 1 + .../lvaccaro/lamp/ExampleInstrumentedTest.kt | 4 +- .../java/com/lvaccaro/lamp/LightningCli.kt | 11 +-- .../java/com/lvaccaro/lamp/MainActivity.kt | 65 +++++++++----- .../lamp/activities/BuildInvoiceActivity.kt | 24 ++++-- .../lamp/activities/ChannelsActivity.kt | 32 +++---- .../lamp/activities/ConsoleActivity.kt | 11 ++- .../lvaccaro/lamp/activities/LogActivity.kt | 20 ++--- .../lvaccaro/lamp/activities/ScanActivity.kt | 4 +- .../lvaccaro/lamp/activities/SendActivity.kt | 15 ++-- .../lamp/activities/SettingsActivity.kt | 33 ++++--- .../lamp/activities/UriResultActivity.kt | 29 +++---- .../lvaccaro/lamp/adapters/BalanceAdapter.kt | 14 +-- .../lvaccaro/lamp/adapters/HashMapAdapter.kt | 2 +- .../lamp/fragments/ChannelFragment.kt | 4 +- .../lamp/fragments/DecodedInvoiceFragment.kt | 8 +- .../lamp/fragments/FundChannelFragment.kt | 6 +- .../lamp/fragments/PeerInfoFragment.kt | 5 +- .../lamp/fragments/RecyclerViewFragment.kt | 7 +- .../lamp/fragments/WithdrawFragment.kt | 14 +-- .../lvaccaro/lamp/handlers/BrokenStatus.kt | 11 ++- .../lvaccaro/lamp/handlers/IEventHandler.kt | 2 +- .../lvaccaro/lamp/handlers/NewBlockHandler.kt | 11 ++- .../lamp/handlers/NewChannelPayment.kt | 10 +-- .../lvaccaro/lamp/handlers/NewTransaction.kt | 12 +-- .../lvaccaro/lamp/handlers/NodeUpHandler.kt | 9 +- .../com/lvaccaro/lamp/handlers/PaidInvoice.kt | 8 +- .../lvaccaro/lamp/handlers/ShutdownNode.kt | 9 +- .../com/lvaccaro/lamp/services/Globber.kt | 11 ++- .../lamp/services/LightningService.kt | 64 ++++++++------ .../com/lvaccaro/lamp/services/TorService.kt | 22 +++-- .../java/com/lvaccaro/lamp/utils/Archive.kt | 25 +++--- .../java/com/lvaccaro/lamp/utils/LampKeys.kt | 6 +- .../com/lvaccaro/lamp/utils/LogObserver.kt | 24 ++++-- .../lvaccaro/lamp/utils/SimulatorPlugin.kt | 2 +- .../main/java/com/lvaccaro/lamp/utils/UI.kt | 8 +- .../java/com/lvaccaro/lamp/utils/Validator.kt | 85 +++++++++---------- .../lvaccaro/lamp/views/HistoryBottomSheet.kt | 20 +++-- .../com/lvaccaro/lamp/views/PowerImageView.kt | 4 +- .../com/lvaccaro/lamp/ValidatorUnitTest.kt | 10 +-- build.gradle | 5 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 45 files changed, 409 insertions(+), 299 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..4850b82e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,25 @@ +# Note that in this case 'import-ordering' rule will be active and 'indent' will be disabled +[api/*.{kt,kts}] +root = true +disabled_rules=indent + +# Comma-separated list of rules to disable (Since 0.34.0) +# Note that rules in any ruleset other than the standard ruleset will need to be prefixed +# by the ruleset identifier. +disabled_rules=no-wildcard-imports,experimental:annotation,my-custom-ruleset + +# Defines the imports layout. The layout can be composed by the following symbols: +# "*" - wildcard. There must be at least one entry of a single wildcard to match all other imports. Matches anything after a specified symbol/import as well. +# "|" - blank line. Supports only single blank lines between imports. No blank line is allowed in the beginning or end of the layout. +# "^" - alias import, e.g. "^android.*" will match all android alias imports, "^" will match all other alias imports. +# import paths - these can be full paths, e.g. "java.util.List.*" as well as wildcard paths, e.g. "kotlin.**" +# Examples (we use ij_kotlin_imports_layout to set an imports layout for both ktlint and IDEA via a single property): +# ij_kotlin_imports_layout=* # alphabetical with capital letters before lower case letters (e.g. Z before a), no blank lines +# ij_kotlin_imports_layout=*,java.**,javax.**,kotlin.**,^ # default IntelliJ IDEA style, same as alphabetical, but with "java", "javax", "kotlin" and alias imports in the end of the imports list +# ij_kotlin_imports_layout=android.**,|,^org.junit.**,kotlin.io.Closeable.*,|,*,^ # custom imports layout + +# According to https://kotlinlang.org/docs/reference/coding-conventions.html#names-for-test-methods it is acceptable to write method names +# in natural language. When using natural language, the description tends to be longer. Allow lines containing an identifier between +# backticks to be longer than the maximum line length. (Since 0.41.0) +[**/test/**.kt] +ktlint_ignore_back_ticked_identifier=true \ No newline at end of file diff --git a/.github/workflows/android-master.yml b/.github/workflows/android-master.yml index a83580e3..baaf13f2 100644 --- a/.github/workflows/android-master.yml +++ b/.github/workflows/android-master.yml @@ -19,6 +19,8 @@ jobs: uses: actions/setup-java@v1 with: java-version: 1.8 + - name: Check koltin formatting + run: bash ./gradlew lintKotlin - name: Build debug APK run: bash ./gradlew assembleDebug --stacktrace - name: Upload APK diff --git a/README.md b/README.md index 984f0d83..4e862fc1 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,18 @@ Read the following instructions at [Tor on clightning](https://lightning.readthe * [in Linux using cmdline tools](doc/cmdline-tools-setup.md) +## Code Style +[![ktlint](https://img.shields.io/badge/code%20style-%E2%9D%A4-FF4081.svg)](https://ktlint.github.io/) + +> We live in a world where robots can drive a car, so we shouldn't just write code, we should write elegant code. + +This repository use [ktlint](https://github.com/pinterest/ktlint) to maintains the code of the repository elegant, so +before submit the code check the Kotlin format with the following command on the root of the directory + +```bash +./gradlew formatKotlin +``` + ## References - [ABCore](https://github.com/greenaddress/abcore) Android Bitcoin Core wallet diff --git a/app/build.gradle b/app/build.gradle index f92962da..d20f23c4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' +apply plugin: "org.jmailen.kotlinter" android { compileSdkVersion 28 diff --git a/app/src/androidTest/java/com/lvaccaro/lamp/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/lvaccaro/lamp/ExampleInstrumentedTest.kt index 24a386b0..88b0884b 100644 --- a/app/src/androidTest/java/com/lvaccaro/lamp/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/com/lvaccaro/lamp/ExampleInstrumentedTest.kt @@ -2,12 +2,10 @@ package com.lvaccaro.lamp import androidx.test.platform.app.InstrumentationRegistry import androidx.test.runner.AndroidJUnit4 - +import org.junit.Assert.assertEquals import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * diff --git a/app/src/main/java/com/lvaccaro/lamp/LightningCli.kt b/app/src/main/java/com/lvaccaro/lamp/LightningCli.kt index 16b7821a..4c943dfa 100644 --- a/app/src/main/java/com/lvaccaro/lamp/LightningCli.kt +++ b/app/src/main/java/com/lvaccaro/lamp/LightningCli.kt @@ -25,11 +25,12 @@ class LightningCli { String.format("%s/cli/%s", binaryDir.canonicalPath, command), String.format("--network=%s", network), String.format("--lightning-dir=%s", lightningDir.path), - String.format("--%s", if (json == true) "json" else "raw" )) + String.format("--%s", if (json == true) "json" else "raw") + ) val pb = ProcessBuilder((args + options).asList()) pb.directory(binaryDir) - //pb.redirectErrorStream(true) + // pb.redirectErrorStream(true) val process = pb.start() val code = process.waitFor() @@ -38,7 +39,7 @@ class LightningCli { val input = process.inputStream.toText() log.info(error) log.info(input) - throw Exception(if(!error.isEmpty()) error else input) + throw Exception(if (!error.isEmpty()) error else input) } return process.inputStream } @@ -46,7 +47,7 @@ class LightningCli { // extension to convert inputStream in text fun InputStream.toText(): String { - val reader = bufferedReader() + val reader = bufferedReader() val builder = StringBuilder() var line = reader.readLine() while (line != null) { @@ -71,4 +72,4 @@ fun Context.rootDir(): File { return noBackupFilesDir } return filesDir -} \ No newline at end of file +} diff --git a/app/src/main/java/com/lvaccaro/lamp/MainActivity.kt b/app/src/main/java/com/lvaccaro/lamp/MainActivity.kt index 92db9bf9..c5b1849d 100644 --- a/app/src/main/java/com/lvaccaro/lamp/MainActivity.kt +++ b/app/src/main/java/com/lvaccaro/lamp/MainActivity.kt @@ -4,7 +4,11 @@ import android.Manifest import android.app.Activity import android.app.ActivityManager import android.app.DownloadManager -import android.content.* +import android.content.BroadcastReceiver +import android.content.ClipboardManager +import android.content.Context +import android.content.Intent +import android.content.IntentFilter import android.content.pm.PackageManager import android.net.Uri import android.os.Build @@ -25,28 +29,48 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.preference.PreferenceManager import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager -import com.lvaccaro.lamp.activities.* +import com.lvaccaro.lamp.activities.BuildInvoiceActivity +import com.lvaccaro.lamp.activities.ChannelsActivity +import com.lvaccaro.lamp.activities.ConsoleActivity +import com.lvaccaro.lamp.activities.LogActivity +import com.lvaccaro.lamp.activities.ScanActivity +import com.lvaccaro.lamp.activities.SendActivity +import com.lvaccaro.lamp.activities.SettingsActivity +import com.lvaccaro.lamp.activities.UriResultActivity import com.lvaccaro.lamp.adapters.Balance import com.lvaccaro.lamp.adapters.BalanceAdapter import com.lvaccaro.lamp.fragments.PeerInfoFragment import com.lvaccaro.lamp.fragments.WithdrawFragment -import com.lvaccaro.lamp.handlers.* +import com.lvaccaro.lamp.handlers.BrokenStatus +import com.lvaccaro.lamp.handlers.NewBlockHandler +import com.lvaccaro.lamp.handlers.NewChannelPayment +import com.lvaccaro.lamp.handlers.NewTransaction +import com.lvaccaro.lamp.handlers.NodeUpHandler +import com.lvaccaro.lamp.handlers.PaidInvoice +import com.lvaccaro.lamp.handlers.ShutdownNode import com.lvaccaro.lamp.services.LightningService import com.lvaccaro.lamp.services.TorService import com.lvaccaro.lamp.utils.Archive import com.lvaccaro.lamp.utils.SimulatorPlugin import com.lvaccaro.lamp.utils.UI import com.lvaccaro.lamp.views.HistoryBottomSheet -import kotlinx.android.synthetic.main.activity_main.* -import kotlinx.android.synthetic.main.content_main_off.* -import kotlinx.android.synthetic.main.content_main_on.* -import kotlinx.android.synthetic.main.fragment_history.* +import kotlinx.android.synthetic.main.activity_main.contentMainOff +import kotlinx.android.synthetic.main.activity_main.contentMainOn +import kotlinx.android.synthetic.main.content_main_off.powerImageView +import kotlinx.android.synthetic.main.content_main_off.statusText +import kotlinx.android.synthetic.main.content_main_off.versionText +import kotlinx.android.synthetic.main.content_main_on.balanceText +import kotlinx.android.synthetic.main.content_main_on.floatingActionButton +import kotlinx.android.synthetic.main.content_main_on.receiveButton +import kotlinx.android.synthetic.main.content_main_on.recyclerView +import kotlinx.android.synthetic.main.content_main_on.sendButton +import kotlinx.android.synthetic.main.content_main_on.syncText +import kotlinx.android.synthetic.main.fragment_history.bottomSheet import org.jetbrains.anko.doAsync import org.json.JSONArray import java.io.File import java.util.logging.Logger - class MainActivity : UriResultActivity() { private val REQUEST_SCAN = 102 @@ -178,7 +202,8 @@ class MainActivity : UriResultActivity() { override fun onRequestPermissionsResult( requestCode: Int, - permissions: Array, grantResults: IntArray + permissions: Array, + grantResults: IntArray ) { when (requestCode) { WRITE_REQUEST_CODE -> { @@ -280,13 +305,14 @@ class MainActivity : UriResultActivity() { val peers: JSONArray = listPeers["peers"] as JSONArray runOnUiThread { - balanceText.text = "${(SimulatorPlugin.funds(listPeers).toDouble()/1000)} sat" + balanceText.text = "${(SimulatorPlugin.funds(listPeers).toDouble() / 1000)} sat" recyclerView.adapter = BalanceAdapter( arrayListOf( - Balance("Spendable in channels", "${peers.length()} Peers", "${SimulatorPlugin.funds(listPeers).toDouble()/1000} sat"), - Balance("Locked in channels", "${channels.length()} Channels", "${SimulatorPlugin.offchain(listFunds).toDouble()/1000} sat"), + Balance("Spendable in channels", "${peers.length()} Peers", "${SimulatorPlugin.funds(listPeers).toDouble() / 1000} sat"), + Balance("Locked in channels", "${channels.length()} Channels", "${SimulatorPlugin.offchain(listFunds).toDouble() / 1000} sat"), Balance("Bitcoin on chain", "${outputs.length()} Transactions", "${SimulatorPlugin.onchain(listFunds)} sat") - ), null + ), + null ) } } @@ -335,17 +361,16 @@ class MainActivity : UriResultActivity() { doAsync { try { Archive.uncompressXZ(tarFile, rootDir()) - } catch(ex: Exception) { + } catch (ex: Exception) { Log.e(TAG, "Error during uncompressXZ operation %s".format(ex.localizedMessage)) runOnUiThread { UI.snackBar(this@MainActivity, "Error During download lightning node") } - }finally { + } finally { runOnUiThread { powerOff() } } - } } else { statusText.text = @@ -388,7 +413,7 @@ class MainActivity : UriResultActivity() { title = alias powerImageView.on() val delta = blockcount - blockheight - syncText.text = if (delta > 0) "Syncing blocks -${delta}" else "" + syncText.text = if (delta > 0) "Syncing blocks -$delta" else "" } } catch (e: Exception) { log.info("---" + e.localizedMessage + "---") @@ -636,7 +661,7 @@ class MainActivity : UriResultActivity() { private val notificationReceiver = object : BroadcastReceiver() { // I can create a mediator that I can use to call all method inside the - //lightning-cli and return a json if the answer i ok or I throw an execeptions + // lightning-cli and return a json if the answer i ok or I throw an execeptions override fun onReceive(context: Context?, intent: Intent?) { Log.d(TAG, "onReceive action ${intent?.action}") @@ -650,7 +675,7 @@ class MainActivity : UriResultActivity() { NewBlockHandler.NOTIFICATION -> runOnUiThread { val blockheight = intent.getIntExtra("height", 0) val delta = blockcount - blockheight - statusText.text = if (delta > 0) "Syncing blocks -${delta}" else "" + statusText.text = if (delta > 0) "Syncing blocks -$delta" else "" } BrokenStatus.NOTIFICATION -> runOnUiThread { val message = intent.getStringExtra("message") @@ -662,7 +687,7 @@ class MainActivity : UriResultActivity() { NewTransaction.NOTIFICATION, NewChannelPayment.NOTIFICATION, PaidInvoice.NOTIFICATION -> doAsync { updateBalanceView(context) } - NodeUpHandler.NOTIFICATION -> { + NodeUpHandler.NOTIFICATION -> { isRunning = true } } diff --git a/app/src/main/java/com/lvaccaro/lamp/activities/BuildInvoiceActivity.kt b/app/src/main/java/com/lvaccaro/lamp/activities/BuildInvoiceActivity.kt index c1463fb0..d166c7ee 100644 --- a/app/src/main/java/com/lvaccaro/lamp/activities/BuildInvoiceActivity.kt +++ b/app/src/main/java/com/lvaccaro/lamp/activities/BuildInvoiceActivity.kt @@ -10,16 +10,24 @@ import com.lvaccaro.lamp.LightningCli import com.lvaccaro.lamp.R import com.lvaccaro.lamp.toJSONObject import com.lvaccaro.lamp.utils.UI -import kotlinx.android.synthetic.main.activity_build_invoice.* -import kotlinx.android.synthetic.main.list_balance.view.* -import kotlinx.android.synthetic.main.list_tx.* +import kotlinx.android.synthetic.main.activity_build_invoice.balanceText +import kotlinx.android.synthetic.main.activity_build_invoice.btcButton +import kotlinx.android.synthetic.main.activity_build_invoice.btclnLayout +import kotlinx.android.synthetic.main.activity_build_invoice.copyButton +import kotlinx.android.synthetic.main.activity_build_invoice.copyShareLayout +import kotlinx.android.synthetic.main.activity_build_invoice.descriptionText +import kotlinx.android.synthetic.main.activity_build_invoice.expiredText +import kotlinx.android.synthetic.main.activity_build_invoice.expiredTitle +import kotlinx.android.synthetic.main.activity_build_invoice.labelText +import kotlinx.android.synthetic.main.activity_build_invoice.lightningButton +import kotlinx.android.synthetic.main.activity_build_invoice.qrImage +import kotlinx.android.synthetic.main.activity_build_invoice.shareButton import org.jetbrains.anko.contentView import org.jetbrains.anko.doAsync import org.json.JSONObject import java.lang.Exception import java.text.SimpleDateFormat -import java.util.* - +import java.util.Date class BuildInvoiceActivity : AppCompatActivity() { @@ -59,13 +67,15 @@ class BuildInvoiceActivity : AppCompatActivity() { fun invoice(amount: String, label: String, description: String) { try { - val res = cli.exec(this, + val res = cli.exec( + this, arrayOf( "invoice", amount, label, description - ), true + ), + true ).toJSONObject() runOnUiThread { showInvoice(res["bolt11"] as String) } } catch (e: Exception) { diff --git a/app/src/main/java/com/lvaccaro/lamp/activities/ChannelsActivity.kt b/app/src/main/java/com/lvaccaro/lamp/activities/ChannelsActivity.kt index 5ada4a87..aa396e26 100644 --- a/app/src/main/java/com/lvaccaro/lamp/activities/ChannelsActivity.kt +++ b/app/src/main/java/com/lvaccaro/lamp/activities/ChannelsActivity.kt @@ -1,19 +1,22 @@ package com.lvaccaro.lamp.activities import android.os.Bundle -import android.view.* +import android.view.LayoutInflater +import android.view.Menu +import android.view.MenuItem +import android.view.ViewGroup import android.widget.ProgressBar import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.lvaccaro.lamp.fragments.ChannelFragment -import com.lvaccaro.lamp.fragments.FundChannelFragment import com.lvaccaro.lamp.LightningCli import com.lvaccaro.lamp.R +import com.lvaccaro.lamp.fragments.ChannelFragment +import com.lvaccaro.lamp.fragments.FundChannelFragment import com.lvaccaro.lamp.toJSONObject -import kotlinx.android.synthetic.main.activity_channels.* +import kotlinx.android.synthetic.main.activity_channels.toolbar import org.jetbrains.anko.doAsync import org.json.JSONArray import org.json.JSONObject @@ -22,10 +25,11 @@ import kotlin.collections.ArrayList typealias ChannelClickListener = (JSONObject) -> Unit -class ChannelAdapter(val list: ArrayList, - private val onClickListener: ChannelClickListener -) - : RecyclerView.Adapter() { +class ChannelAdapter( + val list: ArrayList, + private val onClickListener: ChannelClickListener +) : + RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChannelViewHolder { val inflater = LayoutInflater.from(parent.context) @@ -39,7 +43,6 @@ class ChannelAdapter(val list: ArrayList, } override fun getItemCount(): Int = list.size - } class ChannelViewHolder(inflater: LayoutInflater, parent: ViewGroup) : @@ -47,12 +50,12 @@ class ChannelViewHolder(inflater: LayoutInflater, parent: ViewGroup) : fun bind(channel: JSONObject) { val cid = channel.getString("channel_id") - val msatoshi_to_us = channel.getDouble("msatoshi_to_us")/1000 - val msatoshi_total = channel.getDouble("msatoshi_total")/1000 + val msatoshi_to_us = channel.getDouble("msatoshi_to_us") / 1000 + val msatoshi_total = channel.getDouble("msatoshi_total") / 1000 itemView.findViewById(R.id.cid).text = "CID: ${cid.subSequence(0,8)}..." itemView.findViewById(R.id.status).text = channel.getString("state") - itemView.findViewById(R.id.mysats).text = "My balance: ${msatoshi_to_us.toString()} sat" - itemView.findViewById(R.id.availablesats).text = "Available to receive: ${msatoshi_total.toString()} sat" + itemView.findViewById(R.id.mysats).text = "My balance: $msatoshi_to_us sat" + itemView.findViewById(R.id.availablesats).text = "Available to receive: $msatoshi_total sat" itemView.findViewById(R.id.progressBar).apply { max = msatoshi_total.toInt() progress = msatoshi_to_us.toInt() @@ -109,7 +112,7 @@ class ChannelsActivity : AppCompatActivity() { runOnUiThread { val total = channels.sumBy { it.getInt("msatoshi_to_us") / 1000 } - findViewById(R.id.total_text).text = "${total} sat in channels" + findViewById(R.id.total_text).text = "$total sat in channels" val recyclerView = findViewById(R.id.recycler_view) val adapter = recyclerView.adapter as ChannelAdapter adapter.apply { @@ -146,5 +149,4 @@ class ChannelsActivity : AppCompatActivity() { else -> super.onOptionsItemSelected(item) } } - } diff --git a/app/src/main/java/com/lvaccaro/lamp/activities/ConsoleActivity.kt b/app/src/main/java/com/lvaccaro/lamp/activities/ConsoleActivity.kt index 641b272f..d2ed7c2d 100644 --- a/app/src/main/java/com/lvaccaro/lamp/activities/ConsoleActivity.kt +++ b/app/src/main/java/com/lvaccaro/lamp/activities/ConsoleActivity.kt @@ -8,7 +8,6 @@ import androidx.appcompat.app.AppCompatActivity import com.lvaccaro.lamp.LightningCli import com.lvaccaro.lamp.R import com.lvaccaro.lamp.toText - import java.lang.Exception class ConsoleActivity : AppCompatActivity() { @@ -27,11 +26,11 @@ class ConsoleActivity : AppCompatActivity() { findViewById(R.id.send).setOnClickListener { val textContent = editTextCmd.text.toString() if (textContent != "") { - if(textContent.equals("clean", true)){ - //Command to clean console + if (textContent.equals("clean", true)) { + // Command to clean console editTextResult.setText("") editTextCmd.setText("") - }else{ + } else { CommandTask().execute(textContent) } } @@ -52,9 +51,9 @@ class ConsoleActivity : AppCompatActivity() { try { return LightningCli() .exec(this@ConsoleActivity, args, true).toText() - }catch (e: Exception) { + } catch (e: Exception) { e.printStackTrace() - return e.localizedMessage ?: "Error, params: ${args}" + return e.localizedMessage ?: "Error, params: $args" } } diff --git a/app/src/main/java/com/lvaccaro/lamp/activities/LogActivity.kt b/app/src/main/java/com/lvaccaro/lamp/activities/LogActivity.kt index 13bf25cd..5e74cd62 100644 --- a/app/src/main/java/com/lvaccaro/lamp/activities/LogActivity.kt +++ b/app/src/main/java/com/lvaccaro/lamp/activities/LogActivity.kt @@ -29,7 +29,7 @@ class LogActivity : AppCompatActivity() { private val maxBufferToLoad = 200 private var sizeBuffer = 0 - //UI component + // UI component private lateinit var editText: EditText private lateinit var progressBar: ProgressBar @@ -78,13 +78,13 @@ class LogActivity : AppCompatActivity() { } } - private fun shareLogByIntent(){ + private fun shareLogByIntent() { doAsync { val shareIntent = Intent(Intent.ACTION_SEND).apply { type = "text/plain" val logFile = File(rootDir(), "$daemon.log") if (!logFile.exists()) { - runOnUiThread{ + runOnUiThread { UI.showMessageOnToast(applicationContext, "No log file found") } return@doAsync @@ -94,8 +94,8 @@ class LogActivity : AppCompatActivity() { val lines = logFile.readLines() val sizeNow = lines.size var difference = 0 - if(sizeNow > 450) sizeNow - 200 - for(at in difference until sizeNow){ + if (sizeNow > 450) sizeNow - 200 + for (at in difference until sizeNow) { val line = lines[at] body.append(line).append("\n") } @@ -105,7 +105,7 @@ class LogActivity : AppCompatActivity() { startActivity(Intent.createChooser(shareIntent, null)) return@doAsync } - runOnUiThread{ + runOnUiThread { UI.showMessageOnToast(applicationContext, "Intent resolving error") } } @@ -131,13 +131,13 @@ class LogActivity : AppCompatActivity() { private fun read(randomAccessFile: RandomAccessFile, et: EditText) { Log.d(TAG, "Start to read the file with RandomAccessFile") - //Set the position at the end of the file + // Set the position at the end of the file val fileSize = randomAccessFile.length() - 1 randomAccessFile.seek(fileSize) - //The maximum dimension of this object is one line + // The maximum dimension of this object is one line val lineBuilder = StringBuilder() - //This contains the each line of the logger, the line of the logger are fixed - //to the propriety *maxBufferToLoad* + // This contains the each line of the logger, the line of the logger are fixed + // to the propriety *maxBufferToLoad* val logBuilder = StringBuilder() for (pointer in fileSize downTo 1) { randomAccessFile.seek(pointer) diff --git a/app/src/main/java/com/lvaccaro/lamp/activities/ScanActivity.kt b/app/src/main/java/com/lvaccaro/lamp/activities/ScanActivity.kt index 5161128b..fa22a1d4 100644 --- a/app/src/main/java/com/lvaccaro/lamp/activities/ScanActivity.kt +++ b/app/src/main/java/com/lvaccaro/lamp/activities/ScanActivity.kt @@ -73,7 +73,7 @@ class ScanActivity : AppCompatActivity(), ZXingScannerView.ResultHandler { Log.d(TAG, rawResult?.text) val result = rawResult?.text ?: "" if (result.isEmpty()) { - mScannerView.resumeCameraPreview(this); + mScannerView.resumeCameraPreview(this) return } @@ -105,4 +105,4 @@ class ScanActivity : AppCompatActivity(), ZXingScannerView.ResultHandler { else -> super.onOptionsItemSelected(item) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/lvaccaro/lamp/activities/SendActivity.kt b/app/src/main/java/com/lvaccaro/lamp/activities/SendActivity.kt index e13251b8..0ebb15c2 100644 --- a/app/src/main/java/com/lvaccaro/lamp/activities/SendActivity.kt +++ b/app/src/main/java/com/lvaccaro/lamp/activities/SendActivity.kt @@ -25,7 +25,6 @@ import org.jetbrains.anko.doAsync import org.json.JSONException import org.json.JSONObject - class SendActivity : AppCompatActivity(), BalanceClickListener { private val cli = LightningCli() @@ -53,7 +52,9 @@ class SendActivity : AppCompatActivity(), BalanceClickListener { Balance("Scan QR", "", ""), Balance("Paste from clipboard", "", ""), Balance("Manual typing", "", "") - ), this) + ), + this + ) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -94,7 +95,7 @@ class SendActivity : AppCompatActivity(), BalanceClickListener { val command = arrayListOf("pay", bolt11) if (msatoshi != null) command.add(msatoshi) - var params: Array = command.toArray(arrayOf()); + var params: Array = command.toArray(arrayOf()) cli.exec(this@SendActivity, params, true) runOnUiThread { UI.snackBar(this@SendActivity, "Payed invoice") @@ -104,7 +105,7 @@ class SendActivity : AppCompatActivity(), BalanceClickListener { var errorMessage = ex.localizedMessage try { errorMessage = JSONObject(ex.localizedMessage)["message"] as String - } catch(e: JSONException) { } + } catch (e: JSONException) { } runOnUiThread { UI.textAlertDialog(this, "Error", errorMessage) } } } @@ -156,15 +157,15 @@ class SendActivity : AppCompatActivity(), BalanceClickListener { ) input.layoutParams = lp alertDialog.setView(input) - alertDialog.setPositiveButton( android.R.string.ok ) { dialog, which -> + alertDialog.setPositiveButton(android.R.string.ok) { dialog, which -> val text = input.text.toString() if (text.isEmpty() || !Validator.isBolt11(text)) UI.snackBar(this, "No valid content found") else doAsync { decode(text) } } - alertDialog.setNegativeButton( android.R.string.cancel ) { dialog, which -> dialog.cancel() } + alertDialog.setNegativeButton(android.R.string.cancel) { dialog, which -> dialog.cancel() } alertDialog.show() } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/lvaccaro/lamp/activities/SettingsActivity.kt b/app/src/main/java/com/lvaccaro/lamp/activities/SettingsActivity.kt index 348d2338..3be1e0dc 100644 --- a/app/src/main/java/com/lvaccaro/lamp/activities/SettingsActivity.kt +++ b/app/src/main/java/com/lvaccaro/lamp/activities/SettingsActivity.kt @@ -9,13 +9,18 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat -import com.lvaccaro.lamp.MainActivity import com.lvaccaro.lamp.R import com.lvaccaro.lamp.rootDir import com.lvaccaro.lamp.utils.Archive import org.apache.commons.compress.utils.IOUtils import org.jetbrains.anko.doAsync -import java.io.* +import java.io.BufferedInputStream +import java.io.BufferedOutputStream +import java.io.File +import java.io.FileInputStream +import java.io.FileOutputStream +import java.io.IOException +import java.io.OutputStream import java.util.zip.ZipEntry import java.util.zip.ZipInputStream import java.util.zip.ZipOutputStream @@ -49,7 +54,7 @@ class SettingsActivity : AppCompatActivity() { return when (preference?.key) { "clearlogs" -> { val resultOperation = File(activity?.rootDir(), "lightningd.log").deleteRecursively() && - File(activity?.rootDir(), "tor.log").deleteRecursively() + File(activity?.rootDir(), "tor.log").deleteRecursively() File(activity?.rootDir(), ".lightning").listFiles() ?.filter { it.name.matches("crash.log.*".toRegex()) } @@ -58,7 +63,7 @@ class SettingsActivity : AppCompatActivity() { ?.filter { it.name.matches("crash.log.*".toRegex()) } ?.map { it.delete() } - if(resultOperation) + if (resultOperation) showToast("Erased logs", Toast.LENGTH_LONG) else showToast("Error during Erasing logs", Toast.LENGTH_LONG) @@ -66,9 +71,9 @@ class SettingsActivity : AppCompatActivity() { } "cleardata" -> { var resultOperation = File(activity?.rootDir(), ".lightning").deleteRecursively() && - File(activity?.rootDir(), ".bitcoin").deleteRecursively() && - File(activity?.rootDir(), ".tor").deleteRecursively() && - File(activity?.rootDir(), ".torHiddenService").deleteRecursively() + File(activity?.rootDir(), ".bitcoin").deleteRecursively() && + File(activity?.rootDir(), ".tor").deleteRecursively() && + File(activity?.rootDir(), ".torHiddenService").deleteRecursively() if (resultOperation) { showToast("Erased datadir", Toast.LENGTH_LONG) @@ -86,12 +91,12 @@ class SettingsActivity : AppCompatActivity() { val resultOperation = Archive.deleteUncompressed(dir) activity?.let { it.getPreferences(Context.MODE_PRIVATE).edit().remove("RELEASE").apply() } - if(resultOperation){ + if (resultOperation) { showToast( "Erased binary in: ${dir.path} and downloaded files", Toast.LENGTH_LONG ) - }else{ + } else { showToast( "Error during erasing binary in: ${dir.path} and downloaded files", Toast.LENGTH_LONG @@ -119,7 +124,7 @@ class SettingsActivity : AppCompatActivity() { showToast("The change require the node restart", Toast.LENGTH_LONG) true } - "enabled-esplora" ->{ + "enabled-esplora" -> { showToast("The change require the node restart", Toast.LENGTH_LONG) true } @@ -144,7 +149,7 @@ class SettingsActivity : AppCompatActivity() { val currFile = File(outputDir, entry.name) if (entry.isDirectory) { - currFile.mkdirs(); + currFile.mkdirs() } else { val parent: File = currFile.parentFile @@ -160,8 +165,10 @@ class SettingsActivity : AppCompatActivity() { } catch (e: IOException) { activity?.runOnUiThread { Toast.makeText( - context!!, "Error while copying '" + currFile.absolutePath - + "': " + e.message + "'", Toast.LENGTH_LONG + context!!, + "Error while copying '" + currFile.absolutePath + + "': " + e.message + "'", + Toast.LENGTH_LONG ).show() } return diff --git a/app/src/main/java/com/lvaccaro/lamp/activities/UriResultActivity.kt b/app/src/main/java/com/lvaccaro/lamp/activities/UriResultActivity.kt index 4e4a1f84..44cedf15 100644 --- a/app/src/main/java/com/lvaccaro/lamp/activities/UriResultActivity.kt +++ b/app/src/main/java/com/lvaccaro/lamp/activities/UriResultActivity.kt @@ -6,10 +6,9 @@ import android.util.Log import android.widget.Toast import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity +import com.lvaccaro.lamp.LightningCli import com.lvaccaro.lamp.fragments.FundChannelFragment -import com.lvaccaro.lamp.fragments.DecodedInvoiceFragment import com.lvaccaro.lamp.fragments.WithdrawFragment -import com.lvaccaro.lamp.LightningCli import com.lvaccaro.lamp.services.CLightningException import com.lvaccaro.lamp.toJSONObject import com.lvaccaro.lamp.utils.LampKeys @@ -46,7 +45,7 @@ open class UriResultActivity() : AppCompatActivity() { val bolt11 = Validator.getBolt11(text) runOnUiThread { showDecodePay(bolt11) } } else if (isURINodeConnect) { - Log.d(TAG, "*** Node URI connect ${text}") + Log.d(TAG, "*** Node URI connect $text") resultCommand = runCommandCLightning(LampKeys.CONNECT_COMMAND, arrayOf(text)) runOnUiThread { showConnect(resultCommand!!["id"].toString()) } } else { @@ -54,18 +53,18 @@ open class UriResultActivity() : AppCompatActivity() { resultCommand.put("message", "No action found") } } catch (ex: CLightningException) { - //FIXME: This have sense? + // FIXME: This have sense? Log.e(TAG, ex.localizedMessage) resultCommand = JSONObject(ex.localizedMessage) ex.printStackTrace() } finally { - if(resultCommand == null){ + if (resultCommand == null) { return } var message = "" - if(resultCommand.has(LampKeys.MESSAGE_JSON_KEY)){ + if (resultCommand.has(LampKeys.MESSAGE_JSON_KEY)) { message = resultCommand.get(LampKeys.MESSAGE_JSON_KEY).toString() - }else if(resultCommand.has("id")){ + } else if (resultCommand.has("id")) { message = "Connected to node" } runOnUiThread { @@ -82,13 +81,13 @@ open class UriResultActivity() : AppCompatActivity() { val payload = ArrayList() payload.add(command) payload.addAll(parameter) - payload.forEach { Log.d(TAG, "***** ${it}") } + payload.forEach { Log.d(TAG, "***** $it") } val rpcResult = cli.exec(this, payload.toTypedArray()).toJSONObject() Log.d(TAG, rpcResult.toString()) return rpcResult } catch (ex: Exception) { - //FIXME: This have sense? + // FIXME: This have sense? val answer = JSONObject(ex.localizedMessage) showMessageOnToast(answer[LampKeys.MESSAGE_JSON_KEY].toString(), Toast.LENGTH_LONG) throw CLightningException(ex.cause) @@ -123,14 +122,14 @@ open class UriResultActivity() : AppCompatActivity() { val bundle = Bundle() val address = param?.get(LampKeys.ADDRESS_KEY) ?: "" val networkCheck = Validator.isCorrectNetwork(cli, this.applicationContext, address) - if(networkCheck != null){ + if (networkCheck != null) { showMessageOnToast(networkCheck, Toast.LENGTH_LONG) return } var amount = "" - if(param!!.contains(LampKeys.AMOUNT_KEY)){ - //FIXME(vincenzopalazzo): create a converted class to set the set the correct ammounet. - //For instance, Validator.toMilliSatoshi() + if (param!!.contains(LampKeys.AMOUNT_KEY)) { + // FIXME(vincenzopalazzo): create a converted class to set the set the correct ammounet. + // For instance, Validator.toMilliSatoshi() amount = (param!![LampKeys.AMOUNT_KEY]!!.toDouble() * 100000000).toLong().toString() } bundle.putString(LampKeys.ADDRESS_KEY, address) @@ -140,8 +139,8 @@ open class UriResultActivity() : AppCompatActivity() { } protected fun showMessageOnToast(message: String, duration: Int = Toast.LENGTH_LONG) { - if(message.isEmpty()) return - runOnUiThread{ + if (message.isEmpty()) return + runOnUiThread { Toast.makeText( this, message, duration diff --git a/app/src/main/java/com/lvaccaro/lamp/adapters/BalanceAdapter.kt b/app/src/main/java/com/lvaccaro/lamp/adapters/BalanceAdapter.kt index 13b8cd29..77b54527 100644 --- a/app/src/main/java/com/lvaccaro/lamp/adapters/BalanceAdapter.kt +++ b/app/src/main/java/com/lvaccaro/lamp/adapters/BalanceAdapter.kt @@ -6,14 +6,15 @@ import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import com.lvaccaro.lamp.R -data class Balance (val title: String, val subtitle: String, val value: String) +data class Balance(val title: String, val subtitle: String, val value: String) typealias BalanceClickListener = (Int) -> Unit -class BalanceAdapter(val list: ArrayList, - private val onClickListener: BalanceClickListener? -) - : RecyclerView.Adapter() { +class BalanceAdapter( + val list: ArrayList, + private val onClickListener: BalanceClickListener? +) : + RecyclerView.Adapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BalanceViewHolder { val inflater = LayoutInflater.from(parent.context) @@ -27,7 +28,6 @@ class BalanceAdapter(val list: ArrayList, } override fun getItemCount(): Int = list.size - } class BalanceViewHolder(inflater: LayoutInflater, parent: ViewGroup) : @@ -37,4 +37,4 @@ class BalanceViewHolder(inflater: LayoutInflater, parent: ViewGroup) : itemView.findViewById(R.id.subtitle).text = subtitle itemView.findViewById(R.id.value).text = value } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/lvaccaro/lamp/adapters/HashMapAdapter.kt b/app/src/main/java/com/lvaccaro/lamp/adapters/HashMapAdapter.kt index 67de2f16..73416070 100644 --- a/app/src/main/java/com/lvaccaro/lamp/adapters/HashMapAdapter.kt +++ b/app/src/main/java/com/lvaccaro/lamp/adapters/HashMapAdapter.kt @@ -54,4 +54,4 @@ class HashMapAdapter(val map: LinkedHashMap) : return hashMap } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/lvaccaro/lamp/fragments/ChannelFragment.kt b/app/src/main/java/com/lvaccaro/lamp/fragments/ChannelFragment.kt index 477037ba..b2eb0557 100644 --- a/app/src/main/java/com/lvaccaro/lamp/fragments/ChannelFragment.kt +++ b/app/src/main/java/com/lvaccaro/lamp/fragments/ChannelFragment.kt @@ -11,8 +11,8 @@ import androidx.recyclerview.widget.RecyclerView import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.lvaccaro.lamp.LightningCli import com.lvaccaro.lamp.R -import com.lvaccaro.lamp.toJSONObject import com.lvaccaro.lamp.adapters.HashMapAdapter +import com.lvaccaro.lamp.toJSONObject import com.lvaccaro.lamp.utils.UI import org.jetbrains.anko.doAsync import org.json.JSONObject @@ -26,7 +26,7 @@ class ChannelFragment : BottomSheetDialogFragment() { savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_channel, container, false) - val data = arguments?.getString("channel") ?: "" + val data = arguments?.getString("channel") ?: "" val channel = JSONObject(data) val recyclerView = view.findViewById(R.id.recycler_view) diff --git a/app/src/main/java/com/lvaccaro/lamp/fragments/DecodedInvoiceFragment.kt b/app/src/main/java/com/lvaccaro/lamp/fragments/DecodedInvoiceFragment.kt index fee7a068..a4763e43 100644 --- a/app/src/main/java/com/lvaccaro/lamp/fragments/DecodedInvoiceFragment.kt +++ b/app/src/main/java/com/lvaccaro/lamp/fragments/DecodedInvoiceFragment.kt @@ -11,8 +11,8 @@ import androidx.recyclerview.widget.RecyclerView import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.lvaccaro.lamp.LightningCli import com.lvaccaro.lamp.R -import com.lvaccaro.lamp.toJSONObject import com.lvaccaro.lamp.adapters.HashMapAdapter +import com.lvaccaro.lamp.toJSONObject import com.lvaccaro.lamp.utils.UI import org.jetbrains.anko.doAsync import java.lang.Exception @@ -27,7 +27,7 @@ class DecodedInvoiceFragment : BottomSheetDialogFragment() { savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_decoded_invoice, container, false) - val bolt11 = arguments?.getString("bolt11") ?: "" + val bolt11 = arguments?.getString("bolt11") ?: "" val recyclerView = view.findViewById(R.id.recycler_view) recyclerView.layoutManager = LinearLayoutManager(context) @@ -59,7 +59,7 @@ class DecodedInvoiceFragment : BottomSheetDialogFragment() { // Pay invoice val context = activity!! try { - cli.exec(context, arrayOf("pay", bolt11), true) + cli.exec(context, arrayOf("pay", bolt11), true) .toJSONObject() context.runOnUiThread { Toast.makeText(context, "Invoice paid", Toast.LENGTH_LONG).show() @@ -71,4 +71,4 @@ class DecodedInvoiceFragment : BottomSheetDialogFragment() { } } } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/lvaccaro/lamp/fragments/FundChannelFragment.kt b/app/src/main/java/com/lvaccaro/lamp/fragments/FundChannelFragment.kt index 1dff94b1..149c1952 100644 --- a/app/src/main/java/com/lvaccaro/lamp/fragments/FundChannelFragment.kt +++ b/app/src/main/java/com/lvaccaro/lamp/fragments/FundChannelFragment.kt @@ -16,7 +16,7 @@ import com.lvaccaro.lamp.utils.UI import org.jetbrains.anko.doAsync import java.lang.Exception -class FundChannelFragment: BottomSheetDialogFragment() { +class FundChannelFragment : BottomSheetDialogFragment() { override fun onCreateView( inflater: LayoutInflater, @@ -28,7 +28,7 @@ class FundChannelFragment: BottomSheetDialogFragment() { view.findViewById(R.id.node_text).setText(uri ?: "") view.findViewById