client app: use actual buttons
diff --git a/core/client/cmd/pcloud/app_android.go b/core/client/cmd/pcloud/app_android.go
index c66b401..61737ee 100644
--- a/core/client/cmd/pcloud/app_android.go
+++ b/core/client/cmd/pcloud/app_android.go
@@ -3,7 +3,6 @@
 import (
 	"errors"
 	"fmt"
-	"time"
 	"unsafe"
 
 	"gioui.org/app"
@@ -84,16 +83,12 @@
 }
 
 func (a *androidApp) StartVPN(config []byte) error {
-	fmt.Println("2222222")
 	a.nebulaConfig = config
-	fmt.Println(string(a.nebulaConfig))
 	return jni.Do(a.jvm, func(env *jni.Env) error {
-		fmt.Println(123123)
 		cls := jni.GetObjectClass(env, a.activity)
 		m := jni.GetMethodID(env, cls, "startVpn", "(Ljava/lang/String;)Ljava/lang/String;")
 		jConfig := jni.JavaString(env, string(config))
 		_, err := jni.CallObjectMethod(env, a.activity, m, jni.Value(jConfig))
-		fmt.Println(123123123)
 		return err
 
 	})
@@ -144,14 +139,6 @@
 	if string(a.nebulaConfig) == "" {
 		return nil
 	}
-	fmt.Println(333333333)
-	fmt.Println(string(a.nebulaConfig))
-	// return nil
-	// if err := a.callVoidMethod(a.appCtx, "prepareVPN", "(Landroid/app/Activity;I)V",
-	// 	jni.Value(act), jni.Value(requestPrepareVPN)); err != nil {
-	// 	return nil
-	// }
-
 	config := nc.NewC(logrus.StandardLogger())
 	if err := config.LoadString(string(a.nebulaConfig)); err != nil {
 		return err
@@ -161,24 +148,13 @@
 	if err != nil {
 		panic(err)
 	}
-	t := time.Now()
-	fmt.Println("#########3")
-	fmt.Println(t.String())
-	fmt.Println(hostCert.Details.NotBefore.String())
-	fmt.Println(hostCert.Details.NotAfter.String())
-	fmt.Println(t.Before(hostCert.Details.NotBefore))
-	fmt.Println(t.After(hostCert.Details.NotAfter))
-	fmt.Println("#########3")
-	// return nil
 	return jni.Do(a.jvm, func(env *jni.Env) error {
-		fmt.Println("---------")
 		cls := jni.GetObjectClass(env, a.service)
 		m := jni.GetMethodID(env, cls, "newBuilder", "()Landroid/net/VpnService$Builder;")
 		b, err := jni.CallObjectMethod(env, a.service, m)
 		if err != nil {
 			return fmt.Errorf("PCloudVPNService.newBuilder: %v", err)
 		}
-		fmt.Println("---------")
 		bcls := jni.GetObjectClass(env, b)
 		addAddress := jni.GetMethodID(env, bcls, "addAddress", "(Ljava/lang/String;I)Landroid/net/VpnService$Builder;")
 		addRoute := jni.GetMethodID(env, bcls, "addRoute", "(Ljava/lang/String;I)Landroid/net/VpnService$Builder;")
@@ -229,7 +205,6 @@
 			return err
 		}
 		fd := int(tunFD)
-		fmt.Println("===========")
 		ctrl, err := nebula.Main(config, false, "pcloud", logrus.StandardLogger(), &fd)
 		if err != nil {
 			return err
diff --git a/core/client/cmd/pcloud/client.go b/core/client/cmd/pcloud/client.go
index b48db76..0d059ff 100644
--- a/core/client/cmd/pcloud/client.go
+++ b/core/client/cmd/pcloud/client.go
@@ -7,7 +7,6 @@
 	"encoding/base64"
 	"encoding/json"
 	"errors"
-	"fmt"
 	"io"
 	"net/http"
 
@@ -112,7 +111,6 @@
 		return nil, err
 	}
 	cfgYaml := cfgYamlB.Bytes()
-	fmt.Println(string(cfgYaml))
 	var cfgMap map[string]interface{}
 	if err := yaml.Unmarshal(cfgYaml, &cfgMap); err != nil {
 		return nil, err
@@ -133,6 +131,5 @@
 		return nil, nil, err
 	}
 	curve25519.ScalarBaseMult(&pubkey, &privkey)
-	fmt.Println()
 	return pubkey[:], privkey[:], nil
 }
diff --git a/core/client/cmd/pcloud/main.go b/core/client/cmd/pcloud/main.go
index 1e43fa5..fa013c9 100644
--- a/core/client/cmd/pcloud/main.go
+++ b/core/client/cmd/pcloud/main.go
@@ -10,10 +10,12 @@
 	"time"
 
 	"gioui.org/app"
+	"gioui.org/font/gofont"
 	"gioui.org/io/system"
 	"gioui.org/layout"
 	"gioui.org/op"
 	"gioui.org/unit"
+	"gioui.org/widget/material"
 	"github.com/skip2/go-qrcode"
 )
 
@@ -34,10 +36,11 @@
 }
 
 func newProcessor() *processor {
+	th := material.NewTheme(gofont.Collection())
 	return &processor{
 		vc:                NewDirectVPNClient(*vpnApiAddr),
 		app:               createApp(),
-		ui:                NewUI(),
+		ui:                NewUI(th),
 		inviteQrCh:        make(chan image.Image, 1),
 		inviteQrScannedCh: make(chan []byte, 1),
 		onConnectCh:       make(chan interface{}, 1),
@@ -95,17 +98,11 @@
 			p.ui.InviteQRGenerated(img)
 			w.Invalidate()
 		case code := <-p.inviteQrScannedCh:
-			// go func() {
-			fmt.Println("00000000")
 			p.JoinNetworkAndConnect(code)
-			fmt.Println("00000000")
-			// }()
 		case s := <-p.onConnectCh:
-			fmt.Println("--- 1111111111")
 			if err := p.app.Connect(s); err != nil {
-				panic(err)
+				return err
 			}
-			fmt.Println("--- 1111111111")
 		}
 	}
 	return nil
