Skip to content

Instantly share code, notes, and snippets.

@nm17
Last active April 17, 2025 18:57
Show Gist options
  • Save nm17/20eccfbe4c1fa532ca48996628ce7bd9 to your computer and use it in GitHub Desktop.
Save nm17/20eccfbe4c1fa532ca48996628ce7bd9 to your computer and use it in GitHub Desktop.
Install Android SDK CLI Ubuntu 20.04 WSL2 (Work in Progress)

Install Android SDK CLI Ubuntu 20.04 WSL2 (Work in Progress)

Install Java 8

sudo apt install openjdk-8-jdk-headless

Android SDK

wget https://dl.google.com/android/repository/commandlinetools-linux-6200805_latest.zip
mkdir -p Android/Sdk
unzip commandlinetools-linux-6200805_latest.zip -d Android/Sdk

export ANDROID_HOME=$HOME/Android/Sdk
# Make sure emulator path comes before tools. Had trouble on Ubuntu with emulator from /tools being loaded
# instead of the one from /emulator
export PATH="$ANDROID_HOME/emulator:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools:$PATH"

sdkmanager --sdk_root=${ANDROID_HOME} "tools"

sdkmanager --update
sdkmanager --list
sdkmanager "build-tools;28.0.3" "platform-tools" "platforms;android-28" "tools"
sdkmanager --licenses

sudo apt install gradle

Note: you can get an updated Android SDK link from https://developer.android.com/studio/#downloads

Used a combinaton of these gists: https://gist.github.com/fedme/fd42caec2e5a7e93e12943376373b7d0 https://gist.github.com/jjvillavicencio/18feb09f0e93e017a861678bc638dcb0

Background on the update to command line tools from android sdk https://stackoverflow.com/a/61176718

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/topAppBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:navigationIcon="@drawable/baseline_menu_24"
app:title="@string/app_name" />
</com.google.android.material.appbar.AppBarLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="12dp"
android:gravity="center"
android:orientation="vertical">
<com.google.android.material.textview.MaterialTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/calc_type_length"
android:textSize="24sp" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/fromTextField"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:hint="@string/input_number">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="numberDecimal" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/fromUnitInput"
style="@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:hint="@string/fromUnitHint">
<AutoCompleteTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:simpleItems="@array/units_menu_array"
tools:ignore="LabelFor" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/toUnitInput"
style="@style/Widget.Material3.TextInputLayout.FilledBox.ExposedDropdownMenu"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:hint="@string/toUnitHint">
<AutoCompleteTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:simpleItems="@array/units_menu_array"
tools:ignore="LabelFor" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/convertButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="@string/convert">
</com.google.android.material.button.MaterialButton>
<com.google.android.material.textview.MaterialTextView
android:id="@+id/outputTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="">
</com.google.android.material.textview.MaterialTextView>
</LinearLayout>
</LinearLayout>
</LinearLayout>
package ru.nm17.calcpracticeview
import android.os.Bundle
import android.util.Log
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.google.android.material.button.MaterialButton
import com.google.android.material.textfield.TextInputLayout
import com.google.android.material.textview.MaterialTextView
class MainActivity : AppCompatActivity() {
private lateinit var fromInput: TextInputLayout
private val fromInputValue: Float?
get() = fromInput.editText!!.text.toString().toFloatOrNull()
private lateinit var fromUnit: TextInputLayout
private val fromUnitValue: String
get() = fromUnit.editText!!.text.toString()
private lateinit var toUnit: TextInputLayout
private val toUnitValue: String
get() = toUnit.editText!!.text.toString()
private lateinit var convertButton: MaterialButton
private lateinit var outputTextView: MaterialTextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
fromInput = findViewById(R.id.fromTextField)
fromUnit = findViewById(R.id.fromUnitInput)
toUnit = findViewById(R.id.toUnitInput)
convertButton = findViewById(R.id.convertButton)
outputTextView = findViewById(R.id.outputTextView)
convertButton.setOnClickListener {
if (fromInputValue == null) {
fromInput.error = "Пустое поле"
return@setOnClickListener
}
val asd = Pair(fromUnitValue, toUnitValue);
var meters = 0.0f;
meters = when (fromUnitValue) {
"м" -> fromInputValue!!
"км" -> fromInputValue!! / 1000
"in" -> fromInputValue!! * 0.0254f
"ft" -> fromInputValue!! * 0.3048f
else -> {
fromInput.error = "Не верный входной тип"
return@setOnClickListener
}
}.toFloat()
val result = when (toUnitValue) {
"m" -> meters
"km" -> meters / 1000.0f
"ft" -> meters * (3 + 428.0f/127.0f)
"in" -> meters * (5000.0f/127.0f)
else -> {
fromInput.error = "Не верный итоговый тип"
return@setOnClickListener
}
}
outputTextView.text = getString(R.string.result_format_string).format(result, toUnitValue)
}
}
}

Comments are disabled for this gist.