From b38dd683cb0eb270575d01dfe61e0823cb44cc44 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Sat, 30 Apr 2016 04:56:20 +0530 Subject: [PATCH 01/18] sysinfo --- README.rst | 1 + examples/sysinfo/main.py | 71 ++++++++++++++++++++++++++++++++ plyer/__init__.py | 6 ++- plyer/facades/__init__.py | 5 ++- plyer/facades/sysinfo.py | 29 +++++++++++++ plyer/platforms/linux/sysinfo.py | 24 +++++++++++ plyer/platforms/win/sysinfo.py | 24 +++++++++++ 7 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 examples/sysinfo/main.py create mode 100644 plyer/facades/sysinfo.py create mode 100644 plyer/platforms/linux/sysinfo.py create mode 100644 plyer/platforms/win/sysinfo.py diff --git a/README.rst b/README.rst index 6dcfd437c..bca1aa887 100755 --- a/README.rst +++ b/README.rst @@ -29,6 +29,7 @@ Text to speech X X X X X Email (open mail client) X X X X X Vibrator X X Sms (send messages) X X +Sysinfo X X Compass X X Unique ID X X X X X Gyroscope X X diff --git a/examples/sysinfo/main.py b/examples/sysinfo/main.py new file mode 100644 index 000000000..dbbb83f30 --- /dev/null +++ b/examples/sysinfo/main.py @@ -0,0 +1,71 @@ +from kivy.app import App +from kivy.uix.boxlayout import BoxLayout +from kivy.lang import Builder +from plyer import sysinfo +from kivy.properties import StringProperty + + +Builder.load_string(''' +: + GridLayout: + cols: 2 + Label: + text: "Platform" + Label: + text: root.platform_ + Label: + text: "System" + Label: + text: root.system_ + Label: + text: "Processor" + Label: + text: root.processor_ + Label: + text: "Distribution" + Label: + text: root.dist_ + + +''') + + +class SysinfoInterface(BoxLayout): + + platform_ = StringProperty() + system_ = StringProperty() + processor_ = StringProperty() + dist_ = StringProperty() + + def __init__(self, **kwargs): + super(SysinfoInterface, self).__init__(**kwargs) + self.update() + + def update(self): + self.get_platform() + self.get_system() + self.get_processor() + self.get_dist() + + def get_platform(self): + self.platform_ = sysinfo.platform_info() + + def get_system(self): + self.system_ = sysinfo.system_info() + + def get_processor(self): + self.processor_ = sysinfo.processor_info() + + def get_dist(self): + temp = sysinfo.dist_info() + self.dist_ = "{} {} {}".format(temp[0], temp[1], temp[2]) + + +class SysinfoApp(App): + + def build(self): + return SysinfoInterface() + +if __name__ == "__main__": + app = SysinfoApp() + app.run() diff --git a/plyer/__init__.py b/plyer/__init__.py index d80346dcb..b8b84cfef 100644 --- a/plyer/__init__.py +++ b/plyer/__init__.py @@ -6,7 +6,8 @@ __all__ = ('accelerometer', 'audio', 'battery', 'call', 'camera', 'compass', 'email', 'filechooser', 'gps', 'gyroscope', 'irblaster', - 'orientation', 'notification', 'sms', 'tts', 'uniqueid', 'vibrator') + 'orientation', 'notification', 'sms', 'sysinfo', 'tts', 'uniqueid', + 'vibrator') __version__ = '1.2.5dev' @@ -56,6 +57,9 @@ #: Sms proxy to :class:`plyer.facades.Sms` sms = Proxy('sms', facades.Sms) +#: Sysinfo proxy to :class:`plyer.facades.Sysinfo` +sysinfo = Proxy('sysinfo', facades.Sysinfo) + #: TTS proxy to :class:`plyer.facades.TTS` tts = Proxy('tts', facades.TTS) diff --git a/plyer/facades/__init__.py b/plyer/facades/__init__.py index 5db8fe7ed..e60270fd1 100644 --- a/plyer/facades/__init__.py +++ b/plyer/facades/__init__.py @@ -8,8 +8,8 @@ __all__ = ('Accelerometer', 'Audio', 'Battery', 'Call', 'Camera', 'Compass', 'Email', 'FileChooser', 'GPS', 'Gyroscope', 'IrBlaster', - 'Orientation', 'Notification', 'Sms', 'TTS', 'UniqueID', 'Vibrator', - 'Flash') + 'Orientation', 'Notification', 'Sms', 'Sysinfo', 'TTS', 'UniqueID', + 'Vibrator', 'Flash') from plyer.facades.accelerometer import Accelerometer from plyer.facades.audio import Audio @@ -25,6 +25,7 @@ from plyer.facades.orientation import Orientation from plyer.facades.notification import Notification from plyer.facades.sms import Sms +from plyer.facades.sysinfo import Sysinfo from plyer.facades.tts import TTS from plyer.facades.uniqueid import UniqueID from plyer.facades.vibrator import Vibrator diff --git a/plyer/facades/sysinfo.py b/plyer/facades/sysinfo.py new file mode 100644 index 000000000..fa211346c --- /dev/null +++ b/plyer/facades/sysinfo.py @@ -0,0 +1,29 @@ +class Sysinfo(object): + ''' Sysinfo facade. + ''' + + def system_info(self): + return self._system_info() + + def platform_info(self): + return self._platform_info() + + def processor_info(self): + return self._processor_info() + + def dist_info(self): + return self._dist_info() + + # private + + def _system_info(self): + raise NotImplementedError() + + def _platform_info(self): + raise NotImplementedError() + + def _processor_info(self): + raise NotImplementedError() + + def _dist_info(self): + raise NotImplementedError() diff --git a/plyer/platforms/linux/sysinfo.py b/plyer/platforms/linux/sysinfo.py new file mode 100644 index 000000000..b8b824825 --- /dev/null +++ b/plyer/platforms/linux/sysinfo.py @@ -0,0 +1,24 @@ +import platform +from plyer.facades import Sysinfo + + +class LinuxSysinfo(Sysinfo): + + def _system_info(self): + return platform.system() + + def _platform_info(self): + return platform.platform() + + def _processor_info(self): + return platform.processor() + + def _dist_info(self): + if platform.system() == "Linux": + return platform.dist() + else: + raise NotImplementedError() + + +def instance(): + return LinuxSysinfo() \ No newline at end of file diff --git a/plyer/platforms/win/sysinfo.py b/plyer/platforms/win/sysinfo.py new file mode 100644 index 000000000..afbe721fa --- /dev/null +++ b/plyer/platforms/win/sysinfo.py @@ -0,0 +1,24 @@ +import platform +from plyer.facades import Sysinfo + + +class WindowsSysinfo(Sysinfo): + + def _system_info(self): + return platform.system() + + def _platform_info(self): + return platform.platform() + + def _processor_info(self): + return platform.processor() + + def _dist_info(self): + if platform.system() == "Windows": + return platform.win32_ver() + else: + raise NotImplementedError() + + +def instance(): + return WindowsSysinfo() \ No newline at end of file From 21151c810ab91b7013b28349e6186ab2f7ed37f0 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Sat, 30 Apr 2016 18:49:12 +0530 Subject: [PATCH 02/18] adding android --- examples/sysinfo/buildozer.spec | 173 +++++++++++++++++++++++++++++ examples/sysinfo/main.py | 14 +-- plyer/facades/sysinfo.py | 4 +- plyer/platforms/android/sysinfo.py | 31 ++++++ plyer/platforms/linux/sysinfo.py | 8 +- plyer/platforms/win/sysinfo.py | 9 +- 6 files changed, 219 insertions(+), 20 deletions(-) create mode 100644 examples/sysinfo/buildozer.spec create mode 100644 plyer/platforms/android/sysinfo.py diff --git a/examples/sysinfo/buildozer.spec b/examples/sysinfo/buildozer.spec new file mode 100644 index 000000000..d5db48c71 --- /dev/null +++ b/examples/sysinfo/buildozer.spec @@ -0,0 +1,173 @@ +[app] + +# (str) Title of your application +title = Plyer Sysinfo Example + +# (str) Package name +package.name = sysinfoexample + +# (str) Package domain (needed for android/ios packaging) +package.domain = org.test + +# (str) Source code where the main.py live +source.dir = . + +# (list) Source files to include (let empty to include all the files) +source.include_exts = py,png,jpg,kv,atlas + +# (list) Source files to exclude (let empty to not exclude anything) +#source.exclude_exts = spec + +# (list) List of directory to exclude (let empty to not exclude anything) +#source.exclude_dirs = tests, bin + +# (list) List of exclusions using pattern matching +#source.exclude_patterns = license,images/*/*.jpg + +# (str) Application versioning (method 1) +# version.regex = __version__ = '(.*)' +# version.filename = %(source.dir)s/main.py + +# (str) Application versioning (method 2) +version = 1.0 + +# (list) Application requirements +requirements = kivy, plyer + +# (str) Presplash of the application +#presplash.filename = %(source.dir)s/data/presplash.png + +# (str) Icon of the application +#icon.filename = %(source.dir)s/data/icon.png + +# (str) Supported orientation (one of landscape, portrait or all) +orientation = portrait + +# (bool) Indicate if the application should be fullscreen or not +fullscreen = 0 + + +# +# Android specific +# + +# (list) Permissions +#android.permissions = + +# (int) Android API to use +#android.api = 14 + +# (int) Minimum API required (8 = Android 2.2 devices) +#android.minapi = 8 + +# (int) Android SDK version to use +#android.sdk = 21 + +# (str) Android NDK version to use +#android.ndk = 9 + +# (bool) Use --private data storage (True) or --dir public storage (False) +#android.private_storage = True + +# (str) Android NDK directory (if empty, it will be automatically downloaded.) +#android.ndk_path = + +# (str) Android SDK directory (if empty, it will be automatically downloaded.) +#android.sdk_path = + +# (str) Android entry point, default is ok for Kivy-based app +#android.entrypoint = org.renpy.android.PythonActivity + +# (list) List of Java .jar files to add to the libs so that pyjnius can access +# their classes. Don't add jars that you do not need, since extra jars can slow +# down the build process. Allows wildcards matching, for example: +# OUYA-ODK/libs/*.jar +#android.add_jars = foo.jar,bar.jar,path/to/more/*.jar + +# (list) List of Java files to add to the android project (can be java or a +# directory containing the files) +#android.add_src = + +# (str) python-for-android branch to use, if not master, useful to try +# not yet merged features. +#android.branch = master + +# (str) OUYA Console category. Should be one of GAME or APP +# If you leave this blank, OUYA support will not be enabled +#android.ouya.category = GAME + +# (str) Filename of OUYA Console icon. It must be a 732x412 png image. +#android.ouya.icon.filename = %(source.dir)s/data/ouya_icon.png + +# (str) XML file to include as an intent filters in tag +#android.manifest.intent_filters = + +# (list) Android additionnal libraries to copy into libs/armeabi +#android.add_libs_armeabi = libs/android/*.so + +# (bool) Indicate whether the screen should stay on +# Don't forget to add the WAKE_LOCK permission if you set this to True +#android.wakelock = False + +# (list) Android application meta-data to set (key=value format) +#android.meta_data = + +# (list) Android library project to add (will be added in the +# project.properties automatically.) +#android.library_references = + +# +# iOS specific +# + +# (str) Name of the certificate to use for signing the debug version +# Get a list of available identities: buildozer ios list_identities +#ios.codesign.debug = "iPhone Developer: ()" + +# (str) Name of the certificate to use for signing the release version +#ios.codesign.release = %(ios.codesign.debug)s + + +[buildozer] + +# (int) Log level (0 = error only, 1 = info, 2 = debug (with command output)) +log_level = 2 + + +# ----------------------------------------------------------------------------- +# List as sections +# +# You can define all the "list" as [section:key]. +# Each line will be considered as a option to the list. +# Let's take [app] / source.exclude_patterns. +# Instead of doing: +# +# [app] +# source.exclude_patterns = license,data/audio/*.wav,data/images/original/* +# +# This can be translated into: +# +# [app:source.exclude_patterns] +# license +# data/audio/*.wav +# data/images/original/* +# + + +# ----------------------------------------------------------------------------- +# Profiles +# +# You can extend section / key with a profile +# For example, you want to deploy a demo version of your application without +# HD content. You could first change the title to add "(demo)" in the name +# and extend the excluded directories to remove the HD content. +# +# [app@demo] +# title = My Application (demo) +# +# [app:source.exclude_patterns@demo] +# images/hd/* +# +# Then, invoke the command line with the "demo" profile: +# +# buildozer --profile demo android debug diff --git a/examples/sysinfo/main.py b/examples/sysinfo/main.py index dbbb83f30..68788ade4 100644 --- a/examples/sysinfo/main.py +++ b/examples/sysinfo/main.py @@ -22,9 +22,9 @@ Label: text: root.processor_ Label: - text: "Distribution" + text: "Version" Label: - text: root.dist_ + text: root.version_ ''') @@ -35,7 +35,7 @@ class SysinfoInterface(BoxLayout): platform_ = StringProperty() system_ = StringProperty() processor_ = StringProperty() - dist_ = StringProperty() + version_ = StringProperty() def __init__(self, **kwargs): super(SysinfoInterface, self).__init__(**kwargs) @@ -45,7 +45,7 @@ def update(self): self.get_platform() self.get_system() self.get_processor() - self.get_dist() + self.get_version() def get_platform(self): self.platform_ = sysinfo.platform_info() @@ -56,9 +56,9 @@ def get_system(self): def get_processor(self): self.processor_ = sysinfo.processor_info() - def get_dist(self): - temp = sysinfo.dist_info() - self.dist_ = "{} {} {}".format(temp[0], temp[1], temp[2]) + def get_version(self): + temp = sysinfo.version_info() + self.version_ = "{} {} {}".format(temp[0], temp[1], temp[2]) class SysinfoApp(App): diff --git a/plyer/facades/sysinfo.py b/plyer/facades/sysinfo.py index fa211346c..a14ce71ef 100644 --- a/plyer/facades/sysinfo.py +++ b/plyer/facades/sysinfo.py @@ -11,7 +11,7 @@ def platform_info(self): def processor_info(self): return self._processor_info() - def dist_info(self): + def version_info(self): return self._dist_info() # private @@ -25,5 +25,5 @@ def _platform_info(self): def _processor_info(self): raise NotImplementedError() - def _dist_info(self): + def _version_info(self): raise NotImplementedError() diff --git a/plyer/platforms/android/sysinfo.py b/plyer/platforms/android/sysinfo.py new file mode 100644 index 000000000..73b1dc22c --- /dev/null +++ b/plyer/platforms/android/sysinfo.py @@ -0,0 +1,31 @@ +''' +Android Sysinfo +----------- +''' + +from jnius import autoclass +from plyer.facades import Sysinfo +from plyer.platforms.android import activity +import platform +Build = autoclass('android.os.Build') +Settings = autoclass('android.provider.Settings') +Intent = autoclass('android.content.Intent') +uri = autoclass('android.net.Uri') + + +class AndroidSysinfo(Call): + + def _system_info(self): + return platform.system() + + def _platform_info(self): + return platform.platform() + + def _processor_info(self): + return platform.processor() + + def _version_info(self): + return Build.VERSION.INCREMENTAL + +def instance(): + return AndroidSysinfo() \ No newline at end of file diff --git a/plyer/platforms/linux/sysinfo.py b/plyer/platforms/linux/sysinfo.py index b8b824825..66fe6262a 100644 --- a/plyer/platforms/linux/sysinfo.py +++ b/plyer/platforms/linux/sysinfo.py @@ -13,11 +13,9 @@ def _platform_info(self): def _processor_info(self): return platform.processor() - def _dist_info(self): - if platform.system() == "Linux": - return platform.dist() - else: - raise NotImplementedError() + def _version_info(self): + # includes Distro_name, version and name + return platform.dist() def instance(): diff --git a/plyer/platforms/win/sysinfo.py b/plyer/platforms/win/sysinfo.py index afbe721fa..caa5b10bf 100644 --- a/plyer/platforms/win/sysinfo.py +++ b/plyer/platforms/win/sysinfo.py @@ -13,12 +13,9 @@ def _platform_info(self): def _processor_info(self): return platform.processor() - def _dist_info(self): - if platform.system() == "Windows": - return platform.win32_ver() - else: - raise NotImplementedError() - + def _version_info(self): + # includes release, version and ptype. + return platform.win32_ver() def instance(): return WindowsSysinfo() \ No newline at end of file From 4b10a165c4fe586fe8472517e86cb8c5d9a26203 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Sun, 1 May 2016 00:24:52 +0530 Subject: [PATCH 03/18] update readme --- README.rst | 2 +- plyer/platforms/android/sysinfo.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index bca1aa887..6e5523d42 100755 --- a/README.rst +++ b/README.rst @@ -29,7 +29,7 @@ Text to speech X X X X X Email (open mail client) X X X X X Vibrator X X Sms (send messages) X X -Sysinfo X X +Sysinfo X X X Compass X X Unique ID X X X X X Gyroscope X X diff --git a/plyer/platforms/android/sysinfo.py b/plyer/platforms/android/sysinfo.py index 73b1dc22c..0b68a6d71 100644 --- a/plyer/platforms/android/sysinfo.py +++ b/plyer/platforms/android/sysinfo.py @@ -9,8 +9,6 @@ import platform Build = autoclass('android.os.Build') Settings = autoclass('android.provider.Settings') -Intent = autoclass('android.content.Intent') -uri = autoclass('android.net.Uri') class AndroidSysinfo(Call): @@ -25,6 +23,7 @@ def _processor_info(self): return platform.processor() def _version_info(self): + #not tested yet. just from docs. return Build.VERSION.INCREMENTAL def instance(): From 85ce93a950004e7b30bd2e6b7d364d57d744dbbb Mon Sep 17 00:00:00 2001 From: kiok46 Date: Sun, 1 May 2016 00:28:39 +0530 Subject: [PATCH 04/18] update android/sysinfo --- plyer/platforms/android/sysinfo.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plyer/platforms/android/sysinfo.py b/plyer/platforms/android/sysinfo.py index 0b68a6d71..62e173c29 100644 --- a/plyer/platforms/android/sysinfo.py +++ b/plyer/platforms/android/sysinfo.py @@ -6,7 +6,6 @@ from jnius import autoclass from plyer.facades import Sysinfo from plyer.platforms.android import activity -import platform Build = autoclass('android.os.Build') Settings = autoclass('android.provider.Settings') @@ -14,13 +13,13 @@ class AndroidSysinfo(Call): def _system_info(self): - return platform.system() + pass def _platform_info(self): - return platform.platform() + pass def _processor_info(self): - return platform.processor() + pass def _version_info(self): #not tested yet. just from docs. From 9920335efcc8b7702f3c9973be1a30e984d64a35 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Mon, 2 May 2016 20:51:58 +0530 Subject: [PATCH 05/18] new methods --- examples/sysinfo/main.py | 29 ++++++++++++++++++++++++++++- plyer/facades/sysinfo.py | 27 ++++++++++++++++++++++++++- plyer/platforms/android/sysinfo.py | 26 +++++++++++++++++++------- plyer/platforms/linux/sysinfo.py | 12 ++++++++++-- plyer/platforms/win/sysinfo.py | 13 +++++++++++-- 5 files changed, 94 insertions(+), 13 deletions(-) diff --git a/examples/sysinfo/main.py b/examples/sysinfo/main.py index 68788ade4..960bb726f 100644 --- a/examples/sysinfo/main.py +++ b/examples/sysinfo/main.py @@ -25,7 +25,18 @@ text: "Version" Label: text: root.version_ - + Label: + text: "Architecture" + Label: + text: root.architecture_ + Label: + text: "Device" + Label: + text: root.device_ + Label: + text: "Manufacturer" + Label: + text: root.manufacturer_ ''') @@ -36,6 +47,9 @@ class SysinfoInterface(BoxLayout): system_ = StringProperty() processor_ = StringProperty() version_ = StringProperty() + architecture_ = StringProperty() + device_ = StringProperty() + manufacturer_ = StringProperty() def __init__(self, **kwargs): super(SysinfoInterface, self).__init__(**kwargs) @@ -46,6 +60,9 @@ def update(self): self.get_system() self.get_processor() self.get_version() + self.get_architecture() + self.get_device_name() + self.get_manufacturer() def get_platform(self): self.platform_ = sysinfo.platform_info() @@ -60,6 +77,15 @@ def get_version(self): temp = sysinfo.version_info() self.version_ = "{} {} {}".format(temp[0], temp[1], temp[2]) + def get_architecture(self): + self.architecture_ = sysinfo.architecture_info() + + def get_device_name(self): + self.device_ = sysinfo.device_info() + + def get_manufacturer(self): + self.manufacturer_ = sysinfo.manufacturer_name() + class SysinfoApp(App): @@ -69,3 +95,4 @@ def build(self): if __name__ == "__main__": app = SysinfoApp() app.run() + diff --git a/plyer/facades/sysinfo.py b/plyer/facades/sysinfo.py index a14ce71ef..1b0a8e20f 100644 --- a/plyer/facades/sysinfo.py +++ b/plyer/facades/sysinfo.py @@ -3,16 +3,32 @@ class Sysinfo(object): ''' def system_info(self): + # returns the name of system. return self._system_info() def platform_info(self): + # returns platform name including version. return self._platform_info() def processor_info(self): + # returns the processor details return self._processor_info() def version_info(self): - return self._dist_info() + # returns release, version and ptype. + return self._version_info() + + def architecture_info(self): + # returns architecture of device. + return self.architecture_info() + + def device_name(self): + # returns name of the device. + return self._device_name() + + def manufacturer_name(self): + # returns the manufacturer's name + return self._manufacturer_name() # private @@ -27,3 +43,12 @@ def _processor_info(self): def _version_info(self): raise NotImplementedError() + + def _architecture_info(self): + raise NotImplementedError() + + def _device_name(self): + raise NotImplementedError() + + def _manufacturer_name(self): + raise NotImplementedError() diff --git a/plyer/platforms/android/sysinfo.py b/plyer/platforms/android/sysinfo.py index 62e173c29..76d5b87be 100644 --- a/plyer/platforms/android/sysinfo.py +++ b/plyer/platforms/android/sysinfo.py @@ -8,22 +8,34 @@ from plyer.platforms.android import activity Build = autoclass('android.os.Build') Settings = autoclass('android.provider.Settings') +Intent = autoclass('android.content.Intent') +uri = autoclass('android.net.Uri') +System = autoclass('java.lang.System') -class AndroidSysinfo(Call): +class AndroidSysinfo(Sysinfo): def _system_info(self): - pass + return Build.DISPLAY def _platform_info(self): - pass + return Build.DEVICE def _processor_info(self): - pass + return Build.CPU_ABI def _version_info(self): - #not tested yet. just from docs. - return Build.VERSION.INCREMENTAL + return Build.FINGERPRINT + + def _architecture_info(self): + return (Build.CPU_ABI, Build.CPU_ABI2) + + def _device_name(self): + return Build.MODEL + + def _manufacturer_name(self): + return Build.MANUFACTURER + def instance(): - return AndroidSysinfo() \ No newline at end of file + return AndroidSysinfo() diff --git a/plyer/platforms/linux/sysinfo.py b/plyer/platforms/linux/sysinfo.py index 66fe6262a..383f1e87e 100644 --- a/plyer/platforms/linux/sysinfo.py +++ b/plyer/platforms/linux/sysinfo.py @@ -14,9 +14,17 @@ def _processor_info(self): return platform.processor() def _version_info(self): - # includes Distro_name, version and name return platform.dist() + def _architecture_info(self): + return platform.architecture() + + def _device_name(self): + return platform.uname()[1] + + def _manufacturer_name(self): + pass + def instance(): - return LinuxSysinfo() \ No newline at end of file + return LinuxSysinfo() diff --git a/plyer/platforms/win/sysinfo.py b/plyer/platforms/win/sysinfo.py index caa5b10bf..85474ff55 100644 --- a/plyer/platforms/win/sysinfo.py +++ b/plyer/platforms/win/sysinfo.py @@ -14,8 +14,17 @@ def _processor_info(self): return platform.processor() def _version_info(self): - # includes release, version and ptype. return platform.win32_ver() + def _architecture_info(self): + return platform.architecture() + + def _device_name(self): + return platform.uname()[1] + + def _manufacturer_name(self): + pass + + def instance(): - return WindowsSysinfo() \ No newline at end of file + return WindowsSysinfo() From e5ee628bec0a4a8d562080a4ed160c238310fa04 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Tue, 3 May 2016 08:31:01 +0530 Subject: [PATCH 06/18] add macosx --- plyer/facades/sysinfo.py | 9 ++++- plyer/platforms/android/sysinfo.py | 60 +++++++++++++++++++++++++++++- plyer/platforms/linux/sysinfo.py | 3 ++ plyer/platforms/macosx/sysinfo.py | 33 ++++++++++++++++ plyer/platforms/win/sysinfo.py | 3 ++ 5 files changed, 105 insertions(+), 3 deletions(-) create mode 100644 plyer/platforms/macosx/sysinfo.py diff --git a/plyer/facades/sysinfo.py b/plyer/facades/sysinfo.py index 1b0a8e20f..2653584c1 100644 --- a/plyer/facades/sysinfo.py +++ b/plyer/facades/sysinfo.py @@ -20,7 +20,7 @@ def version_info(self): def architecture_info(self): # returns architecture of device. - return self.architecture_info() + return self._architecture_info() def device_name(self): # returns name of the device. @@ -30,6 +30,10 @@ def manufacturer_name(self): # returns the manufacturer's name return self._manufacturer_name() + def kernel_version(self): + # returns the kernel name. + return self._kernel_version() + # private def _system_info(self): @@ -52,3 +56,6 @@ def _device_name(self): def _manufacturer_name(self): raise NotImplementedError() + + def _kernel_version(self): + raise NotImplementedError() diff --git a/plyer/platforms/android/sysinfo.py b/plyer/platforms/android/sysinfo.py index 76d5b87be..a248efab3 100644 --- a/plyer/platforms/android/sysinfo.py +++ b/plyer/platforms/android/sysinfo.py @@ -6,7 +6,10 @@ from jnius import autoclass from plyer.facades import Sysinfo from plyer.platforms.android import activity +from android import api_version, version_codes Build = autoclass('android.os.Build') +BuildVersion = autoclass('android.os.Build$VERSION') +BuildVersionCodes = autoclass('android.os.Build$VERSION_CODES') Settings = autoclass('android.provider.Settings') Intent = autoclass('android.content.Intent') uri = autoclass('android.net.Uri') @@ -16,7 +19,7 @@ class AndroidSysinfo(Sysinfo): def _system_info(self): - return Build.DISPLAY + return BuildVersion.BASE_OS def _platform_info(self): return Build.DEVICE @@ -25,7 +28,57 @@ def _processor_info(self): return Build.CPU_ABI def _version_info(self): - return Build.FINGERPRINT + version = str(BuildVersion.RELEASE) + if version >= 1.0 and version < 1.1: + return ("Android", version, "BASE") + elif version == 1.1: + return ("Android", version, "BASE_1_1") + elif version == 1.5: + return ("Android", version, "CUPCAKE") + elif version == 1.6: + return ("Android", version, "DONUT") + elif version >= 2.0 and version < 2.0.1: + return ("Android", version, "ECLAIR") + elif version >= 2.0.1 and version < 2.1: + return ("Android", version, "ECLAIR_0_1") + elif version == 2.1: + return ("Android", version, "ECLAIR_MR1") + elif version >= 2.2 and version <= 2.2.3: + return ("Android", version, "FROYO") + elif version >= 2.3 and version < 2.3.3: + return ("Android", version, "GINGERBREAD") + elif version >= 2.3.3 and version <= 2.3.7: + return ("Android", version, "GINGERBREAD_MR1") + elif version >= 3.0 and version < 3.1: + return ("Android", version, "HONEYCOMB") + elif version >= 3.1 and version < 3.2: + return ("Android", version, "HONEYCOMB_MR1") + elif version >= 3.2 and version <= 3.2.6: + return ("Android", version, "HONEYCOMB_MR2") + elif version >= 4.0 and version < 4.0.3: + return ("Android", version, "ICE_CREAM_SANDWICH") + elif version >= 4.0.3 and version <= 4.0.4: + return ("Android", version, "ICE_CREAM_SANDWICH_MR1") + elif version >= 4.1 and version < 4.2: + return ("Android", version, "JELLY_BEAN") + elif version >= 4.2 and version < 4.3: + return ("Android", version, "JELLY_BEAN_MR1") + elif version >= 4.3.0 and version <= 4.3.1: + return ("Android", version, "JELLY_BEAN_MR2") + elif version >= 4.4 and version < 4.4.1: + return ("Android", version, "KITKAT") + elif version >= 4.4.1 and version < 4.4.2: + return ("Android", version, "KITKAT_MR1") + elif version >= 4.4.2 and version <= 4.4.4: + return ("Android", version, "KITKAT_MR2") + elif version >= 5.0 and version < 5.1: + return ("Android", version, "LOLLIPOP") + elif version >= 5.1 and version <= 5.1.1: + return ("Android", version, "LOLLIPOP_MR1") + elif version == 6.0: + return ("Android", version, "MARSHMALLOW") + else: + return ("Android", 0.0, "Unknown version") def _architecture_info(self): return (Build.CPU_ABI, Build.CPU_ABI2) @@ -36,6 +89,9 @@ def _device_name(self): def _manufacturer_name(self): return Build.MANUFACTURER + def _kernel_version(self): + System.getProperty("os.version") + def instance(): return AndroidSysinfo() diff --git a/plyer/platforms/linux/sysinfo.py b/plyer/platforms/linux/sysinfo.py index 383f1e87e..ba36b6618 100644 --- a/plyer/platforms/linux/sysinfo.py +++ b/plyer/platforms/linux/sysinfo.py @@ -25,6 +25,9 @@ def _device_name(self): def _manufacturer_name(self): pass + def _kernel_version(self): + pass + def instance(): return LinuxSysinfo() diff --git a/plyer/platforms/macosx/sysinfo.py b/plyer/platforms/macosx/sysinfo.py new file mode 100644 index 000000000..512394fcc --- /dev/null +++ b/plyer/platforms/macosx/sysinfo.py @@ -0,0 +1,33 @@ +import platform +from plyer.facades import Sysinfo + + +class OSXSysinfo(Sysinfo): + + def _system_info(self): + return platform.system() + + def _platform_info(self): + return platform.platform() + + def _processor_info(self): + return platform.processor() + + def _version_info(self): + return platform.mac_ver() + + def _architecture_info(self): + return platform.architecture() + + def _device_name(self): + return platform.uname()[1] + + def _manufacturer_name(self): + pass + + def _kernel_version(self): + pass + + +def instance(): + return OSXSysinfo() diff --git a/plyer/platforms/win/sysinfo.py b/plyer/platforms/win/sysinfo.py index 85474ff55..c2b20ead5 100644 --- a/plyer/platforms/win/sysinfo.py +++ b/plyer/platforms/win/sysinfo.py @@ -25,6 +25,9 @@ def _device_name(self): def _manufacturer_name(self): pass + def _kernel_version(self): + pass + def instance(): return WindowsSysinfo() From f4f0b9fd2b17b07f08e688ef131e69da7cb73ae8 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Tue, 3 May 2016 08:38:53 +0530 Subject: [PATCH 07/18] update readme --- README.rst | 2 +- examples/sysinfo/main.py | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 6e5523d42..d5cef73a2 100755 --- a/README.rst +++ b/README.rst @@ -29,7 +29,7 @@ Text to speech X X X X X Email (open mail client) X X X X X Vibrator X X Sms (send messages) X X -Sysinfo X X X +Sysinfo X X X X Compass X X Unique ID X X X X X Gyroscope X X diff --git a/examples/sysinfo/main.py b/examples/sysinfo/main.py index 960bb726f..e87ac41ba 100644 --- a/examples/sysinfo/main.py +++ b/examples/sysinfo/main.py @@ -37,6 +37,10 @@ text: "Manufacturer" Label: text: root.manufacturer_ + Label: + text: "Kernel" + Label: + text: root.kernel_ ''') @@ -50,6 +54,7 @@ class SysinfoInterface(BoxLayout): architecture_ = StringProperty() device_ = StringProperty() manufacturer_ = StringProperty() + kernel_ = StringProperty() def __init__(self, **kwargs): super(SysinfoInterface, self).__init__(**kwargs) @@ -63,6 +68,7 @@ def update(self): self.get_architecture() self.get_device_name() self.get_manufacturer() + self.get_kernel_version() def get_platform(self): self.platform_ = sysinfo.platform_info() @@ -86,6 +92,9 @@ def get_device_name(self): def get_manufacturer(self): self.manufacturer_ = sysinfo.manufacturer_name() + def get_kernel_version(self): + self.kernel_ = sysinfo.kernel_version() + class SysinfoApp(App): @@ -95,4 +104,3 @@ def build(self): if __name__ == "__main__": app = SysinfoApp() app.run() - From 954f5802c9283743e2798fcc345ecf3f12319d74 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Sun, 8 May 2016 01:37:58 +0530 Subject: [PATCH 08/18] new methods --- plyer/facades/sysinfo.py | 21 +++++++++++++++++++++ plyer/platforms/android/sysinfo.py | 9 +++++++++ plyer/platforms/linux/sysinfo.py | 9 +++++++++ plyer/platforms/macosx/sysinfo.py | 9 +++++++++ plyer/platforms/win/sysinfo.py | 9 +++++++++ 5 files changed, 57 insertions(+) diff --git a/plyer/facades/sysinfo.py b/plyer/facades/sysinfo.py index 2653584c1..5adf99907 100644 --- a/plyer/facades/sysinfo.py +++ b/plyer/facades/sysinfo.py @@ -2,6 +2,10 @@ class Sysinfo(object): ''' Sysinfo facade. ''' + def model_info(self): + # returns the model name. + return self._model_info() + def system_info(self): # returns the name of system. return self._system_info() @@ -34,8 +38,19 @@ def kernel_version(self): # returns the kernel name. return self._kernel_version() + def storage_info(self): + # returns the storage capacity o fthe system. + return self._storage_info() + + def screen_dimension(self): + # returns the screen dimensiotn like 1200x980. + return self._screen_dimension() + # private + def _model_info(self): + raise NotImplementedError() + def _system_info(self): raise NotImplementedError() @@ -59,3 +74,9 @@ def _manufacturer_name(self): def _kernel_version(self): raise NotImplementedError() + + def _storage_info(self): + raise NotImplementedError() + + def _screen_dimension(self): + raise NotImplementedError() diff --git a/plyer/platforms/android/sysinfo.py b/plyer/platforms/android/sysinfo.py index a248efab3..4e8dabaf7 100644 --- a/plyer/platforms/android/sysinfo.py +++ b/plyer/platforms/android/sysinfo.py @@ -18,6 +18,9 @@ class AndroidSysinfo(Sysinfo): + def _model_info(self): + pass + def _system_info(self): return BuildVersion.BASE_OS @@ -92,6 +95,12 @@ def _manufacturer_name(self): def _kernel_version(self): System.getProperty("os.version") + def _storage_info(self): + pass + + def _screen_dimension(self): + pass + def instance(): return AndroidSysinfo() diff --git a/plyer/platforms/linux/sysinfo.py b/plyer/platforms/linux/sysinfo.py index ba36b6618..7efda9875 100644 --- a/plyer/platforms/linux/sysinfo.py +++ b/plyer/platforms/linux/sysinfo.py @@ -4,6 +4,9 @@ class LinuxSysinfo(Sysinfo): + def _model_info(self): + pass + def _system_info(self): return platform.system() @@ -28,6 +31,12 @@ def _manufacturer_name(self): def _kernel_version(self): pass + def _storage_info(self): + pass + + def _screen_dimension(self): + pass + def instance(): return LinuxSysinfo() diff --git a/plyer/platforms/macosx/sysinfo.py b/plyer/platforms/macosx/sysinfo.py index 512394fcc..8f8c8693a 100644 --- a/plyer/platforms/macosx/sysinfo.py +++ b/plyer/platforms/macosx/sysinfo.py @@ -4,6 +4,9 @@ class OSXSysinfo(Sysinfo): + def _model_info(self): + pass + def _system_info(self): return platform.system() @@ -28,6 +31,12 @@ def _manufacturer_name(self): def _kernel_version(self): pass + def _storage_info(self): + pass + + def _screen_dimension(self): + pass + def instance(): return OSXSysinfo() diff --git a/plyer/platforms/win/sysinfo.py b/plyer/platforms/win/sysinfo.py index c2b20ead5..d8bb2ca6d 100644 --- a/plyer/platforms/win/sysinfo.py +++ b/plyer/platforms/win/sysinfo.py @@ -4,6 +4,9 @@ class WindowsSysinfo(Sysinfo): + def _model_info(self): + pass + def _system_info(self): return platform.system() @@ -28,6 +31,12 @@ def _manufacturer_name(self): def _kernel_version(self): pass + def _storage_info(self): + pass + + def _screen_dimension(self): + pass + def instance(): return WindowsSysinfo() From 49095e2db5dd47a370b17274878b75789e4e8f2d Mon Sep 17 00:00:00 2001 From: kiok46 Date: Wed, 11 May 2016 04:40:18 +0530 Subject: [PATCH 09/18] complete linux --- examples/sysinfo/main.py | 38 ++++++++++++++++++++++++++---- plyer/facades/sysinfo.py | 14 +++++------ plyer/platforms/android/sysinfo.py | 12 +++++----- plyer/platforms/linux/sysinfo.py | 36 ++++++++++++++++++++++------ plyer/platforms/macosx/sysinfo.py | 14 +++++------ plyer/platforms/win/sysinfo.py | 2 +- 6 files changed, 83 insertions(+), 33 deletions(-) diff --git a/examples/sysinfo/main.py b/examples/sysinfo/main.py index e87ac41ba..675dfcc1b 100644 --- a/examples/sysinfo/main.py +++ b/examples/sysinfo/main.py @@ -9,6 +9,10 @@ : GridLayout: cols: 2 + Label: + text: "Model" + Label: + text: root.model_ Label: text: "Platform" Label: @@ -41,12 +45,21 @@ text: "Kernel" Label: text: root.kernel_ + Label: + text: "Storage" + Label: + text: root.storage_ + Label: + text: "Screen" + Label: + text: root.screen_ ''') class SysinfoInterface(BoxLayout): + model_ = StringProperty() platform_ = StringProperty() system_ = StringProperty() processor_ = StringProperty() @@ -55,20 +68,29 @@ class SysinfoInterface(BoxLayout): device_ = StringProperty() manufacturer_ = StringProperty() kernel_ = StringProperty() + storage_ = StringProperty() + screen_ = StringProperty() + password = "qwerty" def __init__(self, **kwargs): super(SysinfoInterface, self).__init__(**kwargs) self.update() def update(self): + self.get_model(self.password) self.get_platform() self.get_system() self.get_processor() self.get_version() self.get_architecture() self.get_device_name() - self.get_manufacturer() + self.get_manufacturer(self.password) self.get_kernel_version() + self.get_storage_info() + self.get_screen_dimension() + + def get_model(self, password): + self.model_ = sysinfo.model_info(password) def get_platform(self): self.platform_ = sysinfo.platform_info() @@ -84,17 +106,23 @@ def get_version(self): self.version_ = "{} {} {}".format(temp[0], temp[1], temp[2]) def get_architecture(self): - self.architecture_ = sysinfo.architecture_info() + self.architecture_ = str(sysinfo.architecture_info()) def get_device_name(self): - self.device_ = sysinfo.device_info() + self.device_ = sysinfo.device_name() - def get_manufacturer(self): - self.manufacturer_ = sysinfo.manufacturer_name() + def get_manufacturer(self, password): + self.manufacturer_ = sysinfo.manufacturer_name(password) def get_kernel_version(self): self.kernel_ = sysinfo.kernel_version() + def get_storage_info(self): + self.storage_ = sysinfo.storage_info() + + def get_screen_dimension(self): + self.screen_ = sysinfo.screen_dimension() + class SysinfoApp(App): diff --git a/plyer/facades/sysinfo.py b/plyer/facades/sysinfo.py index 5adf99907..e6320b13f 100644 --- a/plyer/facades/sysinfo.py +++ b/plyer/facades/sysinfo.py @@ -2,9 +2,9 @@ class Sysinfo(object): ''' Sysinfo facade. ''' - def model_info(self): + def model_info(self, password): # returns the model name. - return self._model_info() + return self._model_info(password=password) def system_info(self): # returns the name of system. @@ -30,9 +30,9 @@ def device_name(self): # returns name of the device. return self._device_name() - def manufacturer_name(self): + def manufacturer_name(self, password): # returns the manufacturer's name - return self._manufacturer_name() + return self._manufacturer_name(password=password) def kernel_version(self): # returns the kernel name. @@ -43,12 +43,12 @@ def storage_info(self): return self._storage_info() def screen_dimension(self): - # returns the screen dimensiotn like 1200x980. + # returns the screen's dimension like 1200x980. return self._screen_dimension() # private - def _model_info(self): + def _model_info(self, **kwargs): raise NotImplementedError() def _system_info(self): @@ -69,7 +69,7 @@ def _architecture_info(self): def _device_name(self): raise NotImplementedError() - def _manufacturer_name(self): + def _manufacturer_name(self, **kwargs): raise NotImplementedError() def _kernel_version(self): diff --git a/plyer/platforms/android/sysinfo.py b/plyer/platforms/android/sysinfo.py index 4e8dabaf7..e1661e822 100644 --- a/plyer/platforms/android/sysinfo.py +++ b/plyer/platforms/android/sysinfo.py @@ -18,8 +18,8 @@ class AndroidSysinfo(Sysinfo): - def _model_info(self): - pass + def _model_info(self, **kwargs): + return "" def _system_info(self): return BuildVersion.BASE_OS @@ -89,17 +89,17 @@ def _architecture_info(self): def _device_name(self): return Build.MODEL - def _manufacturer_name(self): + def _manufacturer_name(self, **kwargs): return Build.MANUFACTURER def _kernel_version(self): - System.getProperty("os.version") + return System.getProperty("os.version") def _storage_info(self): - pass + return "" def _screen_dimension(self): - pass + return "" def instance(): diff --git a/plyer/platforms/linux/sysinfo.py b/plyer/platforms/linux/sysinfo.py index 7efda9875..a0d590c01 100644 --- a/plyer/platforms/linux/sysinfo.py +++ b/plyer/platforms/linux/sysinfo.py @@ -1,11 +1,18 @@ import platform +import subprocess +from subprocess import Popen, PIPE from plyer.facades import Sysinfo class LinuxSysinfo(Sysinfo): - def _model_info(self): - pass + def _model_info(self, **kwargs): + password = kwargs.get('password') + command = 'dmidecode -s baseboard-product-name'.split() + p = Popen(['sudo', '-S'] + command, stdin=PIPE, stderr=PIPE, + stdout=PIPE, universal_newlines=True) + sp = p.communicate(password + '\n')[0] + return sp def _system_info(self): return platform.system() @@ -25,17 +32,32 @@ def _architecture_info(self): def _device_name(self): return platform.uname()[1] - def _manufacturer_name(self): - pass + def _manufacturer_name(self, **kwargs): + + password = kwargs.get('password') + command = 'dmidecode -s system-manufacturer'.split() + p = Popen(['sudo', '-S'] + command, stdin=PIPE, stderr=PIPE, + stdout=PIPE, universal_newlines=True) + sp = p.communicate(password + '\n')[0] + return sp def _kernel_version(self): - pass + return platform.uname()[2] def _storage_info(self): - pass + meminfo = {} + + with open('/proc/meminfo') as f: + for line in f: + meminfo[line.split(':')[0]] = line.split(':')[1].strip() + return str(meminfo['MemTotal']) def _screen_dimension(self): - pass + sd = Popen('xrandr | grep "\*" | cut -d" " -f4', + shell=True, + stdout=PIPE).communicate()[0] + + return sd def instance(): diff --git a/plyer/platforms/macosx/sysinfo.py b/plyer/platforms/macosx/sysinfo.py index 8f8c8693a..dd68c6637 100644 --- a/plyer/platforms/macosx/sysinfo.py +++ b/plyer/platforms/macosx/sysinfo.py @@ -4,8 +4,8 @@ class OSXSysinfo(Sysinfo): - def _model_info(self): - pass + def _model_info(self, **kwargs): + return "" def _system_info(self): return platform.system() @@ -25,17 +25,17 @@ def _architecture_info(self): def _device_name(self): return platform.uname()[1] - def _manufacturer_name(self): - pass + def _manufacturer_name(self, **kwargs): + return "" def _kernel_version(self): - pass + return platform.uname()[2] def _storage_info(self): - pass + return "" def _screen_dimension(self): - pass + return "" def instance(): diff --git a/plyer/platforms/win/sysinfo.py b/plyer/platforms/win/sysinfo.py index d8bb2ca6d..3efc8a5a5 100644 --- a/plyer/platforms/win/sysinfo.py +++ b/plyer/platforms/win/sysinfo.py @@ -25,7 +25,7 @@ def _architecture_info(self): def _device_name(self): return platform.uname()[1] - def _manufacturer_name(self): + def _manufacturer_name(self, password): pass def _kernel_version(self): From 5e3081d7eb4946f234fc185204c12e2c49da1e10 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Wed, 11 May 2016 07:18:44 +0530 Subject: [PATCH 10/18] complete windows --- examples/sysinfo/main.py | 6 ++-- plyer/platforms/linux/sysinfo.py | 4 ++- plyer/platforms/win/libs/screenmetric.py | 10 +++++++ plyer/platforms/win/libs/win_api_defs.py | 11 ++++++-- plyer/platforms/win/sysinfo.py | 36 +++++++++++++++++++----- 5 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 plyer/platforms/win/libs/screenmetric.py diff --git a/examples/sysinfo/main.py b/examples/sysinfo/main.py index 675dfcc1b..fecdcc222 100644 --- a/examples/sysinfo/main.py +++ b/examples/sysinfo/main.py @@ -2,7 +2,7 @@ from kivy.uix.boxlayout import BoxLayout from kivy.lang import Builder from plyer import sysinfo -from kivy.properties import StringProperty +from kivy.properties import StringProperty, ListProperty Builder.load_string(''' @@ -52,7 +52,7 @@ Label: text: "Screen" Label: - text: root.screen_ + text: str(root.screen_) ''') @@ -69,7 +69,7 @@ class SysinfoInterface(BoxLayout): manufacturer_ = StringProperty() kernel_ = StringProperty() storage_ = StringProperty() - screen_ = StringProperty() + screen_ = ListProperty() password = "qwerty" def __init__(self, **kwargs): diff --git a/plyer/platforms/linux/sysinfo.py b/plyer/platforms/linux/sysinfo.py index a0d590c01..eb4f0b59e 100644 --- a/plyer/platforms/linux/sysinfo.py +++ b/plyer/platforms/linux/sysinfo.py @@ -57,7 +57,9 @@ def _screen_dimension(self): shell=True, stdout=PIPE).communicate()[0] - return sd + a = sd.split('x')[0] + b = sd.split('x')[1].split('\n')[0] + return (int(a), int(b)) def instance(): diff --git a/plyer/platforms/win/libs/screenmetric.py b/plyer/platforms/win/libs/screenmetric.py new file mode 100644 index 000000000..0007b5d5c --- /dev/null +++ b/plyer/platforms/win/libs/screenmetric.py @@ -0,0 +1,10 @@ +__all__ = ('get_SystemMetrics') + + +import ctypes +from plyer.platforms.win.libs import win_api_defs + + +def get_SystemMetrics(val): + mat = win_api_defs.GetSystemMetrics(val) + return mat diff --git a/plyer/platforms/win/libs/win_api_defs.py b/plyer/platforms/win/libs/win_api_defs.py index 7aed430a8..43597aa2d 100644 --- a/plyer/platforms/win/libs/win_api_defs.py +++ b/plyer/platforms/win/libs/win_api_defs.py @@ -6,13 +6,14 @@ 'DefWindowProcW', 'get_WNDCLASSEXW', 'GetModuleHandleW', 'RegisterClassExW', 'UpdateWindow', 'LoadImageW', 'Shell_NotifyIconW', 'DestroyIcon', 'UnregisterClassW', - 'DestroyWindow', 'LoadIconW') + 'DestroyWindow', 'LoadIconW', 'GetSystemMetrics') import ctypes from ctypes import Structure, windll, sizeof, POINTER, WINFUNCTYPE from ctypes.wintypes import (DWORD, HICON, HWND, UINT, WCHAR, WORD, BYTE, - LPCWSTR, INT, LPVOID, HINSTANCE, HMENU, LPARAM, WPARAM, - HBRUSH, HMODULE, ATOM, BOOL, HANDLE) + LPCWSTR, INT, LPVOID, HINSTANCE, HMENU, + LPARAM, WPARAM, HBRUSH, HMODULE, ATOM, + BOOL, HANDLE) LRESULT = LPARAM HRESULT = HANDLE HCURSOR = HICON @@ -43,6 +44,10 @@ def get_DLLVERSIONINFO(*largs): return version_info +def GetSystemMetrics(*largs): + return windll.User32.GetSystemMetrics(largs[0]) + + def MAKEDLLVERULL(major, minor, build, sp): return (major << 48) | (minor << 32) | (build << 16) | sp diff --git a/plyer/platforms/win/sysinfo.py b/plyer/platforms/win/sysinfo.py index 3efc8a5a5..99ea1b3b9 100644 --- a/plyer/platforms/win/sysinfo.py +++ b/plyer/platforms/win/sysinfo.py @@ -1,11 +1,32 @@ import platform +import os +import re +from subprocess import Popen, PIPE from plyer.facades import Sysinfo +from plyer.platforms.win.libs import screenmetric class WindowsSysinfo(Sysinfo): - def _model_info(self): - pass + values = {} + + def __init__(self, **kwargs): + self.SysInfo() + + def SysInfo(self): + + cache = os.popen2("SYSTEMINFO") + source = cache[1].read() + sysOpts = ["System Manufacturer", "System Model", + "Total Physical Memory"] + + for opt in sysOpts: + self.values[opt] = [item.strip() for item in + re.findall("%s:\w*(.*?)\n" % (opt), + source, re.IGNORECASE)][0] + + def _model_info(self, **kwargs): + return self.values['System Model'] def _system_info(self): return platform.system() @@ -25,17 +46,18 @@ def _architecture_info(self): def _device_name(self): return platform.uname()[1] - def _manufacturer_name(self, password): - pass + def _manufacturer_name(self, **kwargs): + return self.values['System Manufacturer'] def _kernel_version(self): - pass + return platform.uname()[2] def _storage_info(self): - pass + return self.values['Total Physical Memory'] def _screen_dimension(self): - pass + return (screenmetric.get_SystemMetrics(0), + screenmetric.get_SystemMetrics(1)) def instance(): From 06f79a2211444cb408559ee33ca03496b5deea64 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Fri, 13 May 2016 11:04:22 +0530 Subject: [PATCH 11/18] remove sudo && remove screenmetric.py --- examples/sysinfo/main.py | 12 +++++------ plyer/facades/sysinfo.py | 8 ++++---- plyer/platforms/android/sysinfo.py | 4 ++-- plyer/platforms/linux/sysinfo.py | 21 ++++++++----------- plyer/platforms/macosx/sysinfo.py | 4 ++-- plyer/platforms/win/libs/screenmetric.py | 10 --------- plyer/platforms/win/sysinfo.py | 26 ++++++++++++++---------- 7 files changed, 37 insertions(+), 48 deletions(-) delete mode 100644 plyer/platforms/win/libs/screenmetric.py diff --git a/examples/sysinfo/main.py b/examples/sysinfo/main.py index fecdcc222..8814f837a 100644 --- a/examples/sysinfo/main.py +++ b/examples/sysinfo/main.py @@ -77,20 +77,20 @@ def __init__(self, **kwargs): self.update() def update(self): - self.get_model(self.password) + self.get_model() self.get_platform() self.get_system() self.get_processor() self.get_version() self.get_architecture() self.get_device_name() - self.get_manufacturer(self.password) + self.get_manufacturer() self.get_kernel_version() self.get_storage_info() self.get_screen_dimension() - def get_model(self, password): - self.model_ = sysinfo.model_info(password) + def get_model(self): + self.model_ = sysinfo.model_info() def get_platform(self): self.platform_ = sysinfo.platform_info() @@ -111,8 +111,8 @@ def get_architecture(self): def get_device_name(self): self.device_ = sysinfo.device_name() - def get_manufacturer(self, password): - self.manufacturer_ = sysinfo.manufacturer_name(password) + def get_manufacturer(self): + self.manufacturer_ = sysinfo.manufacturer_name() def get_kernel_version(self): self.kernel_ = sysinfo.kernel_version() diff --git a/plyer/facades/sysinfo.py b/plyer/facades/sysinfo.py index e6320b13f..e946a30ab 100644 --- a/plyer/facades/sysinfo.py +++ b/plyer/facades/sysinfo.py @@ -2,9 +2,9 @@ class Sysinfo(object): ''' Sysinfo facade. ''' - def model_info(self, password): + def model_info(self): # returns the model name. - return self._model_info(password=password) + return self._model_info() def system_info(self): # returns the name of system. @@ -30,9 +30,9 @@ def device_name(self): # returns name of the device. return self._device_name() - def manufacturer_name(self, password): + def manufacturer_name(self): # returns the manufacturer's name - return self._manufacturer_name(password=password) + return self._manufacturer_name() def kernel_version(self): # returns the kernel name. diff --git a/plyer/platforms/android/sysinfo.py b/plyer/platforms/android/sysinfo.py index e1661e822..51b35c5bb 100644 --- a/plyer/platforms/android/sysinfo.py +++ b/plyer/platforms/android/sysinfo.py @@ -18,7 +18,7 @@ class AndroidSysinfo(Sysinfo): - def _model_info(self, **kwargs): + def _model_info(self): return "" def _system_info(self): @@ -89,7 +89,7 @@ def _architecture_info(self): def _device_name(self): return Build.MODEL - def _manufacturer_name(self, **kwargs): + def _manufacturer_name(self): return Build.MANUFACTURER def _kernel_version(self): diff --git a/plyer/platforms/linux/sysinfo.py b/plyer/platforms/linux/sysinfo.py index eb4f0b59e..ef3cec319 100644 --- a/plyer/platforms/linux/sysinfo.py +++ b/plyer/platforms/linux/sysinfo.py @@ -6,12 +6,10 @@ class LinuxSysinfo(Sysinfo): - def _model_info(self, **kwargs): - password = kwargs.get('password') - command = 'dmidecode -s baseboard-product-name'.split() - p = Popen(['sudo', '-S'] + command, stdin=PIPE, stderr=PIPE, - stdout=PIPE, universal_newlines=True) - sp = p.communicate(password + '\n')[0] + def _model_info(self): + command = 'cat /sys/devices/virtual/dmi/id/product_name '.split() + p = Popen(command, stderr=PIPE, stdout=PIPE) + sp = p.communicate()[0] return sp def _system_info(self): @@ -32,13 +30,10 @@ def _architecture_info(self): def _device_name(self): return platform.uname()[1] - def _manufacturer_name(self, **kwargs): - - password = kwargs.get('password') - command = 'dmidecode -s system-manufacturer'.split() - p = Popen(['sudo', '-S'] + command, stdin=PIPE, stderr=PIPE, - stdout=PIPE, universal_newlines=True) - sp = p.communicate(password + '\n')[0] + def _manufacturer_name(self): + command = 'cat /sys/devices/virtual/dmi/id/sys_vendor '.split() + p = Popen(command, stderr=PIPE, stdout=PIPE) + sp = p.communicate()[0] return sp def _kernel_version(self): diff --git a/plyer/platforms/macosx/sysinfo.py b/plyer/platforms/macosx/sysinfo.py index dd68c6637..b3d7c0523 100644 --- a/plyer/platforms/macosx/sysinfo.py +++ b/plyer/platforms/macosx/sysinfo.py @@ -4,7 +4,7 @@ class OSXSysinfo(Sysinfo): - def _model_info(self, **kwargs): + def _model_info(self): return "" def _system_info(self): @@ -25,7 +25,7 @@ def _architecture_info(self): def _device_name(self): return platform.uname()[1] - def _manufacturer_name(self, **kwargs): + def _manufacturer_name(self): return "" def _kernel_version(self): diff --git a/plyer/platforms/win/libs/screenmetric.py b/plyer/platforms/win/libs/screenmetric.py deleted file mode 100644 index 0007b5d5c..000000000 --- a/plyer/platforms/win/libs/screenmetric.py +++ /dev/null @@ -1,10 +0,0 @@ -__all__ = ('get_SystemMetrics') - - -import ctypes -from plyer.platforms.win.libs import win_api_defs - - -def get_SystemMetrics(val): - mat = win_api_defs.GetSystemMetrics(val) - return mat diff --git a/plyer/platforms/win/sysinfo.py b/plyer/platforms/win/sysinfo.py index 99ea1b3b9..30ac98bbf 100644 --- a/plyer/platforms/win/sysinfo.py +++ b/plyer/platforms/win/sysinfo.py @@ -3,17 +3,14 @@ import re from subprocess import Popen, PIPE from plyer.facades import Sysinfo -from plyer.platforms.win.libs import screenmetric +from plyer.platforms.win.libs import win_api_defs class WindowsSysinfo(Sysinfo): values = {} - def __init__(self, **kwargs): - self.SysInfo() - - def SysInfo(self): + def _ensure_sysinfo(self): cache = os.popen2("SYSTEMINFO") source = cache[1].read() @@ -24,9 +21,12 @@ def SysInfo(self): self.values[opt] = [item.strip() for item in re.findall("%s:\w*(.*?)\n" % (opt), source, re.IGNORECASE)][0] + return self.values - def _model_info(self, **kwargs): - return self.values['System Model'] + def _model_info(self): + if 'System Model' in self.values: + return self.values['System Model'] + return self._ensure_sysinfo()['System Model'] def _system_info(self): return platform.system() @@ -47,17 +47,21 @@ def _device_name(self): return platform.uname()[1] def _manufacturer_name(self, **kwargs): - return self.values['System Manufacturer'] + if 'System Manufacturer' in self.values: + return self.values['System Manufacturer'] + return self._ensure_sysinfo()['System Manufacturer'] def _kernel_version(self): return platform.uname()[2] def _storage_info(self): - return self.values['Total Physical Memory'] + if 'Total Physical Memory' in self.values: + return self.values['Total Physical Memory'] + return self._ensure_sysinfo()['Total Physical Memory'] def _screen_dimension(self): - return (screenmetric.get_SystemMetrics(0), - screenmetric.get_SystemMetrics(1)) + return (win_api_defs.GetSystemMetrics(0), + win_api_defs.GetSystemMetrics(1)) def instance(): From e62dfda83cab0a0a4c11adfec9203549bda614f8 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Fri, 27 May 2016 14:51:41 +0530 Subject: [PATCH 12/18] complete macosx --- plyer/facades/sysinfo.py | 4 +-- plyer/platforms/android/sysinfo.py | 58 ++++-------------------------- plyer/platforms/ios/sysinfo.py | 57 +++++++++++++++++++++++++++++ plyer/platforms/macosx/sysinfo.py | 31 +++++++++++++--- 4 files changed, 92 insertions(+), 58 deletions(-) create mode 100644 plyer/platforms/ios/sysinfo.py diff --git a/plyer/facades/sysinfo.py b/plyer/facades/sysinfo.py index e946a30ab..5a9692f2e 100644 --- a/plyer/facades/sysinfo.py +++ b/plyer/facades/sysinfo.py @@ -48,7 +48,7 @@ def screen_dimension(self): # private - def _model_info(self, **kwargs): + def _model_info(self): raise NotImplementedError() def _system_info(self): @@ -69,7 +69,7 @@ def _architecture_info(self): def _device_name(self): raise NotImplementedError() - def _manufacturer_name(self, **kwargs): + def _manufacturer_name(self): raise NotImplementedError() def _kernel_version(self): diff --git a/plyer/platforms/android/sysinfo.py b/plyer/platforms/android/sysinfo.py index 51b35c5bb..1c3196e0a 100644 --- a/plyer/platforms/android/sysinfo.py +++ b/plyer/platforms/android/sysinfo.py @@ -19,7 +19,7 @@ class AndroidSysinfo(Sysinfo): def _model_info(self): - return "" + return Build.MODEL def _system_info(self): return BuildVersion.BASE_OS @@ -31,57 +31,11 @@ def _processor_info(self): return Build.CPU_ABI def _version_info(self): - version = str(BuildVersion.RELEASE) - if version >= 1.0 and version < 1.1: - return ("Android", version, "BASE") - elif version == 1.1: - return ("Android", version, "BASE_1_1") - elif version == 1.5: - return ("Android", version, "CUPCAKE") - elif version == 1.6: - return ("Android", version, "DONUT") - elif version >= 2.0 and version < 2.0.1: - return ("Android", version, "ECLAIR") - elif version >= 2.0.1 and version < 2.1: - return ("Android", version, "ECLAIR_0_1") - elif version == 2.1: - return ("Android", version, "ECLAIR_MR1") - elif version >= 2.2 and version <= 2.2.3: - return ("Android", version, "FROYO") - elif version >= 2.3 and version < 2.3.3: - return ("Android", version, "GINGERBREAD") - elif version >= 2.3.3 and version <= 2.3.7: - return ("Android", version, "GINGERBREAD_MR1") - elif version >= 3.0 and version < 3.1: - return ("Android", version, "HONEYCOMB") - elif version >= 3.1 and version < 3.2: - return ("Android", version, "HONEYCOMB_MR1") - elif version >= 3.2 and version <= 3.2.6: - return ("Android", version, "HONEYCOMB_MR2") - elif version >= 4.0 and version < 4.0.3: - return ("Android", version, "ICE_CREAM_SANDWICH") - elif version >= 4.0.3 and version <= 4.0.4: - return ("Android", version, "ICE_CREAM_SANDWICH_MR1") - elif version >= 4.1 and version < 4.2: - return ("Android", version, "JELLY_BEAN") - elif version >= 4.2 and version < 4.3: - return ("Android", version, "JELLY_BEAN_MR1") - elif version >= 4.3.0 and version <= 4.3.1: - return ("Android", version, "JELLY_BEAN_MR2") - elif version >= 4.4 and version < 4.4.1: - return ("Android", version, "KITKAT") - elif version >= 4.4.1 and version < 4.4.2: - return ("Android", version, "KITKAT_MR1") - elif version >= 4.4.2 and version <= 4.4.4: - return ("Android", version, "KITKAT_MR2") - elif version >= 5.0 and version < 5.1: - return ("Android", version, "LOLLIPOP") - elif version >= 5.1 and version <= 5.1.1: - return ("Android", version, "LOLLIPOP_MR1") - elif version == 6.0: - return ("Android", version, "MARSHMALLOW") - else: - return ("Android", 0.0, "Unknown version") + sdkint = BuildVersion.SDK_INT + for name, value in dir(BuildVersionCodes): + if sdkint == value: + return ('Android', sdkint, name) + return ('Android', sdkint, 'UNKNOWN') def _architecture_info(self): return (Build.CPU_ABI, Build.CPU_ABI2) diff --git a/plyer/platforms/ios/sysinfo.py b/plyer/platforms/ios/sysinfo.py new file mode 100644 index 000000000..a3313a77e --- /dev/null +++ b/plyer/platforms/ios/sysinfo.py @@ -0,0 +1,57 @@ +''' +ios Sysinfo +----------- +''' + +from plyer.facades import Sysinfo +from pyobjus import autoclass +load_framework('/System/Library/Frameworks/UIKit.framework') +UIDevice = autoclass('UIDevice') +UIScreen = autoclass('UIScreen') + + +class AndroidSysinfo(Sysinfo): + + def __init__(self, **kwargs): + super(AndroidSysinfo, self).__init__(**kwargs) + self.device = UIDevice.currentDevice() + + def _model_info(self): + return self.device.model + + def _system_info(self): + return self.device.systemName + + def _platform_info(self): + return " " + + def _processor_info(self): + return " " + + def _version_info(self): + return (self.device.systemVersion," "," ") + + def _architecture_info(self): + return (" ", " ") + + def _device_name(self): + return self.device.name + + def _manufacturer_name(self): + return "Apple Inc." + + def _kernel_version(self): + return " " + + def _storage_info(self): + return " " + + def _screen_dimension(self): + screen = UIScreen.mainScreen().bounds + width = screen.size.width + height = screen.size.height + return (height, width) + + +def instance(): + return AndroidSysinfo() diff --git a/plyer/platforms/macosx/sysinfo.py b/plyer/platforms/macosx/sysinfo.py index b3d7c0523..88bd0d812 100644 --- a/plyer/platforms/macosx/sysinfo.py +++ b/plyer/platforms/macosx/sysinfo.py @@ -1,11 +1,17 @@ import platform +import subprocess +from subprocess import Popen, PIPE from plyer.facades import Sysinfo class OSXSysinfo(Sysinfo): def _model_info(self): - return "" + mi = Popen("system_profiler SPHardwareDataType | grep Model\ Identifier", + shell = True, + stdout = PIPE).communicate()[0] + mi = mi.split('Model Identifier: ')[1] + return mi def _system_info(self): return platform.system() @@ -26,16 +32,33 @@ def _device_name(self): return platform.uname()[1] def _manufacturer_name(self): - return "" + mn = Popen('system_profiler SPUSBDataType | grep Manufacturer', + shell = True, + stdout = PIPE).communicate()[0] + mn = mn.split('Manufacturer: ') + mn = mn[1].split('\n') + return mn[0] def _kernel_version(self): return platform.uname()[2] def _storage_info(self): - return "" + + si = Popen('system_profiler SPHardwareDataType | grep Memory', + shell = True, + stdout = PIPE).communicate()[0] + si = si.split('Memory: ')[1].split(' ')[0] + return si def _screen_dimension(self): - return "" + sd = Popen('system_profiler SPDisplaysDataType | grep Resolution', + shell = True, + stdout = PIPE).communicate()[0] + sd = sd.split('Resolution:')[1] + sd = sd.split(' ') + sd1 = sd[1] + sd2 = sd[3] + return (int(sd1), int(sd2)) def instance(): From d24454f70a4273c6d9b7fe8bfc05d23be31b24d3 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Sat, 28 May 2016 11:11:56 +0530 Subject: [PATCH 13/18] complete android --- plyer/platforms/android/sysinfo.py | 38 ++++++++++++++++++++---------- plyer/platforms/ios/sysinfo.py | 2 +- plyer/platforms/macosx/sysinfo.py | 19 ++++++++------- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/plyer/platforms/android/sysinfo.py b/plyer/platforms/android/sysinfo.py index 1c3196e0a..68db94e82 100644 --- a/plyer/platforms/android/sysinfo.py +++ b/plyer/platforms/android/sysinfo.py @@ -5,15 +5,13 @@ from jnius import autoclass from plyer.facades import Sysinfo -from plyer.platforms.android import activity -from android import api_version, version_codes Build = autoclass('android.os.Build') BuildVersion = autoclass('android.os.Build$VERSION') BuildVersionCodes = autoclass('android.os.Build$VERSION_CODES') -Settings = autoclass('android.provider.Settings') -Intent = autoclass('android.content.Intent') -uri = autoclass('android.net.Uri') System = autoclass('java.lang.System') +Environment = autoclass('android.os.Environment') +StatsFs = autoclass('android.os.StatFs') +DisplayMetrics = autoclass('android.util.DisplayMetrics') class AndroidSysinfo(Sysinfo): @@ -22,7 +20,7 @@ def _model_info(self): return Build.MODEL def _system_info(self): - return BuildVersion.BASE_OS + return System.getProperty("os.name") def _platform_info(self): return Build.DEVICE @@ -32,16 +30,23 @@ def _processor_info(self): def _version_info(self): sdkint = BuildVersion.SDK_INT - for name, value in dir(BuildVersionCodes): - if sdkint == value: - return ('Android', sdkint, name) - return ('Android', sdkint, 'UNKNOWN') + version = BuildVersion.RELEASE + try: + fields = BuildVersionCodes.class.getFields() + for field in fields: + fieldName = field.getName() + fieldValue = field.getInt() + + if (fieldValue == sdkint): + return ('Android', str(sdkint), fieldName) + except: + return ('Android', str(sdkint), 'UNKNOWN') def _architecture_info(self): return (Build.CPU_ABI, Build.CPU_ABI2) def _device_name(self): - return Build.MODEL + return str(Build.MANUFACTURER) + " " + str(Build.MODEL) def _manufacturer_name(self): return Build.MANUFACTURER @@ -50,10 +55,17 @@ def _kernel_version(self): return System.getProperty("os.version") def _storage_info(self): - return "" + stat = StatFs(Environment.getDataDirectory().getPath()) + bytesAvailable = stat.getBlockSize() * stat.getBlockCount() + megAvailable = bytesAvailable / 1048576 + return str(megAvailable) def _screen_dimension(self): - return "" + dm = DisplayMetrics() + getWindowManager.getDefaultDisplay().getMetrics(dm) + wid = int(dm.widthPixels) + hei = int(dm.heightPixels) + return (wid, hei) def instance(): diff --git a/plyer/platforms/ios/sysinfo.py b/plyer/platforms/ios/sysinfo.py index a3313a77e..d01c39aad 100644 --- a/plyer/platforms/ios/sysinfo.py +++ b/plyer/platforms/ios/sysinfo.py @@ -29,7 +29,7 @@ def _processor_info(self): return " " def _version_info(self): - return (self.device.systemVersion," "," ") + return (self.device.systemVersion, " ", " ") def _architecture_info(self): return (" ", " ") diff --git a/plyer/platforms/macosx/sysinfo.py b/plyer/platforms/macosx/sysinfo.py index 88bd0d812..681f94a95 100644 --- a/plyer/platforms/macosx/sysinfo.py +++ b/plyer/platforms/macosx/sysinfo.py @@ -7,9 +7,10 @@ class OSXSysinfo(Sysinfo): def _model_info(self): - mi = Popen("system_profiler SPHardwareDataType | grep Model\ Identifier", - shell = True, - stdout = PIPE).communicate()[0] + mi = Popen("system_profiler SPHardwareDataType | grep Model\ " + + "Identifier", + shell=True, + stdout=PIPE).communicate()[0] mi = mi.split('Model Identifier: ')[1] return mi @@ -33,8 +34,8 @@ def _device_name(self): def _manufacturer_name(self): mn = Popen('system_profiler SPUSBDataType | grep Manufacturer', - shell = True, - stdout = PIPE).communicate()[0] + shell=True, + stdout=PIPE).communicate()[0] mn = mn.split('Manufacturer: ') mn = mn[1].split('\n') return mn[0] @@ -45,15 +46,15 @@ def _kernel_version(self): def _storage_info(self): si = Popen('system_profiler SPHardwareDataType | grep Memory', - shell = True, - stdout = PIPE).communicate()[0] + shell=True, + stdout=PIPE).communicate()[0] si = si.split('Memory: ')[1].split(' ')[0] return si def _screen_dimension(self): sd = Popen('system_profiler SPDisplaysDataType | grep Resolution', - shell = True, - stdout = PIPE).communicate()[0] + shell=True, + stdout=PIPE).communicate()[0] sd = sd.split('Resolution:')[1] sd = sd.split(' ') sd1 = sd[1] From 45edeb4d9fffd2565bc278f131761ac505570ef3 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Sat, 28 May 2016 11:23:47 +0530 Subject: [PATCH 14/18] adding ios --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index d5cef73a2..2f5670770 100755 --- a/README.rst +++ b/README.rst @@ -29,7 +29,7 @@ Text to speech X X X X X Email (open mail client) X X X X X Vibrator X X Sms (send messages) X X -Sysinfo X X X X +Sysinfo X X X X X Compass X X Unique ID X X X X X Gyroscope X X From 078692ae88d239ec6ae955b9494d481a39815c0b Mon Sep 17 00:00:00 2001 From: kiok46 Date: Mon, 30 May 2016 22:06:26 +0530 Subject: [PATCH 15/18] complete ios --- plyer/platforms/ios/libs/sysinfo.m | 47 ++++++++++++++++++++++++++++++ plyer/platforms/ios/sysinfo.py | 20 ++++++++++--- 2 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 plyer/platforms/ios/libs/sysinfo.m diff --git a/plyer/platforms/ios/libs/sysinfo.m b/plyer/platforms/ios/libs/sysinfo.m new file mode 100644 index 000000000..e4328d1b2 --- /dev/null +++ b/plyer/platforms/ios/libs/sysinfo.m @@ -0,0 +1,47 @@ +#import +#define MB (1024*1024) +#define GB (MB*1024) + + +@interface SizeClass: NSObject { +} +- (int) get_bit_size; +@end + + +@implementation SizeClass + +- (int) get_bit_size { + if (sizeof(void*) == 4) { + return 32; + } + else if (sizeof(void*) == 8){ + return 64; + } +} +@end + + +@interface StorageClass: NSObject { +} +- (double) get_total_space; +@end + + +@implementation StorageClass + +- (double)memoryFormatter:(long long)diskSpace { + double bytes = 1.0 * diskSpace; + double megabytes = bytes / MB; + double gigabytes = bytes / GB; + return gigabytes; +} + +- (double) get_total_space { + long long space = [[[[NSFileManager defaultManager] + attributesOfFileSystemForPath:NSHomeDirectory() error:nil] + objectForKey:NSFileSystemSize] longLongValue]; + return [self memoryFormatter:space]; + } + +@end diff --git a/plyer/platforms/ios/sysinfo.py b/plyer/platforms/ios/sysinfo.py index d01c39aad..dd0129c57 100644 --- a/plyer/platforms/ios/sysinfo.py +++ b/plyer/platforms/ios/sysinfo.py @@ -5,9 +5,15 @@ from plyer.facades import Sysinfo from pyobjus import autoclass +from pyobjus.dylib_manager import load_dylib, make_dylib +import sys load_framework('/System/Library/Frameworks/UIKit.framework') +make_dylib('plyer/platforms/ios/libs/sysinfo.m', frameworks=['Foundation'], + out='sysinfo.dylib') +load_dylib('sysinfo.dylib') UIDevice = autoclass('UIDevice') UIScreen = autoclass('UIScreen') +NSProcessInfo = autoclass('NSProcessInfo') class AndroidSysinfo(Sysinfo): @@ -23,7 +29,7 @@ def _system_info(self): return self.device.systemName def _platform_info(self): - return " " + return sys.platform def _processor_info(self): return " " @@ -32,7 +38,10 @@ def _version_info(self): return (self.device.systemVersion, " ", " ") def _architecture_info(self): - return (" ", " ") + sizeClass = autoclass('SizeClass') + instance = sizeClass.alloc().init() + bit = instance.get_bit_size() + return ("{}".format(bit), " ") def _device_name(self): return self.device.name @@ -41,10 +50,13 @@ def _manufacturer_name(self): return "Apple Inc." def _kernel_version(self): - return " " + processinfo = NSProcessInfo() + return processinfo.operatingSystemVersionString def _storage_info(self): - return " " + Storage = autoclass('StorageClass') + instance = Storage.alloc().init() + return str(instance.get_total_space()) def _screen_dimension(self): screen = UIScreen.mainScreen().bounds From c2c399e22ad85be0ee108c0bf5fae2c31c223065 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Wed, 1 Jun 2016 13:03:10 +0530 Subject: [PATCH 16/18] typos --- plyer/platforms/ios/sysinfo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plyer/platforms/ios/sysinfo.py b/plyer/platforms/ios/sysinfo.py index dd0129c57..e50314dc8 100644 --- a/plyer/platforms/ios/sysinfo.py +++ b/plyer/platforms/ios/sysinfo.py @@ -16,10 +16,10 @@ NSProcessInfo = autoclass('NSProcessInfo') -class AndroidSysinfo(Sysinfo): +class IosSysinfo(Sysinfo): def __init__(self, **kwargs): - super(AndroidSysinfo, self).__init__(**kwargs) + super(IosSysinfo, self).__init__(**kwargs) self.device = UIDevice.currentDevice() def _model_info(self): @@ -66,4 +66,4 @@ def _screen_dimension(self): def instance(): - return AndroidSysinfo() + return IosSysinfo() From 8c1cf6f6bea896b42173ee63b7a91e5cc25a8364 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Tue, 9 Aug 2016 17:54:47 +0530 Subject: [PATCH 17/18] document --- .gitignore | 4 ++ examples/sysinfo/main.py | 9 ++-- plyer/facades/sysinfo.py | 14 +++--- plyer/platforms/android/sysinfo.py | 49 ++++++++++++++++---- plyer/platforms/ios/sysinfo.py | 37 ++++++++++++++- plyer/platforms/linux/sysinfo.py | 52 +++++++++++++++++++-- plyer/platforms/macosx/sysinfo.py | 42 +++++++++++++++-- plyer/platforms/win/sysinfo.py | 73 +++++++++++++++++++++++++++--- 8 files changed, 242 insertions(+), 38 deletions(-) diff --git a/.gitignore b/.gitignore index 74a145ee1..75425bbf0 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,7 @@ venv .project .pydevproject .settings/ +.buildozer/ +bin/ +buildozer.spec +main.py diff --git a/examples/sysinfo/main.py b/examples/sysinfo/main.py index 8814f837a..7bb7054aa 100644 --- a/examples/sysinfo/main.py +++ b/examples/sysinfo/main.py @@ -70,7 +70,6 @@ class SysinfoInterface(BoxLayout): kernel_ = StringProperty() storage_ = StringProperty() screen_ = ListProperty() - password = "qwerty" def __init__(self, **kwargs): super(SysinfoInterface, self).__init__(**kwargs) @@ -87,7 +86,7 @@ def update(self): self.get_manufacturer() self.get_kernel_version() self.get_storage_info() - self.get_screen_dimension() + self.get_screen_resolution() def get_model(self): self.model_ = sysinfo.model_info() @@ -96,7 +95,7 @@ def get_platform(self): self.platform_ = sysinfo.platform_info() def get_system(self): - self.system_ = sysinfo.system_info() + self.system_ = sysinfo.system_name() def get_processor(self): self.processor_ = sysinfo.processor_info() @@ -120,8 +119,8 @@ def get_kernel_version(self): def get_storage_info(self): self.storage_ = sysinfo.storage_info() - def get_screen_dimension(self): - self.screen_ = sysinfo.screen_dimension() + def get_screen_resolution(self): + self.screen_ = sysinfo.screen_resolution() class SysinfoApp(App): diff --git a/plyer/facades/sysinfo.py b/plyer/facades/sysinfo.py index 5a9692f2e..bc143f038 100644 --- a/plyer/facades/sysinfo.py +++ b/plyer/facades/sysinfo.py @@ -6,9 +6,9 @@ def model_info(self): # returns the model name. return self._model_info() - def system_info(self): + def system_name(self): # returns the name of system. - return self._system_info() + return self._system_name() def platform_info(self): # returns platform name including version. @@ -42,16 +42,16 @@ def storage_info(self): # returns the storage capacity o fthe system. return self._storage_info() - def screen_dimension(self): - # returns the screen's dimension like 1200x980. - return self._screen_dimension() + def screen_resolution(self): + # returns the screen's resolution like 1200x980. + return self._screen_resolution() # private def _model_info(self): raise NotImplementedError() - def _system_info(self): + def _system_name(self): raise NotImplementedError() def _platform_info(self): @@ -78,5 +78,5 @@ def _kernel_version(self): def _storage_info(self): raise NotImplementedError() - def _screen_dimension(self): + def _screen_resolution(self): raise NotImplementedError() diff --git a/plyer/platforms/android/sysinfo.py b/plyer/platforms/android/sysinfo.py index 68db94e82..ae7bb9c20 100644 --- a/plyer/platforms/android/sysinfo.py +++ b/plyer/platforms/android/sysinfo.py @@ -1,34 +1,45 @@ -''' -Android Sysinfo ------------ -''' - from jnius import autoclass from plyer.facades import Sysinfo + Build = autoclass('android.os.Build') BuildVersion = autoclass('android.os.Build$VERSION') BuildVersionCodes = autoclass('android.os.Build$VERSION_CODES') System = autoclass('java.lang.System') Environment = autoclass('android.os.Environment') -StatsFs = autoclass('android.os.StatFs') +StatsFs = autoclass('android.os.StatsFs') DisplayMetrics = autoclass('android.util.DisplayMetrics') class AndroidSysinfo(Sysinfo): def _model_info(self): + ''' + Returns the model info for example: + ''' return Build.MODEL - def _system_info(self): + def _system_name(self): + ''' + Returns the system's OS name for example: + ''' return System.getProperty("os.name") def _platform_info(self): + ''' + Returns platform's name for example: + ''' return Build.DEVICE def _processor_info(self): + ''' + Returns the type of processor for example: + ''' return Build.CPU_ABI def _version_info(self): + ''' + Returns the version of OS in a tuple for example: + ''' sdkint = BuildVersion.SDK_INT version = BuildVersion.RELEASE try: @@ -40,27 +51,45 @@ def _version_info(self): if (fieldValue == sdkint): return ('Android', str(sdkint), fieldName) except: - return ('Android', str(sdkint), 'UNKNOWN') + return ('Android', str(sdkint), "UNKNOWN") def _architecture_info(self): + ''' + Returns the architecture in a tuple for example: + ''' return (Build.CPU_ABI, Build.CPU_ABI2) def _device_name(self): + ''' + Returns the device name for example: + ''' return str(Build.MANUFACTURER) + " " + str(Build.MODEL) def _manufacturer_name(self): + ''' + Returns the manufacturer's name for example: + ''' return Build.MANUFACTURER def _kernel_version(self): + ''' + Returns the kernel version for example: + ''' return System.getProperty("os.version") def _storage_info(self): - stat = StatFs(Environment.getDataDirectory().getPath()) + ''' + Returns the amount of storage (RAM) in GB. for example: + ''' + stat = StatsFs(Environment.getDataDirectory().getPath()) bytesAvailable = stat.getBlockSize() * stat.getBlockCount() megAvailable = bytesAvailable / 1048576 return str(megAvailable) - def _screen_dimension(self): + def _screen_resolution(self): + ''' + Returns the screen resolution for example: + ''' dm = DisplayMetrics() getWindowManager.getDefaultDisplay().getMetrics(dm) wid = int(dm.widthPixels) diff --git a/plyer/platforms/ios/sysinfo.py b/plyer/platforms/ios/sysinfo.py index e50314dc8..95d3f0ae9 100644 --- a/plyer/platforms/ios/sysinfo.py +++ b/plyer/platforms/ios/sysinfo.py @@ -23,42 +23,75 @@ def __init__(self, **kwargs): self.device = UIDevice.currentDevice() def _model_info(self): + ''' + Returns the model info for example: + ''' return self.device.model - def _system_info(self): + def _system_name(self): + ''' + Returns the system's OS name for example: + ''' return self.device.systemName def _platform_info(self): + ''' + Returns platform's name for example: + ''' return sys.platform def _processor_info(self): + ''' + Returns the type of processor for example: + ''' return " " def _version_info(self): + ''' + Returns the version of OS in a tuple for example: + ''' return (self.device.systemVersion, " ", " ") def _architecture_info(self): + ''' + Returns the architecture in a tuple for example: + ''' sizeClass = autoclass('SizeClass') instance = sizeClass.alloc().init() bit = instance.get_bit_size() return ("{}".format(bit), " ") def _device_name(self): + ''' + Returns the device name for example: + ''' return self.device.name def _manufacturer_name(self): + ''' + Returns the manufacturer's name for example: + ''' return "Apple Inc." def _kernel_version(self): + ''' + Returns the kernel version for example: + ''' processinfo = NSProcessInfo() return processinfo.operatingSystemVersionString def _storage_info(self): + ''' + Returns the amount of storage (RAM) in GB. for example: + ''' Storage = autoclass('StorageClass') instance = Storage.alloc().init() return str(instance.get_total_space()) - def _screen_dimension(self): + def _screen_resolution(self): + ''' + Returns the screen resolution for example: + ''' screen = UIScreen.mainScreen().bounds width = screen.size.width height = screen.size.height diff --git a/plyer/platforms/linux/sysinfo.py b/plyer/platforms/linux/sysinfo.py index ef3cec319..d67268239 100644 --- a/plyer/platforms/linux/sysinfo.py +++ b/plyer/platforms/linux/sysinfo.py @@ -7,47 +7,91 @@ class LinuxSysinfo(Sysinfo): def _model_info(self): + ''' + Returns the model info for example: "VirtualBox" + ''' command = 'cat /sys/devices/virtual/dmi/id/product_name '.split() p = Popen(command, stderr=PIPE, stdout=PIPE) sp = p.communicate()[0] return sp - def _system_info(self): + def _system_name(self): + ''' + Returns the system's OS name for example: "Linux" + ''' return platform.system() def _platform_info(self): + ''' + Returns platform's name for example: + "Lunix-4.2.0-36-generic-x86_64-with-Ubuntu-15.10-wily" + ''' return platform.platform() def _processor_info(self): + ''' + Returns the type of processor for example: "x86_64" + ''' return platform.processor() def _version_info(self): + ''' + Returns the version of OS in a tuple for example: + "Ubuntu 15.10 wily" + ''' return platform.dist() def _architecture_info(self): + ''' + Returns the architecture in a tuple for example: "('64bit', 'ELF')" + ''' return platform.architecture() def _device_name(self): + ''' + Returns the device name for example: "kuldeep-virtualbox" + ''' return platform.uname()[1] def _manufacturer_name(self): + ''' + Returns the manufacturer's name for example: "innotek GmnH" + ''' command = 'cat /sys/devices/virtual/dmi/id/sys_vendor '.split() p = Popen(command, stderr=PIPE, stdout=PIPE) sp = p.communicate()[0] return sp def _kernel_version(self): + ''' + Returns the kernel version for example: "4.2.0-32-generic" + ''' return platform.uname()[2] def _storage_info(self): + ''' + Returns the amount of storage (RAM) in GB. for example: "1.43 GB" + ''' meminfo = {} with open('/proc/meminfo') as f: for line in f: meminfo[line.split(':')[0]] = line.split(':')[1].strip() - return str(meminfo['MemTotal']) - - def _screen_dimension(self): + try: + memory, unit = meminfo['MemTotal'].split(' ') + if (unit.lower() == "kb"): + return str(round(int(memory) / (1024.0 * 1024.0), 2)) + " GB" + elif (unit.lower() == "mb"): + return str(round(int(memory) / (1024.0), 2)) + " GB" + elif (unit.lower() == "gb"): + return str(int(memory)) + " GB" + except: + return str(meminfo['MemTotal']) + + def _screen_resolution(self): + ''' + Returns the screen resolution for example: "[1920, 975]" + ''' sd = Popen('xrandr | grep "\*" | cut -d" " -f4', shell=True, stdout=PIPE).communicate()[0] diff --git a/plyer/platforms/macosx/sysinfo.py b/plyer/platforms/macosx/sysinfo.py index 681f94a95..9118dcced 100644 --- a/plyer/platforms/macosx/sysinfo.py +++ b/plyer/platforms/macosx/sysinfo.py @@ -7,6 +7,9 @@ class OSXSysinfo(Sysinfo): def _model_info(self): + ''' + Returns the model info for example: "MacBookPro11,4" + ''' mi = Popen("system_profiler SPHardwareDataType | grep Model\ " + "Identifier", shell=True, @@ -14,25 +17,48 @@ def _model_info(self): mi = mi.split('Model Identifier: ')[1] return mi - def _system_info(self): + def _system_name(self): + ''' + Returns the system's OS name for example: "Darwin" + ''' return platform.system() def _platform_info(self): + ''' + Returns platform's name for ecample: + "Darwin-15.5.0-x86_64-i386-64bit" + ''' return platform.platform() def _processor_info(self): + ''' + Returns the type of processor for example: "i386" + ''' return platform.processor() def _version_info(self): + ''' + Returns the version of OS in a tuple for example: + "10.11.5 (",",") x84_64" + ''' return platform.mac_ver() def _architecture_info(self): + ''' + Returns the architecture in a tuple for example: "('64bit', ")" + ''' return platform.architecture() def _device_name(self): + ''' + Returns the device name for example: "Kuldeeps-MacBook-Pro.local" + ''' return platform.uname()[1] def _manufacturer_name(self): + ''' + Returns the manufacturer's name for example: "Apple Inc." + ''' mn = Popen('system_profiler SPUSBDataType | grep Manufacturer', shell=True, stdout=PIPE).communicate()[0] @@ -41,17 +67,25 @@ def _manufacturer_name(self): return mn[0] def _kernel_version(self): + ''' + Returns the kernel version for example: "15.5.0" + ''' return platform.uname()[2] def _storage_info(self): - + ''' + Returns the amount of storage (RAM) in GB. for example: "16 GB" + ''' si = Popen('system_profiler SPHardwareDataType | grep Memory', shell=True, stdout=PIPE).communicate()[0] si = si.split('Memory: ')[1].split(' ')[0] - return si + return str(si) + " GB" - def _screen_dimension(self): + def _screen_resolution(self): + ''' + Returns the screen resolution for example: "[2880, 1800]" + ''' sd = Popen('system_profiler SPDisplaysDataType | grep Resolution', shell=True, stdout=PIPE).communicate()[0] diff --git a/plyer/platforms/win/sysinfo.py b/plyer/platforms/win/sysinfo.py index 30ac98bbf..80831f48c 100644 --- a/plyer/platforms/win/sysinfo.py +++ b/plyer/platforms/win/sysinfo.py @@ -11,6 +11,9 @@ class WindowsSysinfo(Sysinfo): values = {} def _ensure_sysinfo(self): + ''' + Helping private method for extracting system information. + ''' cache = os.popen2("SYSTEMINFO") source = cache[1].read() @@ -24,42 +27,100 @@ def _ensure_sysinfo(self): return self.values def _model_info(self): + ''' + Returns Model information for example: "HP 2000 Notebook PC" + ''' if 'System Model' in self.values: return self.values['System Model'] return self._ensure_sysinfo()['System Model'] - def _system_info(self): + def _system_name(self): + ''' + Returns System's OS name for example: "Windows" + ''' return platform.system() def _platform_info(self): + ''' + Returns the platform's name for example: "Windows-8-6.2.9200" + ''' return platform.platform() def _processor_info(self): + ''' + Returns the type of processor for example: + "Intel64 Family 6 Model 42 Stepping 7, GenuineIntel" + ''' return platform.processor() def _version_info(self): + ''' + Returns the version of OS in a tuple for example: + "8 6.2.9200 " + ''' return platform.win32_ver() def _architecture_info(self): + ''' + Returns the architecture in a tuple, for example: + "('32bit', "WindowsPE")"" + ''' return platform.architecture() def _device_name(self): + ''' + Returns the device's name, for example: "DESKTOP-8UFTHDN" + ''' return platform.uname()[1] def _manufacturer_name(self, **kwargs): + ''' + Returns manufacturer's name, for example: "Hewlett-Packard" + ''' if 'System Manufacturer' in self.values: return self.values['System Manufacturer'] return self._ensure_sysinfo()['System Manufacturer'] def _kernel_version(self): + ''' + Returns the kernel version, for example: "8" + ''' return platform.uname()[2] def _storage_info(self): - if 'Total Physical Memory' in self.values: - return self.values['Total Physical Memory'] - return self._ensure_sysinfo()['Total Physical Memory'] - - def _screen_dimension(self): + ''' + Returns the amount of storage (RAM) in GB for example: "3.9 GB" + + Note: The returned output from `os.popen2("SYSTEMINFO")` is string, + with `,`(commas) between integer values(in MB) but the output should + be same for each platform, hence in GB. + ''' + try: + if 'Total Physical Memory' in self.values: + storage = self.values['Total Physical Memory'] + else: + storage = self._ensure_sysinfo()['Total Physical Memory'] + memory, unit = storage.split(' ') + try: + temp = '' + for i in memory.split(','): + temp = temp + i + memory = temp + except: + pass + if (unit.lower() == "kb"): + return str(round(int(memory) / (1024.0 * 1024.0), 2)) + " GB" + elif (unit.lower() == "mb"): + return str(round(int(memory) / 1024.0, 2)) + " GB" + elif (unit.lower() == "gb"): + return str(int(memory)) + " GB" + except: + return self._ensure_sysinfo()['Total Physical Memory'] + + def _screen_resolution(self): + ''' + Returns the screen resolution for example: "[1366, 768]" + ''' return (win_api_defs.GetSystemMetrics(0), win_api_defs.GetSystemMetrics(1)) From 326a65b38c8f24e55aa7b962b2a75c1cc7fff800 Mon Sep 17 00:00:00 2001 From: kiok46 Date: Fri, 19 Aug 2016 21:50:01 +0530 Subject: [PATCH 18/18] document --- plyer/facades/sysinfo.py | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/plyer/facades/sysinfo.py b/plyer/facades/sysinfo.py index bc143f038..ddc0eb19a 100644 --- a/plyer/facades/sysinfo.py +++ b/plyer/facades/sysinfo.py @@ -1,3 +1,59 @@ +''' +Sysinfo Facade. + ============= + +The :class:`Sysinfo` is to provides system information. +It currently provides model_info, system_name, platform_info, processor_info, +version_info, architecture_info, device_name, manufacturer_name, +kernel_version, storage_info and screen_resolution. + +Usage example +------------- +The following example explains the use case of Sysinfo class:: +#:Python 2.7 + +from kivy.app import App +from plyer import sysinfo +from kivy.properties import StringProperty + + +class SysinfoInterface(BoxLayout): + + model_ = StringProperty() + + def __init__(self, **kwargs): + super(SysinfoInterface, self).__init__(**kwargs) + self.get_model() + + def get_model(self): + # calling the method to extract the model information of that device. + self.model_ = sysinfo.model_info() + + +class SysinfoApp(App): + + def build(self): + return SysinfoInterface() + +if __name__ == "__main__": + app = SysinfoApp() + app.run() + + +Implementing the UI in kivy language: +------------------------------------------- +#:kivy 1.9.1 + +: + GridLayout: + cols: 2 + Label: + text: "Model" + Label: + text: root.model_ +''' + + class Sysinfo(object): ''' Sysinfo facade. '''