diff --git a/core/client/cmd/pcloud/ui.go b/core/client/cmd/pcloud/ui.go
index 50e74ff..6f805fa 100644
--- a/core/client/cmd/pcloud/ui.go
+++ b/core/client/cmd/pcloud/ui.go
@@ -9,6 +9,7 @@
 	"gioui.org/op/paint"
 	"gioui.org/unit"
 	"gioui.org/widget"
+	"gioui.org/widget/material"
 )
 
 type (
@@ -17,6 +18,7 @@
 )
 
 type UI struct {
+	th     *material.Theme
 	invite struct {
 		open widget.Clickable
 		show bool
@@ -30,8 +32,8 @@
 	}
 }
 
-func NewUI() *UI {
-	return &UI{}
+func NewUI(th *material.Theme) *UI {
+	return &UI{th: th}
 }
 
 func (ui *UI) InviteQRGenerated(img image.Image) {
@@ -96,15 +98,10 @@
 func (ui *UI) layoutActions(gtx C) D {
 	return layout.Flex{Axis: layout.Horizontal}.Layout(gtx,
 		layout.Flexed(1, func(gtx C) D {
-			return ui.invite.open.Layout(gtx, func(gtx C) D {
-				return ColorBox(gtx, gtx.Constraints.Min, color.NRGBA{R: 255, A: 255})
-			})
-
+			return material.Button(ui.th, &ui.invite.open, "Invite").Layout(gtx)
 		}),
 		layout.Flexed(1, func(gtx C) D {
-			return ui.join.open.Layout(gtx, func(gtx C) D {
-				return ColorBox(gtx, gtx.Constraints.Min, color.NRGBA{G: 128, A: 255})
-			})
+			return material.Button(ui.th, &ui.join.open, "Join").Layout(gtx)
 		}),
 	)
 }
diff --git a/core/client/go.mod b/core/client/go.mod
index 76a8d55..c14150b 100644
--- a/core/client/go.mod
+++ b/core/client/go.mod
@@ -9,6 +9,7 @@
 	github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e
 	github.com/slackhq/nebula v1.5.1
 	golang.org/x/crypto v0.0.0-20211202192323-5770296d904e
+	golang.org/x/exp v0.0.0-20210722180016-6781d3edade3
 	golang.org/x/tools v0.1.8-0.20211022200916-316ba0b74098 // indirect
 	sigs.k8s.io/yaml v1.1.0
 )