Android-ElectricSheep-Automator
view release on metacpan or search on metacpan
lib/Android/ElectricSheep/Automator/DeviceProperties.pm view on Meta::CPAN
package Android::ElectricSheep::Automator::DeviceProperties;
use 5.006;
use strict;
use warnings;
our $VERSION = '0.09';
use Mojo::Log;
use Config::JSON::Enhanced;
use XML::XPath;
use XML::LibXML;
use Data::Roundtrip qw/perl2dump no-unicode-escape-permanently/;
use overload ( '""' => \&toString );
sub new {
my $class = $_[0];
my $params = $_[1] // {};
my $parent = ( caller(1) )[3] || "N/A";
my $whoami = ( caller(0) )[3];
my $self = {
'_private' => {
'logger-object' => undef,
'verbosity' => 0,
'mother' => 0,
},
'data' => {
# corresponds to dumpsys->RawSurfaceWidth,RawSurfaceHeight
'w' => 0,
'h' => 0,
'orientation' => 0,
'density' => 0,
'density-x' => 0,
'density-y' => 0,
'serial' => '<na>'
}
};
bless $self => $class;
if( exists $params->{'logger-object'} ){ $self->{'_private'}->{'logger-object'} = $params->{'logger-object'} } else { $self->{'_private'}->{'logger-object'} = Mojo::Log->new() }
if( exists $params->{'verbosity'} ){ $self->{'_private'}->{'verbosity'} = $params->{'verbosity'} } else { $self->{'_private'}->{'verbosity'} = Mojo::Log->new() }
# we now have a log and verbosity
my $log = $self->log;
my $verbosity = $self->verbosity;
# we need a mother object (Android::ElectricSheep::Automator)
if( (! exists $params->{'mother'})
|| (! defined $params->{'mother'})
|| (! defined $params->{'mother'}->adb())
){ $log->error("${whoami} (via $parent), line ".__LINE__." : error, input parameter 'mother' with our parent Android::ElectricSheep::Automator object was not specified."); return undef }
$self->{'_private'}->{'mother'} = $params->{'mother'};
# caller can specify some initial data to load
# else caller must run ->enquire() to enquire the real device
if( exists $params->{'data'} ){
my $d = $self->{'data'};
my $p = $params->{'data'};
for my $k (sort keys %$d){
if( exists($p->{$k}) && defined($p->{$k}) ){
if( $self->set($k, $p->{$k}) ){ $log->error("${whoami} (via $parent), line ".__LINE__." : error, call to ".'set()'." has failed for input parameter '$k', is its type as expected (".ref($d->{$k}).")?"); return undef }
}
}
}
return $self;
}
# does a adb shell dumpsys and reads various things from it
# it may also do a adb shell wm density
# returns 0 on success, 1 on failure
sub enquire {
my ($self, $params) = @_;
$params //= {};
my $parent = ( caller(1) )[3] || "N/A";
my $whoami = ( caller(0) )[3];
my $log = $self->log;
my $verbosity = $self->verbosity;
# first get the serial of the device
my @cmd = ('get-serialno');
my $res = $self->adb->run(@cmd);
if( ! defined $res ){ $log->error(join(" ", @cmd)."\n${whoami} (via $parent), line ".__LINE__." : error, above shell command has failed, got undefined result, most likely shell command did not run at all, this should not be happening."); return 1 }
if( $res->[0] != 0 ){ $log->error(join(" ", @cmd)."\n${whoami} (via $parent), line ".__LINE__." : error, above shell command has failed, with:\nsSTDOUT:\n".$res->[1]."\n\nSTDERR:\n".$res->[2]."\nEND."); return 1 }
$self->set('serial', $res->[1]=~s/\s*$//gmr); # it has a newline at the end
# here we could also save to a file on device and then
# fetch it locally. We will do that if there are problems
# getting the dump from STDOUT
@cmd = ('wm', 'size');
$res = $self->adb->shell(@cmd);
if( ! defined $res ){ $log->error(join(" ", @cmd)."\n${whoami} (via $parent), line ".__LINE__." : error, above shell command has failed, got undefined result, most likely shell command did not run at all, this should not be happening."); return 1 }
if( $res->[0] != 0 ){ $log->error(join(" ", @cmd)."\n${whoami} (via $parent), line ".__LINE__." : error, above shell command has failed, with:\nsSTDOUT:\n".$res->[1]."\n\nSTDERR:\n".$res->[2]."\nEND."); return 1 }
if( $res->[1] =~ /Physical size:\s*(\d+)\s*x\s*(\d+)/s ){
$self->set('w', $1);
( run in 0.958 second using v1.01-cache-2.11-cpan-39bf76dae61 )