p4a-demo/homepage.py
import sys,time
from plyer import storagepath, vibrator,notification,flash,camera,gps,filechooser
from bottle import redirect
pos='No position yet'
filepath="no path"
try:
from android.permissions import request_permissions,check_permission, Permission
except ModuleNotFoundError:
print("We are not in adroid device")
myPermission=["android.permission.WRITE_EXTERNAL_STORAGE",
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.ACCESS_FINE_LOCATION",
"android.permission.INTERNET",
"android.permission.ACCESS_BACKGROUND_LOCATION",
"android.permission.VIBRATE",
"android.permission.POST_NOTIFICATIONS",
"android.permission.CAMERA",
"android.permission.FLASHLIGHT",
"android.hardware.camera.any",
"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"]
def header():
return '''<!DOCTYPE html >
<html lang="en">
<head>
<title>P4A Demo</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<script src="/html/js/jquery.min.js"></script>
<link rel="stylesheet" href="/html/css/bootstrap.min.css">
<link rel="stylesheet" href="/html/css/mystyle.css">
<script src="/html/js/bootstrap.bundle.min.js"></script>
<script src="/html/js/popper.min.js"></script>
<script src="/html/js/myscript.js"></script>
</head>
<body>
'''
def menu():
return '''<nav class="navbar navbar-expand-sm navbar-dark bg-dark" aria-label="P4A Demo">
<div class="container-fluid">
<a class="navbar-brand" href="#">P4A Demo</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarsExample03" aria-controls="navbarsExample03" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExample03">
<ul class="navbar-nav me-auto mb-2 mb-sm-0">
<li class="nav-item"><a class="nav-link active" aria-current="page" href="/">Home</a></li>
<li class="nav-item"><a class="nav-link active" href="/quit">Quit</a></li>
</ul>
</div>
</div>
</nav>
'''
def footer():
return '''</body></html>
'''
def quitApp():
sys.exit(0) #not close app webview
def page():
home = storagepath.get_home_dir()
application_dir=storagepath.get_application_dir()
primary_ext_storage = storagepath.get_external_storage_dir()
try:
secondary_ext_storage = storagepath.get_sdcard_dir()
except :
secondary_ext_storage =''
return '''
<div class="container-fluid">
<h1>Home Page</h1>
<p>This is a demo for P4a Project</p>
<pre>
home={home}
application_dir={application_dir}
primary_ext_storage ={primary_ext_storage}
secondary_ext_storage ={secondary_ext_storage}
</pre>
<pre id="out">Ready.</pre>
<div id="srv"></div>
<div><button class="btn btn-success" onclick="$('#out').load('/vibrate')">Vibrate</button></div>
<div><button class="btn btn-success" onclick="$('#out').load('/notify')">Notify</button></div>
<div><button class="btn btn-success" onclick="$('#out').load('/toast')">Toast</button></div>
<div><button class="btn btn-success" onclick="$('#out').load('/flashon')">Flash on</button></div>
<div><button class="btn btn-success" onclick="$('#out').load('/flashoff')">Flash off</button></div>
<div><button class="btn btn-success" onclick="$('#out').load('/position')">Get Position</button></div>
<div><button class="btn btn-success" onclick="$('#out').load('/stopposition')">Turn off position</button></div>
<div><button class="btn btn-success" onclick="$('#out').load('/selectfile')">Select a file</button></div>
</div>
'''.format(home=home,primary_ext_storage =primary_ext_storage,
application_dir=application_dir,
secondary_ext_storage =secondary_ext_storage)
def reqPermissions():
try:
request_permissions(myPermission,checkPerms)
except NameError:
print("request_permissions is not defined")
def checkPerms(perm,g):
permStatus=''
for i in range(0,len(myPermission)):
try:
if not check_permission(myPermission[i]):
permStatus=permStatus+"<li>Permission not granted: "+myPermission[i]+"</li>"
print(permStatus)
except:
print("Problem on check permissions")
return ''
return '<div class="container-fluid" ><ul>%s</ul></div>' % permStatus
def home():
reqPermissions()
yield header()
yield menu()
yield page()
yield footer()
def vibrate():
try:
vibrator.vibrate(1)
except NotImplementedError:
pass
except ModuleNotFoundError:
pass
return 'I should vibrate'
def notify():
title = 'Python for Android Demo'
message = 'This is an example.'
notification.notify(title=title, message=message)
def toast():
title = 'Python for Android Demo'
message = 'This is an example.'
notification.notify(title=title, message=message,toast=True)
def flashon():
flash.release()
flash.on()
def flashoff():
flash.off()
flash.release()
def getPositionCallback(**kwargs):
global pos
pos='lat: {lat}, lon: {lon}'.format(**kwargs)
print (pos)
def StopPosition():
try:
gps.stop()
except NotImplementedError:
pass
return "<script>loopShowPosition=false; showPosition();</script>"
def StartPosition():
try:
gps.configure(on_location=getPositionCallback)
gps.start()
except NotImplementedError:
pass
return "<script>loopShowPosition=true; showPosition(); </script>"
def showpos():
global pos
return pos
def handleFile(s):
global filepath
filepath="File selected: " + s[0]
print(filepath)
def getfile(): #bleah!
global filepath
return filepath
def selectfile():
filechooser.open_file(on_selection=handleFile)
redirect("/getfile")