Ensure our operating system is entirely up to date:
sudo apt-get update
sudo apt-get upgrade
eufy: | |
image: bropat/eufy-security-ws | |
container_name: eufy | |
restart: unless-stopped | |
environment: | |
- USERNAME=email | |
- PASSWORD=pass | |
- COUNTRY=country | |
ports: | |
- 3000:3000 |
version: "3" | |
services: | |
vpn: | |
image: qmcgaw/gluetun | |
container_name: vpn | |
cap_add: | |
- NET_ADMIN | |
ports: | |
- 8888:8888/tcp # HTTP proxy | |
- 8388:8388/tcp # Shadowsocks |
package example | |
import android.arch.lifecycle.ViewModel | |
import android.arch.lifecycle.ViewModelProvider | |
import dagger.Binds | |
import dagger.MapKey | |
import dagger.Module | |
import javax.inject.Inject | |
import javax.inject.Provider | |
import kotlin.reflect.KClass |
import android.databinding.ObservableList | |
import android.support.v7.widget.RecyclerView | |
/** | |
* Links an [ObservableList] to a [RecyclerView], so that whenever the list is changed, the view is | |
* updated. | |
*/ | |
class RecyclerViewAdapterOnListChangedCallback<T>( | |
private val adapter: RecyclerView.Adapter<*> | |
) : ObservableList.OnListChangedCallback<ObservableList<T>>() { |
package au.id.alexn; | |
import android.content.Context; | |
import android.util.AttributeSet; | |
import android.util.Log; | |
import android.view.MotionEvent; | |
import android.view.ScaleGestureDetector; | |
import android.view.View; | |
import android.widget.FrameLayout; |
import android.os.Handler; | |
import android.os.Looper; | |
/** | |
* A helper class that provides more ways to post a runnable than {@link android.os.Handler}. | |
* | |
* Created by Petros Douvantzis on 19/6/2015. | |
*/ | |
public class SynchronousHandler { |
package au.id.alexn; | |
import android.content.Context; | |
import android.util.AttributeSet; | |
import android.util.Log; | |
import android.view.MotionEvent; | |
import android.view.ScaleGestureDetector; | |
import android.view.View; | |
import android.widget.FrameLayout; |