summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.xml197
-rw-r--r--www/index.html1
-rw-r--r--www/js/DataModel.js5
-rw-r--r--www/js/InvalidApiCtrl.js37
-rw-r--r--www/js/PortalLoginCtrl.js32
-rw-r--r--www/js/app.js24
-rw-r--r--www/lang/locale-en.json3
-rw-r--r--www/templates/invalidapi.html30
8 files changed, 221 insertions, 108 deletions
diff --git a/config.xml b/config.xml
index 4e71f473..55fdf1bb 100644
--- a/config.xml
+++ b/config.xml
@@ -1,102 +1,103 @@
-<?xml version='1.0' encoding='utf-8'?>
-<widget android-packageName="com.pliablepixels.zmninja_pro" id="com.pliablepixels.zmninjapro" ios-CFBundleIdentifier="com.pliablepixels.zmninja-pro" version="1.2.33" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
- <name>zmNinja</name>
- <description>
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<widget android-packageName="com.pliablepixels.zmninja_pro" id="com.pliablepixels.zmninjapro" ios-CFBundleIdentifier="com.pliablepixels.zmninja-pro" version="1.2.34" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
+ <name>zmNinja</name>
+ <description>
High performance ZoneMinder client
</description>
- <author email="pliablepixels@gmail.com" href="http://pliablepixels.us/">
+ <author email="pliablepixels@gmail.com" href="http://pliablepixels.us/">
Pliable Pixels
</author>
- <content src="index.html" />
- <access origin="*" subdomains="true" />
- <access launch-external="yes" origin="mailto:*" />
- <allow-navigation href="*" />
- <allow-intent href="*" />
- <preference name="AndroidPersistentFileLocation" value="Compatibility" />
- <preference name="iosPersistentFileLocation" value="Library" />
- <preference name="AllowInlineMediaPlayback" value="true" />
- <preference name="CrosswalkAnimatable" value="true" />
- <preference name="webviewbounce" value="false" />
- <preference name="UIWebViewBounce" value="false" />
- <preference name="StatusBarBackgroundColor" value="#2980b9" />
- <preference name="DisallowOverscroll" value="true" />
- <preference name="BackupWebStorage" value="none" />
- <preference name="AutoHideSplashScreen" value="false" />
- <preference name="ShowSplashScreenSpinner" value="false" />
- <preference name="SplashScreen" value="screen" />
- <preference name="deployment-target" value="8.0" />
- <preference name="SplashScreenDelay" value="300" />
- <preference name="SplashMaintainAspectRatio" value="true" />
- <preference name="FadeSplashScreen" value="false" />
- <preference name="BackgroundColor" value="#444444" />
- <feature name="StatusBar">
- <param name="ios-package" onload="true" value="CDVStatusBar" />
- </feature>
- <platform name="ios">
- <config-file parent="NSPhotoLibraryUsageDescription" platform="ios" target="*-Info.plist">
- <string>Store photos of events and live feeds</string>
- </config-file>
- <icon height="57" src="resources/ios/icon/icon.png" width="57" />
- <icon height="114" src="resources/ios/icon/icon@2x.png" width="114" />
- <icon height="40" src="resources/ios/icon/icon-40.png" width="40" />
- <icon height="80" src="resources/ios/icon/icon-40@2x.png" width="80" />
- <icon height="120" src="resources/ios/icon/icon-40@3x.png" width="120" />
- <icon height="50" src="resources/ios/icon/icon-50.png" width="50" />
- <icon height="100" src="resources/ios/icon/icon-50@2x.png" width="100" />
- <icon height="60" src="resources/ios/icon/icon-60.png" width="60" />
- <icon height="120" src="resources/ios/icon/icon-60@2x.png" width="120" />
- <icon height="180" src="resources/ios/icon/icon-60@3x.png" width="180" />
- <icon height="72" src="resources/ios/icon/icon-72.png" width="72" />
- <icon height="144" src="resources/ios/icon/icon-72@2x.png" width="144" />
- <icon height="76" src="resources/ios/icon/icon-76.png" width="76" />
- <icon height="152" src="resources/ios/icon/icon-76@2x.png" width="152" />
- <icon height="167" src="resources/ios/icon/icon-83.5@2x.png" width="167" />
- <icon height="29" src="resources/ios/icon/icon-small.png" width="29" />
- <icon height="58" src="resources/ios/icon/icon-small@2x.png" width="58" />
- <icon height="87" src="resources/ios/icon/icon-small@3x.png" width="87" />
- <splash height="1136" src="resources/ios/splash/Default-568h@2x~iphone.png" width="640" />
- <splash height="1334" src="resources/ios/splash/Default-667h.png" width="750" />
- <splash height="2208" src="resources/ios/splash/Default-736h.png" width="1242" />
- <splash height="1242" src="resources/ios/splash/Default-Landscape-736h.png" width="2208" />
- <splash height="1536" src="resources/ios/splash/Default-Landscape@2x~ipad.png" width="2048" />
- <splash height="768" src="resources/ios/splash/Default-Landscape~ipad.png" width="1024" />
- <splash height="2048" src="resources/ios/splash/Default-Portrait@2x~ipad.png" width="1536" />
- <splash height="1024" src="resources/ios/splash/Default-Portrait~ipad.png" width="768" />
- <splash height="960" src="resources/ios/splash/Default@2x~iphone.png" width="640" />
- <splash height="480" src="resources/ios/splash/Default~iphone.png" width="320" />
- </platform>
- <platform name="android">
- <icon density="ldpi" src="resources/android/icon/drawable-ldpi-icon.png" />
- <icon density="mdpi" src="resources/android/icon/drawable-mdpi-icon.png" />
- <icon density="hdpi" src="resources/android/icon/drawable-hdpi-icon.png" />
- <icon density="xhdpi" src="resources/android/icon/drawable-xhdpi-icon.png" />
- <icon density="xxhdpi" src="resources/android/icon/drawable-xxhdpi-icon.png" />
- <icon density="xxxhdpi" src="resources/android/icon/drawable-xxxhdpi-icon.png" />
- <splash density="land-ldpi" src="resources/android/splash/drawable-land-ldpi-screen.png" />
- <splash density="land-mdpi" src="resources/android/splash/drawable-land-mdpi-screen.png" />
- <splash density="land-hdpi" src="resources/android/splash/drawable-land-hdpi-screen.png" />
- <splash density="land-xhdpi" src="resources/android/splash/drawable-land-xhdpi-screen.png" />
- <splash density="land-xxhdpi" src="resources/android/splash/drawable-land-xxhdpi-screen.png" />
- <splash density="land-xxxhdpi" src="resources/android/splash/drawable-land-xxxhdpi-screen.png" />
- <splash density="port-ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png" />
- <splash density="port-mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png" />
- <splash density="port-hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png" />
- <splash density="port-xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png" />
- <splash density="port-xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png" />
- <splash density="port-xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png" />
- </platform>
- <icon src="resources/android/icon/drawable-xhdpi-icon.png" />
- <plugin name="cordova-sqlite-storage" spec="~1.4.6-pre6a" />
- <plugin name="cordova-plugin-settings-hook" spec="~0.2.3" />
- <engine name="ios" spec="~4.1.1" />
- <engine name="android" spec="~5.1.1" />
- <plugin name="cordova-plugin-photo-library" spec="~1.2.0">
- <variable name="PHOTO_LIBRARY_USAGE_DESCRIPTION" value="images to gallery" />
- </plugin>
- <plugin name="cordova-plugin-customurlscheme" spec="~4.2.0">
- <variable name="URL_SCHEME" value="zmninja" />
- <variable name="ANDROID_SCHEME" value=" " />
- <variable name="ANDROID_HOST" value=" " />
- <variable name="ANDROID_PATHPREFIX" value="/" />
- </plugin>
-</widget>
+ <content src="index.html"/>
+ <access origin="*" subdomains="true"/>
+ <access launch-external="yes" origin="mailto:*"/>
+ <allow-navigation href="*"/>
+ <allow-navigation href="http://10.6.1.6:8100"/>
+ <allow-intent href="*"/>
+ <preference name="AndroidPersistentFileLocation" value="Compatibility"/>
+ <preference name="iosPersistentFileLocation" value="Library"/>
+ <preference name="AllowInlineMediaPlayback" value="true"/>
+ <preference name="CrosswalkAnimatable" value="true"/>
+ <preference name="webviewbounce" value="false"/>
+ <preference name="UIWebViewBounce" value="false"/>
+ <preference name="StatusBarBackgroundColor" value="#2980b9"/>
+ <preference name="DisallowOverscroll" value="true"/>
+ <preference name="BackupWebStorage" value="none"/>
+ <preference name="AutoHideSplashScreen" value="false"/>
+ <preference name="ShowSplashScreenSpinner" value="false"/>
+ <preference name="SplashScreen" value="screen"/>
+ <preference name="deployment-target" value="8.0"/>
+ <preference name="SplashScreenDelay" value="300"/>
+ <preference name="SplashMaintainAspectRatio" value="true"/>
+ <preference name="FadeSplashScreen" value="false"/>
+ <preference name="BackgroundColor" value="#444444"/>
+ <feature name="StatusBar">
+ <param name="ios-package" onload="true" value="CDVStatusBar"/>
+ </feature>
+ <platform name="ios">
+ <config-file parent="NSPhotoLibraryUsageDescription" platform="ios" target="*-Info.plist">
+ <string>Store photos of events and live feeds</string>
+ </config-file>
+ <icon height="57" src="resources/ios/icon/icon.png" width="57"/>
+ <icon height="114" src="resources/ios/icon/icon@2x.png" width="114"/>
+ <icon height="40" src="resources/ios/icon/icon-40.png" width="40"/>
+ <icon height="80" src="resources/ios/icon/icon-40@2x.png" width="80"/>
+ <icon height="120" src="resources/ios/icon/icon-40@3x.png" width="120"/>
+ <icon height="50" src="resources/ios/icon/icon-50.png" width="50"/>
+ <icon height="100" src="resources/ios/icon/icon-50@2x.png" width="100"/>
+ <icon height="60" src="resources/ios/icon/icon-60.png" width="60"/>
+ <icon height="120" src="resources/ios/icon/icon-60@2x.png" width="120"/>
+ <icon height="180" src="resources/ios/icon/icon-60@3x.png" width="180"/>
+ <icon height="72" src="resources/ios/icon/icon-72.png" width="72"/>
+ <icon height="144" src="resources/ios/icon/icon-72@2x.png" width="144"/>
+ <icon height="76" src="resources/ios/icon/icon-76.png" width="76"/>
+ <icon height="152" src="resources/ios/icon/icon-76@2x.png" width="152"/>
+ <icon height="167" src="resources/ios/icon/icon-83.5@2x.png" width="167"/>
+ <icon height="29" src="resources/ios/icon/icon-small.png" width="29"/>
+ <icon height="58" src="resources/ios/icon/icon-small@2x.png" width="58"/>
+ <icon height="87" src="resources/ios/icon/icon-small@3x.png" width="87"/>
+ <splash height="1136" src="resources/ios/splash/Default-568h@2x~iphone.png" width="640"/>
+ <splash height="1334" src="resources/ios/splash/Default-667h.png" width="750"/>
+ <splash height="2208" src="resources/ios/splash/Default-736h.png" width="1242"/>
+ <splash height="1242" src="resources/ios/splash/Default-Landscape-736h.png" width="2208"/>
+ <splash height="1536" src="resources/ios/splash/Default-Landscape@2x~ipad.png" width="2048"/>
+ <splash height="768" src="resources/ios/splash/Default-Landscape~ipad.png" width="1024"/>
+ <splash height="2048" src="resources/ios/splash/Default-Portrait@2x~ipad.png" width="1536"/>
+ <splash height="1024" src="resources/ios/splash/Default-Portrait~ipad.png" width="768"/>
+ <splash height="960" src="resources/ios/splash/Default@2x~iphone.png" width="640"/>
+ <splash height="480" src="resources/ios/splash/Default~iphone.png" width="320"/>
+ </platform>
+ <platform name="android">
+ <icon density="ldpi" src="resources/android/icon/drawable-ldpi-icon.png"/>
+ <icon density="mdpi" src="resources/android/icon/drawable-mdpi-icon.png"/>
+ <icon density="hdpi" src="resources/android/icon/drawable-hdpi-icon.png"/>
+ <icon density="xhdpi" src="resources/android/icon/drawable-xhdpi-icon.png"/>
+ <icon density="xxhdpi" src="resources/android/icon/drawable-xxhdpi-icon.png"/>
+ <icon density="xxxhdpi" src="resources/android/icon/drawable-xxxhdpi-icon.png"/>
+ <splash density="land-ldpi" src="resources/android/splash/drawable-land-ldpi-screen.png"/>
+ <splash density="land-mdpi" src="resources/android/splash/drawable-land-mdpi-screen.png"/>
+ <splash density="land-hdpi" src="resources/android/splash/drawable-land-hdpi-screen.png"/>
+ <splash density="land-xhdpi" src="resources/android/splash/drawable-land-xhdpi-screen.png"/>
+ <splash density="land-xxhdpi" src="resources/android/splash/drawable-land-xxhdpi-screen.png"/>
+ <splash density="land-xxxhdpi" src="resources/android/splash/drawable-land-xxxhdpi-screen.png"/>
+ <splash density="port-ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png"/>
+ <splash density="port-mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png"/>
+ <splash density="port-hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png"/>
+ <splash density="port-xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png"/>
+ <splash density="port-xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png"/>
+ <splash density="port-xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png"/>
+ </platform>
+ <icon src="resources/android/icon/drawable-xhdpi-icon.png"/>
+ <plugin name="cordova-sqlite-storage" spec="~1.4.6-pre6a"/>
+ <plugin name="cordova-plugin-settings-hook" spec="~0.2.3"/>
+ <plugin name="cordova-plugin-photo-library" spec="~1.2.0">
+ <variable name="PHOTO_LIBRARY_USAGE_DESCRIPTION" value="images to gallery"/>
+ </plugin>
+ <plugin name="cordova-plugin-customurlscheme" spec="~4.2.0">
+ <variable name="URL_SCHEME" value="zmninja"/>
+ <variable name="ANDROID_SCHEME" value=" "/>
+ <variable name="ANDROID_HOST" value=" "/>
+ <variable name="ANDROID_PATHPREFIX" value="/"/>
+ </plugin>
+ <engine name="ios" spec="~4.1.1"/>
+ <engine name="android" spec="~5.1.1"/>
+</widget> \ No newline at end of file
diff --git a/www/index.html b/www/index.html
index 06b90ab7..fbc4d5a8 100644
--- a/www/index.html
+++ b/www/index.html
@@ -99,6 +99,7 @@
<script src="js/WizardCtrl.js"></script>
<script src="js/MenuController.js"></script>
<script src="js/EventsModalGraphCtrl.js"></script>
+ <script src="js/InvalidApiCtrl.js"></script>
</head>
<!-- <body ng-app="starter" > -->
<!-- I want to start angular only after cordova device is ready, so I'll tag it on device ready -->
diff --git a/www/js/DataModel.js b/www/js/DataModel.js
index d1afce9e..02c719ed 100644
--- a/www/js/DataModel.js
+++ b/www/js/DataModel.js
@@ -1193,11 +1193,13 @@ angular.module('zmApp.controllers')
{
if (success.data.version)
{
+ $rootScope.apiValid = true;
d.resolve(success.data.version);
}
else
{
- d.resolve("0.0.0");
+ $rootScope.apiValid = false;
+ d.reject("-1.-1.-1");
}
return (d.promise);
@@ -1206,6 +1208,7 @@ angular.module('zmApp.controllers')
{
debug("getAPIversion error handler " + JSON.stringify(error));
d.reject("-1.-1.-1");
+ $rootScope.apiValid = false;
return (d.promise);
});
return (d.promise);
diff --git a/www/js/InvalidApiCtrl.js b/www/js/InvalidApiCtrl.js
new file mode 100644
index 00000000..1c65b9fd
--- /dev/null
+++ b/www/js/InvalidApiCtrl.js
@@ -0,0 +1,37 @@
+/* jshint -W041 */
+/* jslint browser: true*/
+/* global cordova,StatusBar,angular,console */
+
+angular.module('zmApp.controllers').controller('zmApp.InvalidApiCtrl', ['$scope', '$ionicSideMenuDelegate', 'zm', '$stateParams', '$timeout', '$rootScope', function($scope, $ionicSideMenuDelegate, zm, $stateParams, $timeout, $rootScope)
+{
+ $scope.openMenu = function()
+ {
+ $ionicSideMenuDelegate.toggleLeft();
+ };
+
+ //-------------------------------------------------------------------------
+ // Controller Main
+ //------------------------------------------------------------------------
+ $scope.$on('$ionicView.enter', function()
+ {
+ console.log("**VIEW ** InvalidAPI Ctrl Entered");
+ $ionicSideMenuDelegate.canDragContent(true);
+ });
+
+ $scope.openMenu = function()
+ {
+ $timeout(function()
+ {
+ $rootScope.stateofSlide = $ionicSideMenuDelegate.isOpen();
+ }, 500);
+
+ $ionicSideMenuDelegate.toggleLeft();
+ };
+
+ $scope.readFAQ = function()
+ {
+ window.open('https://github.com/pliablepixels/zmNinja/wiki/Validating-if-APIs-work-on-ZM', '_blank', 'location=yes');
+ return false;
+ };
+
+}]);
diff --git a/www/js/PortalLoginCtrl.js b/www/js/PortalLoginCtrl.js
index 95eb72d4..6a9a9f2d 100644
--- a/www/js/PortalLoginCtrl.js
+++ b/www/js/PortalLoginCtrl.js
@@ -173,7 +173,7 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
return;
}
- if (data == "0.0.0")
+ /*if (data == "0.0.0")
{
NVRDataModel.log("2nd Auth:API getVersion succeeded but returned 0.0.0 " + JSON.stringify(data));
@@ -183,7 +183,7 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
"wizard": false
});
return;
- }
+ }*/
// coming here means continue
EventServer.refresh();
@@ -287,8 +287,7 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
{
NVRDataModel.debug("PortalLogin: auth success");
- NVRDataModel.getKeyConfigParams(1);
- NVRDataModel.getTimeZone();
+
// $state.go("login" ,{"wizard": false});
//login was ok, so get API details
NVRDataModel.getAPIversion()
@@ -319,7 +318,7 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
return;
}
- if (data == "0.0.0")
+ /*if (data == "0.0.0")
{
NVRDataModel.log("API getVersion succeeded but returned 0.0.0 " + JSON.stringify(data));
@@ -330,9 +329,12 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
});
return;
- }
+ }*/
// coming here means continue
// console.log (">>>>>>>>>>>>>>>>>>>>>>>>>NEVER");
+
+ NVRDataModel.getKeyConfigParams(1);
+ NVRDataModel.getTimeZone();
EventServer.refresh();
if ($rootScope.tappedNotification != 1)
{
@@ -367,11 +369,23 @@ angular.module('zmApp.controllers').controller('zmApp.PortalLoginCtrl', ['$ionic
},
function error(e)
{
- $state.go("login",
+
+ if ($rootScope.apiValid == true)
+ {
+ $state.go("login",
+ {
+ "wizard": false
+ });
+ return;
+ }
+ else
{
- "wizard": false
- });
+ $state.go("invalidapi");
+ return;
+ }
+
});
+
return;
}, 1000);
diff --git a/www/js/app.js b/www/js/app.js
index 7027ff42..0e7f13ee 100644
--- a/www/js/app.js
+++ b/www/js/app.js
@@ -1321,6 +1321,14 @@ angular.module('zmApp', [
{
var requireLogin = toState.data.requireLogin;
+ if ($rootScope.apiValid == false && toState.name != 'invalidapi' && toState.data.requireLogin == true)
+ {
+ event.preventDefault();
+ $state.transitionTo('invalidapi');
+ return;
+
+ }
+
if (NVRDataModel.isLoggedIn() || toState.data.requireLogin == false)
{
//console.log("State transition is authorized");
@@ -1349,6 +1357,7 @@ angular.module('zmApp', [
// if you don't prevent, states will stack
event.preventDefault();
$state.transitionTo('login');
+ return;
}
return;
@@ -1403,6 +1412,7 @@ angular.module('zmApp', [
};
$rootScope.textScaleFactor = 1.0;
+ $rootScope.apiValid = false;
$rootScope.db = null;
$rootScope.runMode = NVRDataModel.getBandwidth();
@@ -2025,6 +2035,20 @@ angular.module('zmApp', [
})
+ .state('invalidapi',
+ {
+ data:
+ {
+ requireLogin: false
+ },
+
+ cache: false,
+ url: "/invalidapi",
+ templateUrl: "templates/invalidapi.html",
+ controller: 'zmApp.InvalidApiCtrl',
+
+ })
+
.state('events-graphs',
{
data:
diff --git a/www/lang/locale-en.json b/www/lang/locale-en.json
index 769631ba..77a33f8f 100644
--- a/www/lang/locale-en.json
+++ b/www/lang/locale-en.json
@@ -149,6 +149,9 @@
"kImpMsg5" :"Reported Version",
"kImpMsg6" :"Recommended Version",
"kImpMsg7" :"Ok, got it",
+ "kInvalidAPIHeader" : "Invalid API",
+ "kInvalidAPIBody" : "API access failed. Please make sure your APIs are configured correctly. Tap on the button below to read the instructions",
+ "kInvalidAPIRead" : "Read FAQ",
"kIncreaseSize" :"increase size",
"kLanguage" :"Language",
"kLatestEvents" :"latest events",
diff --git a/www/templates/invalidapi.html b/www/templates/invalidapi.html
new file mode 100644
index 00000000..af3a6977
--- /dev/null
+++ b/www/templates/invalidapi.html
@@ -0,0 +1,30 @@
+<ion-view view-title="{{$root.appName}}" hide-nav-bar="false" hide-back-button="false" cache-view="false">
+ <ion-nav-buttons side="left">
+ <button class="button button-icon button-clear ion-navicon" ng-click="openMenu()"></button>
+ </ion-nav-buttons>
+ <ion-content class="pin-background">
+ <div style="margin-left:20px; margin-right:20px">
+ <center>
+ <br/>
+ <br/>
+ <div id="responsive-image">
+ <img src="img/authlogo.png">
+ </div>
+ <br/>
+ <span style="color:white">
+ <h2 style="color:white" class="animated bounce">{{'kInvalidAPIHeader' | translate}}</h2>
+ <br/>
+ <h4 style="color:white">{{'kInvalidAPIBody' | translate}}</h4>
+
+ <br/><br/>
+
+ <button class="button button-stable animated bounceInUp" ng-click="readFAQ()">
+ {{'kInvalidAPIRead' | translate}}</button>
+
+
+ </span>
+ </center>
+ <br/>
+ </div>
+ </ion-content>
+</ion-view>