diff --git a/.DS_Store b/.DS_Store index 6ed63658e..b4ea773fb 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/CDVStatusBar.m b/CDVStatusBar.m deleted file mode 100644 index 2ffff49e3..000000000 --- a/CDVStatusBar.m +++ /dev/null @@ -1,510 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -/* - NOTE: plugman/cordova cli should have already installed this, - but you need the value UIViewControllerBasedStatusBarAppearance - in your Info.plist as well to set the styles in iOS 7 - */ - -#import "CDVStatusBar.h" -#import -#import - -static const void *kHideStatusBar = &kHideStatusBar; -static const void *kStatusBarStyle = &kStatusBarStyle; - -@interface CDVViewController (StatusBar) - -@property (nonatomic, retain) id sb_hideStatusBar; -@property (nonatomic, retain) id sb_statusBarStyle; - -@end - -@implementation CDVViewController (StatusBar) - -@dynamic sb_hideStatusBar; -@dynamic sb_statusBarStyle; - -- (id)sb_hideStatusBar { - return objc_getAssociatedObject(self, kHideStatusBar); -} - -- (void)setSb_hideStatusBar:(id)newHideStatusBar { - objc_setAssociatedObject(self, kHideStatusBar, newHideStatusBar, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (id)sb_statusBarStyle { - return objc_getAssociatedObject(self, kStatusBarStyle); -} - -- (void)setSb_statusBarStyle:(id)newStatusBarStyle { - objc_setAssociatedObject(self, kStatusBarStyle, newStatusBarStyle, OBJC_ASSOCIATION_RETAIN_NONATOMIC); -} - -- (BOOL) prefersStatusBarHidden { - return [self.sb_hideStatusBar boolValue]; -} - -- (UIStatusBarStyle)preferredStatusBarStyle -{ - return (UIStatusBarStyle)[self.sb_statusBarStyle intValue]; -} - -@end - - -@interface CDVStatusBar () -- (void)fireTappedEvent; -- (void)updateIsVisible:(BOOL)visible; -@end - -@implementation CDVStatusBar - -- (id)settingForKey:(NSString*)key -{ - return [self.commandDelegate.settings objectForKey:[key lowercaseString]]; -} - -- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context -{ - if ([keyPath isEqual:@"statusBarHidden"]) { - NSNumber* newValue = [change objectForKey:NSKeyValueChangeNewKey]; - [self updateIsVisible:![newValue boolValue]]; - } -} - --(void)cordovaViewWillAppear:(NSNotification*)notification -{ - [self resizeWebView]; -} - --(void)statusBarDidChangeFrame:(NSNotification*)notification -{ - //add a small delay for iOS 7 ( 0.1 seconds ) - __weak CDVStatusBar* weakSelf = self; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ - [weakSelf resizeWebView]; - }); -} - -- (void)pluginInitialize -{ - BOOL isiOS7 = (IsAtLeastiOSVersion(@"7.0")); - - // init - NSNumber* uiviewControllerBasedStatusBarAppearance = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIViewControllerBasedStatusBarAppearance"]; - _uiviewControllerBasedStatusBarAppearance = (uiviewControllerBasedStatusBarAppearance == nil || [uiviewControllerBasedStatusBarAppearance boolValue]) && isiOS7; - - // observe the statusBarHidden property - [[UIApplication sharedApplication] addObserver:self forKeyPath:@"statusBarHidden" options:NSKeyValueObservingOptionNew context:NULL]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarDidChangeFrame:) name: UIApplicationDidChangeStatusBarFrameNotification object:nil]; - - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cordovaViewWillAppear:) name: @"CDVViewWillAppearNotification" object:nil]; - - _statusBarOverlaysWebView = YES; // default - - [self initializeStatusBarBackgroundView]; - - self.viewController.view.autoresizesSubviews = YES; - - NSString* setting; - - setting = @"StatusBarBackgroundColor"; - if ([self settingForKey:setting]) { - [self _backgroundColorByHexString:[self settingForKey:setting]]; - } - - setting = @"StatusBarStyle"; - if ([self settingForKey:setting]) { - [self setStatusBarStyle:[self settingForKey:setting]]; - } - - // blank scroll view to intercept status bar taps - self.webView.scrollView.scrollsToTop = NO; - UIScrollView *fakeScrollView = [[UIScrollView alloc] initWithFrame:UIScreen.mainScreen.bounds]; - fakeScrollView.delegate = self; - fakeScrollView.scrollsToTop = YES; - [self.viewController.view addSubview:fakeScrollView]; // Add scrollview to the view heirarchy so that it will begin accepting status bar taps - [self.viewController.view sendSubviewToBack:fakeScrollView]; // Send it to the very back of the view heirarchy - fakeScrollView.contentSize = CGSizeMake(UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.height * 2.0f); // Make the scroll view longer than the screen itself - fakeScrollView.contentOffset = CGPointMake(0.0f, UIScreen.mainScreen.bounds.size.height); // Scroll down so a tap will take scroll view back to the top - - _statusBarVisible = ![UIApplication sharedApplication].isStatusBarHidden; -} - -- (void)onReset { - _eventsCallbackId = nil; -} - -- (void)fireTappedEvent { - if (_eventsCallbackId == nil) { - return; - } - NSDictionary* payload = @{@"type": @"tap"}; - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:payload]; - [result setKeepCallbackAsBool:YES]; - [self.commandDelegate sendPluginResult:result callbackId:_eventsCallbackId]; -} - -- (void)updateIsVisible:(BOOL)visible { - if (_eventsCallbackId == nil) { - return; - } - CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsBool:visible]; - [result setKeepCallbackAsBool:YES]; - [self.commandDelegate sendPluginResult:result callbackId:_eventsCallbackId]; -} - -- (void) _ready:(CDVInvokedUrlCommand*)command -{ - _eventsCallbackId = command.callbackId; - [self updateIsVisible:![UIApplication sharedApplication].statusBarHidden]; - NSString* setting = @"StatusBarOverlaysWebView"; - if ([self settingForKey:setting]) { - self.statusBarOverlaysWebView = [(NSNumber*)[self settingForKey:setting] boolValue]; - if (self.statusBarOverlaysWebView) { - [self resizeWebView]; - } - } -} - -- (void) initializeStatusBarBackgroundView -{ - CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame; - - if ([[UIApplication sharedApplication]statusBarOrientation] == UIInterfaceOrientationPortraitUpsideDown && - statusBarFrame.size.height + statusBarFrame.origin.y == [self.viewController.view.window bounds].size.height) { - - // When started in upside-down orientation on iOS 7, status bar will be bound to lower edge of the - // screen (statusBarFrame.origin.y will be somewhere around screen height). In this case we need to - // correct frame's coordinates - statusBarFrame.origin.y = 0; - } - - statusBarFrame = [self invertFrameIfNeeded:statusBarFrame]; - - _statusBarBackgroundView = [[UIView alloc] initWithFrame:statusBarFrame]; - _statusBarBackgroundView.backgroundColor = _statusBarBackgroundColor; - _statusBarBackgroundView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin); - _statusBarBackgroundView.autoresizesSubviews = YES; -} - -- (CGRect) invertFrameIfNeeded:(CGRect)rect { - // landscape is where (width > height). On iOS < 8, we need to invert since frames are - // always in Portrait context. Do not run this on ios 8 or above to avoid breaking ipad pro multitask layout - if (!IsAtLeastiOSVersion(@"8.0") && UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) { - CGFloat temp = rect.size.width; - rect.size.width = rect.size.height; - rect.size.height = temp; - rect.origin = CGPointZero; - } - - return rect; -} - -- (void) setStatusBarOverlaysWebView:(BOOL)statusBarOverlaysWebView -{ - // we only care about the latest iOS version or a change in setting - if (!IsAtLeastiOSVersion(@"7.0") || statusBarOverlaysWebView == _statusBarOverlaysWebView) { - return; - } - - _statusBarOverlaysWebView = statusBarOverlaysWebView; - - [self resizeWebView]; - - if (statusBarOverlaysWebView) { - - [_statusBarBackgroundView removeFromSuperview]; - - } else { - - [self initializeStatusBarBackgroundView]; - [self.webView.superview addSubview:_statusBarBackgroundView]; - - } - -} - -- (BOOL) statusBarOverlaysWebView -{ - return _statusBarOverlaysWebView; -} - -- (void) overlaysWebView:(CDVInvokedUrlCommand*)command -{ - id value = [command argumentAtIndex:0]; - if (!([value isKindOfClass:[NSNumber class]])) { - value = [NSNumber numberWithBool:YES]; - } - - self.statusBarOverlaysWebView = [value boolValue]; -} - -- (void) refreshStatusBarAppearance -{ - SEL sel = NSSelectorFromString(@"setNeedsStatusBarAppearanceUpdate"); - if ([self.viewController respondsToSelector:sel]) { -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - [self.viewController performSelector:sel withObject:nil]; -#pragma clang diagnostic pop - } -} - -- (void) setStyleForStatusBar:(UIStatusBarStyle)style -{ - if (_uiviewControllerBasedStatusBarAppearance) { - CDVViewController* vc = (CDVViewController*)self.viewController; - vc.sb_statusBarStyle = [NSNumber numberWithInt:style]; - [self refreshStatusBarAppearance]; - - } else { - [[UIApplication sharedApplication] setStatusBarStyle:style]; - } -} - -- (void) setStatusBarStyle:(NSString*)statusBarStyle -{ - // default, lightContent, blackTranslucent, blackOpaque - NSString* lcStatusBarStyle = [statusBarStyle lowercaseString]; - - if ([lcStatusBarStyle isEqualToString:@"default"]) { - [self styleDefault:nil]; - } else if ([lcStatusBarStyle isEqualToString:@"lightcontent"]) { - [self styleLightContent:nil]; - } else if ([lcStatusBarStyle isEqualToString:@"blacktranslucent"]) { - [self styleBlackTranslucent:nil]; - } else if ([lcStatusBarStyle isEqualToString:@"blackopaque"]) { - [self styleBlackOpaque:nil]; - } -} - -- (void) styleDefault:(CDVInvokedUrlCommand*)command -{ - [self setStyleForStatusBar:UIStatusBarStyleDefault]; -} - -- (void) styleLightContent:(CDVInvokedUrlCommand*)command -{ - [self setStyleForStatusBar:UIStatusBarStyleLightContent]; -} - -- (void) styleBlackTranslucent:(CDVInvokedUrlCommand*)command -{ - #if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000 - # define TRANSLUCENT_STYLE UIStatusBarStyleBlackTranslucent - #else - # define TRANSLUCENT_STYLE UIStatusBarStyleLightContent - #endif - [self setStyleForStatusBar:TRANSLUCENT_STYLE]; -} - -- (void) styleBlackOpaque:(CDVInvokedUrlCommand*)command -{ - #if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000 - # define OPAQUE_STYLE UIStatusBarStyleBlackOpaque - #else - # define OPAQUE_STYLE UIStatusBarStyleLightContent - #endif - [self setStyleForStatusBar:OPAQUE_STYLE]; -} - -- (void) backgroundColorByName:(CDVInvokedUrlCommand*)command -{ - id value = [command argumentAtIndex:0]; - if (!([value isKindOfClass:[NSString class]])) { - value = @"black"; - } - - SEL selector = NSSelectorFromString([value stringByAppendingString:@"Color"]); - if ([UIColor respondsToSelector:selector]) { - _statusBarBackgroundView.backgroundColor = [UIColor performSelector:selector]; - } -} - -- (void) _backgroundColorByHexString:(NSString*)hexString -{ - unsigned int rgbValue = 0; - NSScanner* scanner = [NSScanner scannerWithString:hexString]; - [scanner setScanLocation:1]; - [scanner scanHexInt:&rgbValue]; - - _statusBarBackgroundColor = [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16)/255.0 green:((rgbValue & 0xFF00) >> 8)/255.0 blue:(rgbValue & 0xFF)/255.0 alpha:1.0]; - _statusBarBackgroundView.backgroundColor = _statusBarBackgroundColor; -} - -- (void) backgroundColorByHexString:(CDVInvokedUrlCommand*)command -{ - NSString* value = [command argumentAtIndex:0]; - if (!([value isKindOfClass:[NSString class]])) { - value = @"#000000"; - } - - if (![value hasPrefix:@"#"] || [value length] < 7) { - return; - } - - [self _backgroundColorByHexString:value]; -} - -- (void) hideStatusBar -{ - if (_uiviewControllerBasedStatusBarAppearance) { - CDVViewController* vc = (CDVViewController*)self.viewController; - vc.sb_hideStatusBar = [NSNumber numberWithBool:YES]; - [self refreshStatusBarAppearance]; - - } else { - UIApplication* app = [UIApplication sharedApplication]; - [app setStatusBarHidden:YES]; - } -} - -- (void) hide:(CDVInvokedUrlCommand*)command -{ - _statusBarVisible = NO; - UIApplication* app = [UIApplication sharedApplication]; - - if (!app.isStatusBarHidden) - { - - [self hideStatusBar]; - - if (IsAtLeastiOSVersion(@"7.0")) { - [_statusBarBackgroundView removeFromSuperview]; - } - - [self resizeWebView]; - - _statusBarBackgroundView.hidden = YES; - } -} - -- (void) showStatusBar -{ - if (_uiviewControllerBasedStatusBarAppearance) { - CDVViewController* vc = (CDVViewController*)self.viewController; - vc.sb_hideStatusBar = [NSNumber numberWithBool:NO]; - [self refreshStatusBarAppearance]; - - } else { - UIApplication* app = [UIApplication sharedApplication]; - [app setStatusBarHidden:NO]; - } -} - -- (void) show:(CDVInvokedUrlCommand*)command -{ - _statusBarVisible = YES; - UIApplication* app = [UIApplication sharedApplication]; - - if (app.isStatusBarHidden) - { - BOOL isIOS7 = (IsAtLeastiOSVersion(@"7.0")); - - [self showStatusBar]; - [self resizeWebView]; - - if (isIOS7) { - - if (!self.statusBarOverlaysWebView) { - - // there is a possibility that when the statusbar was hidden, it was in a different orientation - // from the current one. Therefore we need to expand the statusBarBackgroundView as well to the - // statusBar's current size - CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame; - statusBarFrame = [self invertFrameIfNeeded:statusBarFrame]; - CGRect sbBgFrame = _statusBarBackgroundView.frame; - sbBgFrame.size = statusBarFrame.size; - _statusBarBackgroundView.frame = sbBgFrame; - [self.webView.superview addSubview:_statusBarBackgroundView]; - - } - - } - - _statusBarBackgroundView.hidden = NO; - } -} - --(void)resizeWebView -{ - BOOL isIOS7 = (IsAtLeastiOSVersion(@"7.0")); - BOOL isIOS11 = (IsAtLeastiOSVersion(@"11.0")); - if (isIOS7) { - CGRect bounds = [self.viewController.view.window bounds]; - if (CGRectEqualToRect(bounds, CGRectZero)) { - bounds = [[UIScreen mainScreen] bounds]; - } - bounds = [self invertFrameIfNeeded:bounds]; - - self.viewController.view.frame = bounds; - - self.webView.frame = bounds; - - CGRect statusBarFrame = [UIApplication sharedApplication].statusBarFrame; - statusBarFrame = [self invertFrameIfNeeded:statusBarFrame]; - CGRect frame = self.webView.frame; - CGFloat height = statusBarFrame.size.height; - - if (!self.statusBarOverlaysWebView) { - if (_statusBarVisible) { - // CB-10158 If a full screen video is playing the status bar height will be 0, set it to 20 if _statusBarVisible - frame.origin.y = height > 0 ? height: 20; - } - } else { - if (isIOS11){ -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 - // iOS 11 has "safe-areas" meant for universal margins and odd screen sizings...looking at you iphoneX - float safeAreaTop = self.webView.safeAreaInsets.top; - frame.origin.y = height >= safeAreaTop ? height - safeAreaTop : 0; -#endif - } else { - // Even if overlay is used, we want to handle in-call/recording/hotspot larger status bar - frame.origin.y = height >= 20 ? height - 20 : 0; - - } - } - frame.size.height -= frame.origin.y; - self.webView.frame = frame; - } else { - CGRect bounds = [[UIScreen mainScreen] applicationFrame]; - self.viewController.view.frame = bounds; - } -} - -- (void) dealloc -{ - [[UIApplication sharedApplication] removeObserver:self forKeyPath:@"statusBarHidden"]; - [[NSNotificationCenter defaultCenter]removeObserver:self name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; -} - - -#pragma mark - UIScrollViewDelegate - -- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView -{ - [self fireTappedEvent]; - return NO; -} - -@end diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..de02c1e66 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,1008 @@ +# Change Log + +## [v1.2.41](https://github.com/pliablepixels/zmNinja/tree/v1.2.41) (2017-04-11) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.40...v1.2.41) + +**Implemented enhancements:** + +- Implement concept of 'default profile' & 'workspace' in Montage [\#509](https://github.com/pliablepixels/zmNinja/issues/509) +- Allow for montage scaling at increments of 5% \(currently 10%\) [\#505](https://github.com/pliablepixels/zmNinja/issues/505) +- In monitor list \(Montage screen\) make the color of disabled monitors more prominent [\#503](https://github.com/pliablepixels/zmNinja/issues/503) + +**Fixed bugs:** + +- Montage profile showing new monitors automatically [\#504](https://github.com/pliablepixels/zmNinja/issues/504) +- Video playback \(h264\) breaks on iOS with a config.xml setting [\#501](https://github.com/pliablepixels/zmNinja/issues/501) + +**Closed issues:** + +- Add support for manual disable/enable alarms [\#507](https://github.com/pliablepixels/zmNinja/issues/507) +- When zoneminder is in contineous record mode zmNinja shows no events [\#502](https://github.com/pliablepixels/zmNinja/issues/502) +- 2 Monitors - But only only one show up in "Event List" [\#500](https://github.com/pliablepixels/zmNinja/issues/500) +- Google independent zmNinja via F-Droid or downloadable packages \(apk\) [\#498](https://github.com/pliablepixels/zmNinja/issues/498) +- iOS app frozen after being in background [\#482](https://github.com/pliablepixels/zmNinja/issues/482) + +**Merged pull requests:** + +- montage profile save - show existing list too [\#511](https://github.com/pliablepixels/zmNinja/pull/511) ([maymaymay](https://github.com/maymaymay)) +- \#509 - default profile for all monitors and "workspace" [\#510](https://github.com/pliablepixels/zmNinja/pull/510) ([maymaymay](https://github.com/maymaymay)) + +## [v1.2.40](https://github.com/pliablepixels/zmNinja/tree/v1.2.40) (2017-03-19) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.39...v1.2.40) + +**Fixed bugs:** + +- Problem with notifications. [\#468](https://github.com/pliablepixels/zmNinja/issues/468) +- Login denied for user "" when not using ZM authentication [\#459](https://github.com/pliablepixels/zmNinja/issues/459) + +**Closed issues:** + +- Timezone incorrect [\#492](https://github.com/pliablepixels/zmNinja/issues/492) + +**Merged pull requests:** + +- Update locale-de.json [\#497](https://github.com/pliablepixels/zmNinja/pull/497) ([florie1706](https://github.com/florie1706)) +- Update locale-fr 1.2.39 [\#495](https://github.com/pliablepixels/zmNinja/pull/495) ([cryptage21](https://github.com/cryptage21)) +- Buttons in this view were the wrong way around [\#494](https://github.com/pliablepixels/zmNinja/pull/494) ([florie1706](https://github.com/florie1706)) +- Change languages to their mother tongue [\#493](https://github.com/pliablepixels/zmNinja/pull/493) ([florie1706](https://github.com/florie1706)) + +## [v1.2.39](https://github.com/pliablepixels/zmNinja/tree/v1.2.39) (2017-03-04) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.38...v1.2.39) + +**Implemented enhancements:** + +- French Translation [\#469](https://github.com/pliablepixels/zmNinja/issues/469) +- New language: German [\#466](https://github.com/pliablepixels/zmNinja/issues/466) + +**Fixed bugs:** + +- \(timeout\) "Zoneminder Authentication Failed" even though Zoneminder's logs says authentication was successful [\#487](https://github.com/pliablepixels/zmNinja/issues/487) +- Can't get out of fullscreen mode \(confirmed on win64\) [\#473](https://github.com/pliablepixels/zmNinja/issues/473) + +**Closed issues:** + +- Update source build to use new versions of Cordova/Ionic [\#491](https://github.com/pliablepixels/zmNinja/issues/491) +- Launch zmNinja via iOS app URL scheme [\#467](https://github.com/pliablepixels/zmNinja/issues/467) +- zmNinja complied from sources for Android and push notification [\#464](https://github.com/pliablepixels/zmNinja/issues/464) +- \[Desktop/Windows\]Window placement and size is not preserved across multiple sessions. [\#462](https://github.com/pliablepixels/zmNinja/issues/462) +- Cycle Montage [\#460](https://github.com/pliablepixels/zmNinja/issues/460) +- view streaming video inside ionic with iOS 10.2.1? [\#458](https://github.com/pliablepixels/zmNinja/issues/458) +- missing event only shown with Filters [\#445](https://github.com/pliablepixels/zmNinja/issues/445) +- FAB action buttons are confusing [\#204](https://github.com/pliablepixels/zmNinja/issues/204) + +**Merged pull requests:** + +- \#487 - devoption added to increase HTTP timeouts [\#490](https://github.com/pliablepixels/zmNinja/pull/490) ([florie1706](https://github.com/florie1706)) +- \#487 - devoption added to increase HTTP timeouts [\#489](https://github.com/pliablepixels/zmNinja/pull/489) ([cryptage21](https://github.com/cryptage21)) +- \#487 - devoption added to increase HTTP timeouts [\#488](https://github.com/pliablepixels/zmNinja/pull/488) ([maymaymay](https://github.com/maymaymay)) +- Fixes for some bad German translations [\#486](https://github.com/pliablepixels/zmNinja/pull/486) ([florie1706](https://github.com/florie1706)) +- zmNinja removed from translation [\#485](https://github.com/pliablepixels/zmNinja/pull/485) ([florie1706](https://github.com/florie1706)) +- clarified menu option [\#481](https://github.com/pliablepixels/zmNinja/pull/481) ([florie1706](https://github.com/florie1706)) +- clarified menu option [\#480](https://github.com/pliablepixels/zmNinja/pull/480) ([maymaymay](https://github.com/maymaymay)) +- French Language - Update 1 [\#479](https://github.com/pliablepixels/zmNinja/pull/479) ([cryptage21](https://github.com/cryptage21)) +- Update locale-de.json [\#478](https://github.com/pliablepixels/zmNinja/pull/478) ([florie1706](https://github.com/florie1706)) +- more fixes [\#474](https://github.com/pliablepixels/zmNinja/pull/474) ([florie1706](https://github.com/florie1706)) +- Fixed some translations for a better understanding [\#472](https://github.com/pliablepixels/zmNinja/pull/472) ([florie1706](https://github.com/florie1706)) +- wrong wording [\#471](https://github.com/pliablepixels/zmNinja/pull/471) ([florie1706](https://github.com/florie1706)) +- fixed some typos [\#470](https://github.com/pliablepixels/zmNinja/pull/470) ([florie1706](https://github.com/florie1706)) +- Create locale-de.json [\#465](https://github.com/pliablepixels/zmNinja/pull/465) ([florie1706](https://github.com/florie1706)) +- spanish update [\#463](https://github.com/pliablepixels/zmNinja/pull/463) ([fxrnando](https://github.com/fxrnando)) +- android and iOS ports now allow for strict SSL checks... [\#461](https://github.com/pliablepixels/zmNinja/pull/461) ([maymaymay](https://github.com/maymaymay)) + +## [v1.2.38](https://github.com/pliablepixels/zmNinja/tree/v1.2.38) (2017-02-17) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.37...v1.2.38) + +**Implemented enhancements:** + +- SSL - add an option that either requires self signed certs installed on phones or will only work with real certs [\#455](https://github.com/pliablepixels/zmNinja/issues/455) +- Allow users to hide MP4/GIF buttons [\#454](https://github.com/pliablepixels/zmNinja/issues/454) +- make MP4 playback speed configurable \(and persistent\) [\#453](https://github.com/pliablepixels/zmNinja/issues/453) + +**Merged pull requests:** + +- let's make GIF and MP4 an option in Dev Settings \#454 [\#456](https://github.com/pliablepixels/zmNinja/pull/456) ([maymaymay](https://github.com/maymaymay)) + +## [v1.2.37](https://github.com/pliablepixels/zmNinja/tree/v1.2.37) (2017-02-11) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.36...v1.2.37) + +**Implemented enhancements:** + +- Add ability to view server logs [\#452](https://github.com/pliablepixels/zmNinja/issues/452) +- Add ability to reflow montage without resetting size [\#448](https://github.com/pliablepixels/zmNinja/issues/448) + +**Fixed bugs:** + +- wizard often does not detect cgi-bin [\#451](https://github.com/pliablepixels/zmNinja/issues/451) +- fs command line option not working [\#450](https://github.com/pliablepixels/zmNinja/issues/450) + +**Closed issues:** + +- Montage Image Scale not Saving on Win x64 [\#447](https://github.com/pliablepixels/zmNinja/issues/447) +- Side menu scroll feature locks after switching servers OR displaying liveview in landscape [\#337](https://github.com/pliablepixels/zmNinja/issues/337) + +**Merged pull requests:** + +- Translations [\#446](https://github.com/pliablepixels/zmNinja/pull/446) ([maymaymay](https://github.com/maymaymay)) + +## [v1.2.36](https://github.com/pliablepixels/zmNinja/tree/v1.2.36) (2017-02-06) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.35...v1.2.36) + +**Implemented enhancements:** + +- Add ability to hide grey buttons in single monitor view [\#443](https://github.com/pliablepixels/zmNinja/issues/443) +- Desktop app opening maximized, in full screen montage view [\#436](https://github.com/pliablepixels/zmNinja/issues/436) +- Adding Dutch Language Files [\#433](https://github.com/pliablepixels/zmNinja/issues/433) +- Allow for archived events to be displayed or hidden \(based on toggle switch\) [\#432](https://github.com/pliablepixels/zmNinja/issues/432) +- Enhancement: Add event names to Event list view [\#431](https://github.com/pliablepixels/zmNinja/issues/431) +- server settings - confirm deletion [\#423](https://github.com/pliablepixels/zmNinja/issues/423) +- Add ability to view zones as overlays on live monitor feed [\#420](https://github.com/pliablepixels/zmNinja/issues/420) +- Add ability to cycle between montage profiles [\#419](https://github.com/pliablepixels/zmNinja/issues/419) +- Adding Dutch language [\#387](https://github.com/pliablepixels/zmNinja/issues/387) +- Hide credentials of simple auth in display [\#363](https://github.com/pliablepixels/zmNinja/issues/363) + +**Fixed bugs:** + +- switching from full screen to regular causes header alignment issues\(iOS only\) [\#429](https://github.com/pliablepixels/zmNinja/issues/429) +- when bulk frames are present, frame view while viewing footage goes wrong [\#428](https://github.com/pliablepixels/zmNinja/issues/428) +- display cgi-bin error if a wrong cgi path is set in login even if you don't tap save [\#427](https://github.com/pliablepixels/zmNinja/issues/427) +- Fallback Server Hangup [\#424](https://github.com/pliablepixels/zmNinja/issues/424) +- Cannot delete events [\#422](https://github.com/pliablepixels/zmNinja/issues/422) +- restricted users for event notification not working [\#391](https://github.com/pliablepixels/zmNinja/issues/391) + +**Closed issues:** + +- Hard coded text found [\#440](https://github.com/pliablepixels/zmNinja/issues/440) +- Hard coded text alert found [\#437](https://github.com/pliablepixels/zmNinja/issues/437) +- Typo in Validating-if-APIs-work-on-ZM page \(events instead of events.json\): [\#421](https://github.com/pliablepixels/zmNinja/issues/421) +- event server settings - Strange Behaviour [\#414](https://github.com/pliablepixels/zmNinja/issues/414) + +**Merged pull requests:** + +- 440 hard coded text found [\#442](https://github.com/pliablepixels/zmNinja/pull/442) ([steelyard-nl](https://github.com/steelyard-nl)) +- sorted keys \#437 [\#439](https://github.com/pliablepixels/zmNinja/pull/439) ([maymaymay](https://github.com/maymaymay)) +- 437 hard coded text alert found [\#438](https://github.com/pliablepixels/zmNinja/pull/438) ([steelyard-nl](https://github.com/steelyard-nl)) +- 433 adding dutch language files [\#435](https://github.com/pliablepixels/zmNinja/pull/435) ([steelyard-nl](https://github.com/steelyard-nl)) +- you can now toggle a dev option to hide/unhide archived \(flagged\) ev… [\#434](https://github.com/pliablepixels/zmNinja/pull/434) ([maymaymay](https://github.com/maymaymay)) +- Translation update to \#423 [\#425](https://github.com/pliablepixels/zmNinja/pull/425) ([maymaymay](https://github.com/maymaymay)) + +## [v1.2.35](https://github.com/pliablepixels/zmNinja/tree/v1.2.35) (2016-12-31) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.34...v1.2.35) + +**Implemented enhancements:** + +- Add ability to show motion outlines in alarm frames \(if enabled in ZM\) [\#417](https://github.com/pliablepixels/zmNinja/issues/417) +- Archive selected events [\#388](https://github.com/pliablepixels/zmNinja/issues/388) + +**Merged pull requests:** + +- Eci peci z tłumaczeniem ;\) Happy New Year!!! [\#418](https://github.com/pliablepixels/zmNinja/pull/418) ([maymaymay](https://github.com/maymaymay)) +- Translation update [\#416](https://github.com/pliablepixels/zmNinja/pull/416) ([maymaymay](https://github.com/maymaymay)) + +## [v1.2.34](https://github.com/pliablepixels/zmNinja/tree/v1.2.34) (2016-12-24) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.33...v1.2.34) + +**Implemented enhancements:** + +- Add ability to launch app via URL for external integration [\#411](https://github.com/pliablepixels/zmNinja/issues/411) +- Allow for pinning and hiding monitors during rearranging in montage [\#409](https://github.com/pliablepixels/zmNinja/issues/409) + +**Fixed bugs:** + +- First time users - app gets locked if APIs are not configured \[Mostly Android\] [\#415](https://github.com/pliablepixels/zmNinja/issues/415) + +**Closed issues:** + +- Missing translations Russian [\#412](https://github.com/pliablepixels/zmNinja/issues/412) +- Missing translations for popup buttons [\#410](https://github.com/pliablepixels/zmNinja/issues/410) +- Mobile unable to connect to the event server [\#403](https://github.com/pliablepixels/zmNinja/issues/403) +- Download events as avi,mov, even mp4 videos [\#334](https://github.com/pliablepixels/zmNinja/issues/334) + +**Merged pull requests:** + +- New items [\#413](https://github.com/pliablepixels/zmNinja/pull/413) ([BoskSpb](https://github.com/BoskSpb)) + +## [v1.2.33](https://github.com/pliablepixels/zmNinja/tree/v1.2.33) (2016-12-09) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.32...v1.2.33) + +## [v1.2.32](https://github.com/pliablepixels/zmNinja/tree/v1.2.32) (2016-12-09) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.31...v1.2.32) + +**Implemented enhancements:** + +- Montage Camera Groups [\#397](https://github.com/pliablepixels/zmNinja/issues/397) +- Multiple selectable/saveable 'Montage' views within a server profile [\#390](https://github.com/pliablepixels/zmNinja/issues/390) + +**Fixed bugs:** + +- In some cases, events screen shows no events - even though there are events [\#408](https://github.com/pliablepixels/zmNinja/issues/408) + +**Closed issues:** + +- Translation issue [\#400](https://github.com/pliablepixels/zmNinja/issues/400) + +**Merged pull requests:** + +- translation updates [\#407](https://github.com/pliablepixels/zmNinja/pull/407) ([maymaymay](https://github.com/maymaymay)) +- Updated Portuguese Translation [\#406](https://github.com/pliablepixels/zmNinja/pull/406) ([ljpinho](https://github.com/ljpinho)) +- spanish language update translations and modifying an instruction lin… [\#404](https://github.com/pliablepixels/zmNinja/pull/404) ([fxrnando](https://github.com/fxrnando)) +- Updated 3 missing keys [\#402](https://github.com/pliablepixels/zmNinja/pull/402) ([maymaymay](https://github.com/maymaymay)) +- Translation update [\#399](https://github.com/pliablepixels/zmNinja/pull/399) ([maymaymay](https://github.com/maymaymay)) +- Translation updates [\#396](https://github.com/pliablepixels/zmNinja/pull/396) ([maymaymay](https://github.com/maymaymay)) +- Translation adjustments. [\#393](https://github.com/pliablepixels/zmNinja/pull/393) ([maymaymay](https://github.com/maymaymay)) +- Translation updates to \#383 [\#392](https://github.com/pliablepixels/zmNinja/pull/392) ([maymaymay](https://github.com/maymaymay)) + +## [v1.2.31](https://github.com/pliablepixels/zmNinja/tree/v1.2.31) (2016-12-02) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.30...v1.2.31) + +**Fixed bugs:** + +- \[H.264\] Cue position: player reports incorrect length [\#395](https://github.com/pliablepixels/zmNinja/issues/395) +- hardcoded phrases in code \(not using translation files\) [\#394](https://github.com/pliablepixels/zmNinja/issues/394) + +**Closed issues:** + +- rewrite GIFcreation to be able to handle much larger images [\#398](https://github.com/pliablepixels/zmNinja/issues/398) + +## [v1.2.30](https://github.com/pliablepixels/zmNinja/tree/v1.2.30) (2016-11-26) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.29...v1.2.30) + +**Implemented enhancements:** + +- Add ability to download mp4 files: if using feature-264 [\#383](https://github.com/pliablepixels/zmNinja/issues/383) +- \[H264\] Playback speed in event player [\#382](https://github.com/pliablepixels/zmNinja/issues/382) +- \[h264\] add cue points in video player for alarmed frames [\#381](https://github.com/pliablepixels/zmNinja/issues/381) +- Add ability to save animated gif version of event \(alarm frames only\) [\#379](https://github.com/pliablepixels/zmNinja/issues/379) + +**Closed issues:** + +- \[BUG\] Window title does not change to 'Events' when in events view [\#389](https://github.com/pliablepixels/zmNinja/issues/389) +- adding spanish language [\#384](https://github.com/pliablepixels/zmNinja/issues/384) +- Monitor configuration change hangs on FreeBSD-11 [\#373](https://github.com/pliablepixels/zmNinja/issues/373) + +**Merged pull requests:** + +- Translation updates. [\#386](https://github.com/pliablepixels/zmNinja/pull/386) ([maymaymay](https://github.com/maymaymay)) +- 384 spanish trans [\#385](https://github.com/pliablepixels/zmNinja/pull/385) ([fxrnando](https://github.com/fxrnando)) +- more minor fixes [\#378](https://github.com/pliablepixels/zmNinja/pull/378) ([maymaymay](https://github.com/maymaymay)) +- minor fixes [\#377](https://github.com/pliablepixels/zmNinja/pull/377) ([maymaymay](https://github.com/maymaymay)) +- minor fixes [\#376](https://github.com/pliablepixels/zmNinja/pull/376) ([maymaymay](https://github.com/maymaymay)) + +## [v1.2.29](https://github.com/pliablepixels/zmNinja/tree/v1.2.29) (2016-11-16) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.28...v1.2.29) + +**Implemented enhancements:** + +- New language: Polish \(credit @maymaymay\) [\#372](https://github.com/pliablepixels/zmNinja/issues/372) +- \[NFR\] Add button 'Now' to timeline screen [\#371](https://github.com/pliablepixels/zmNinja/issues/371) +- Add Russian language \(credit @BoskSpb\) [\#366](https://github.com/pliablepixels/zmNinja/issues/366) +- \[H264\] Time overlay during playback [\#362](https://github.com/pliablepixels/zmNinja/issues/362) +- Option to fit to screen on H264 event playback [\#358](https://github.com/pliablepixels/zmNinja/issues/358) + +**Fixed bugs:** + +- On certain samsung phones, autocorrect makes it hard to enter text in input configuration [\#367](https://github.com/pliablepixels/zmNinja/issues/367) +- When navigating events using prev/next or gapless, it shows all events including ones with 0 alarms [\#113](https://github.com/pliablepixels/zmNinja/issues/113) + +**Closed issues:** + +- Timeline dynamic updates issue [\#369](https://github.com/pliablepixels/zmNinja/issues/369) + +**Merged pull requests:** + +- Polish language name modyfication [\#375](https://github.com/pliablepixels/zmNinja/pull/375) ([maymaymay](https://github.com/maymaymay)) +- added the enhancement label [\#374](https://github.com/pliablepixels/zmNinja/pull/374) ([maymaymay](https://github.com/maymaymay)) +- Create help-pl.html [\#370](https://github.com/pliablepixels/zmNinja/pull/370) ([maymaymay](https://github.com/maymaymay)) +- Create locale-pl.json [\#368](https://github.com/pliablepixels/zmNinja/pull/368) ([maymaymay](https://github.com/maymaymay)) +- Adding Russian language in App [\#365](https://github.com/pliablepixels/zmNinja/pull/365) ([BoskSpb](https://github.com/BoskSpb)) + +## [v1.2.28](https://github.com/pliablepixels/zmNinja/tree/v1.2.28) (2016-11-08) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v/1.2.28...v1.2.28) + +## [v/1.2.28](https://github.com/pliablepixels/zmNinja/tree/v/1.2.28) (2016-11-08) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.26...v/1.2.28) + +**Implemented enhancements:** + +- \[DESKTOP\] \(H264\) Automatic playback? [\#359](https://github.com/pliablepixels/zmNinja/issues/359) +- Remember last state of application \(desktops\) [\#357](https://github.com/pliablepixels/zmNinja/issues/357) +- Allow option for timeline view to get dynamically updated as new events occur [\#356](https://github.com/pliablepixels/zmNinja/issues/356) +- Differentiate between server timezone and local timezone \(needs ZM API Update \#1655\) [\#353](https://github.com/pliablepixels/zmNinja/issues/353) + +**Fixed bugs:** + +- Cancel timeline custom range settings leads to indefinitely 'working on graph data' [\#360](https://github.com/pliablepixels/zmNinja/issues/360) +- alarm frame navigation while watching event footage shows incorrect frames [\#354](https://github.com/pliablepixels/zmNinja/issues/354) +- iOS Websockets stopped working with latest updates [\#352](https://github.com/pliablepixels/zmNinja/issues/352) +- Android \< 5.0 has SSL cert issues [\#351](https://github.com/pliablepixels/zmNinja/issues/351) +- Try and solve the montage overlapping when the image doesn't fully load [\#350](https://github.com/pliablepixels/zmNinja/issues/350) + +**Closed issues:** + +- view=view\_video mode is not working \(requires ZM patch\) [\#364](https://github.com/pliablepixels/zmNinja/issues/364) +- Can't load as a web page on Android since d76cf1c commit [\#355](https://github.com/pliablepixels/zmNinja/issues/355) + +## [v1.2.26](https://github.com/pliablepixels/zmNinja/tree/v1.2.26) (2016-10-13) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.24...v1.2.26) + +**Implemented enhancements:** + +- simplify event montage UX [\#348](https://github.com/pliablepixels/zmNinja/issues/348) +- Show actual \(server\) time in visible in full screen \(desktop\) [\#346](https://github.com/pliablepixels/zmNinja/issues/346) +- Implement "shrinking headers" as you scroll to get more real estate [\#342](https://github.com/pliablepixels/zmNinja/issues/342) +- Add Montage Awesomeness to Event Montage [\#201](https://github.com/pliablepixels/zmNinja/issues/201) + +**Fixed bugs:** + +- Make events list work with system font size [\#339](https://github.com/pliablepixels/zmNinja/issues/339) +- IOS 10 - crash on image save to photo albums [\#338](https://github.com/pliablepixels/zmNinja/issues/338) + +**Closed issues:** + +- Montage Not working [\#343](https://github.com/pliablepixels/zmNinja/issues/343) +- Show an error message if event server connection fail [\#341](https://github.com/pliablepixels/zmNinja/issues/341) +- adding download button for video events [\#235](https://github.com/pliablepixels/zmNinja/issues/235) + +**Merged pull requests:** + +- Montage jazz [\#349](https://github.com/pliablepixels/zmNinja/pull/349) ([pliablepixels](https://github.com/pliablepixels)) +- fixes issue \#337 [\#344](https://github.com/pliablepixels/zmNinja/pull/344) ([PartialVolume](https://github.com/PartialVolume)) +- initial experiments [\#340](https://github.com/pliablepixels/zmNinja/pull/340) ([pliablepixels](https://github.com/pliablepixels)) + +## [v1.2.24](https://github.com/pliablepixels/zmNinja/tree/v1.2.24) (2016-09-24) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.19...v1.2.24) + +**Implemented enhancements:** + +- Arabic language implementation \(credit @aljabr\) [\#336](https://github.com/pliablepixels/zmNinja/issues/336) +- enable low bandwidth mode for zmN [\#321](https://github.com/pliablepixels/zmNinja/issues/321) + +**Fixed bugs:** + +- Yellow Event Summary Window \(Ionic pullup footer\) displays no data when dragged up. [\#333](https://github.com/pliablepixels/zmNinja/issues/333) +- No live view \(via monitor, not montage\) after switching between servers. [\#329](https://github.com/pliablepixels/zmNinja/issues/329) +- languages with non-english numbers break events/timeline feeds [\#325](https://github.com/pliablepixels/zmNinja/issues/325) +- "Error - unable to save snapshot" on Android V6 [\#322](https://github.com/pliablepixels/zmNinja/issues/322) + +**Closed issues:** + +- Syntax error: newline unexpected [\#335](https://github.com/pliablepixels/zmNinja/issues/335) +- v [\#332](https://github.com/pliablepixels/zmNinja/issues/332) +- Validate From/To date in Event Filter [\#330](https://github.com/pliablepixels/zmNinja/issues/330) +- IOS status bar [\#324](https://github.com/pliablepixels/zmNinja/issues/324) +- ZMNinja for Kodi [\#311](https://github.com/pliablepixels/zmNinja/issues/311) +- zmNinja for Windows Mobile [\#299](https://github.com/pliablepixels/zmNinja/issues/299) + +**Merged pull requests:** + +- add more translate [\#331](https://github.com/pliablepixels/zmNinja/pull/331) ([aljabr](https://github.com/aljabr)) +- all new key on -en file translated [\#328](https://github.com/pliablepixels/zmNinja/pull/328) ([mcbittech](https://github.com/mcbittech)) +- New keys translated. [\#323](https://github.com/pliablepixels/zmNinja/pull/323) ([ljpinho](https://github.com/ljpinho)) + +## [v1.2.19](https://github.com/pliablepixels/zmNinja/tree/v1.2.19) (2016-09-04) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.18...v1.2.19) + +**Implemented enhancements:** + +- Cycle monitors [\#319](https://github.com/pliablepixels/zmNinja/issues/319) + +**Fixed bugs:** + +- Switching servers without saving first causes the app to freeze \(android/ios\) [\#320](https://github.com/pliablepixels/zmNinja/issues/320) + +## [v1.2.18](https://github.com/pliablepixels/zmNinja/tree/v1.2.18) (2016-09-02) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.17...v1.2.18) + +**Implemented enhancements:** + +- for all event related views \(event list, footage, analyze\) show "relative time from now" like "1 day ago" or "2 hours ago" [\#317](https://github.com/pliablepixels/zmNinja/issues/317) + +## [v1.2.17](https://github.com/pliablepixels/zmNinja/tree/v1.2.17) (2016-09-01) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.13...v1.2.17) + +**Implemented enhancements:** + +- Add ability to perform monitor config changes for all monitors \(credit @sctt\) [\#316](https://github.com/pliablepixels/zmNinja/issues/316) +- enable/disable sound and vibration push notifications [\#314](https://github.com/pliablepixels/zmNinja/issues/314) +- Add Wake/Sleep/Reset to PTZ functions \(credit: @sctt\) [\#306](https://github.com/pliablepixels/zmNinja/issues/306) + +**Fixed bugs:** + +- clean up event server flow - its been a bloody mess for a while [\#312](https://github.com/pliablepixels/zmNinja/issues/312) +- Add option to disable nativeTransitions [\#310](https://github.com/pliablepixels/zmNinja/issues/310) +- app freezes when adding more than 2 profiles [\#304](https://github.com/pliablepixels/zmNinja/issues/304) +- saving a server profile removes the "Add" button while in the same view [\#303](https://github.com/pliablepixels/zmNinja/issues/303) +- 1.2.0 seems to have routing issues and xwalk issues [\#302](https://github.com/pliablepixels/zmNinja/issues/302) +- zmNinja fails to log in over open internet on first invocation [\#126](https://github.com/pliablepixels/zmNinja/issues/126) +- it seems in some cases monitor intervals don't get transmitted to zmeventserver [\#112](https://github.com/pliablepixels/zmNinja/issues/112) + +**Closed issues:** + +- ZMninja API issue with zoneminder 1.30 [\#300](https://github.com/pliablepixels/zmNinja/issues/300) + +**Merged pull requests:** + +- tweaks to \#313 [\#315](https://github.com/pliablepixels/zmNinja/pull/315) ([pliablepixels](https://github.com/pliablepixels)) +- Added Global Configuration function for monitors [\#313](https://github.com/pliablepixels/zmNinja/pull/313) ([sctt](https://github.com/sctt)) +- Revert "Added Wake-Sleep-Reset control commands" [\#309](https://github.com/pliablepixels/zmNinja/pull/309) ([pliablepixels](https://github.com/pliablepixels)) +- tweaks to Sleep/Wake/Reset \#306 [\#308](https://github.com/pliablepixels/zmNinja/pull/308) ([pliablepixels](https://github.com/pliablepixels)) +- Added Wake-Sleep-Reset control commands [\#307](https://github.com/pliablepixels/zmNinja/pull/307) ([sctt](https://github.com/sctt)) + +## [v1.2.13](https://github.com/pliablepixels/zmNinja/tree/v1.2.13) (2016-08-18) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.2.0...v1.2.13) + +**Closed issues:** + +- modal close via back action on Android - make sure all timers re-start/resources released [\#305](https://github.com/pliablepixels/zmNinja/issues/305) + +## [v1.2.0](https://github.com/pliablepixels/zmNinja/tree/v1.2.0) (2016-08-10) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/vv1.2.0...v1.2.0) + +## [vv1.2.0](https://github.com/pliablepixels/zmNinja/tree/vv1.2.0) (2016-08-10) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.1.96...vv1.2.0) + +**Implemented enhancements:** + +- Allow frame navigation when you tap on alarms view within the modal [\#301](https://github.com/pliablepixels/zmNinja/issues/301) +- When viewing alarmed frames in events view, allow option to only show frames that differ in time [\#296](https://github.com/pliablepixels/zmNinja/issues/296) +- Encrypt user profile for more security [\#294](https://github.com/pliablepixels/zmNinja/issues/294) +- Portuguese language support [\#290](https://github.com/pliablepixels/zmNinja/issues/290) +- Allow frame navigation when you tap on a thumbnail image [\#288](https://github.com/pliablepixels/zmNinja/issues/288) +- tapping on graphs should show a nice event list - current doesn't do anything useful [\#18](https://github.com/pliablepixels/zmNinja/issues/18) + +**Fixed bugs:** + +- Password appears in log as plain text [\#293](https://github.com/pliablepixels/zmNinja/issues/293) +- server settings get deleted, especially on iOS [\#292](https://github.com/pliablepixels/zmNinja/issues/292) +- Tweak montage layout to avoid overlaps and gaps [\#286](https://github.com/pliablepixels/zmNinja/issues/286) +- Focus! Solve that damn "go to login screen" issue that some users are facing [\#193](https://github.com/pliablepixels/zmNinja/issues/193) + +**Closed issues:** + +- license doc typos [\#297](https://github.com/pliablepixels/zmNinja/issues/297) +- Having issues setting up Real Time Notifications with ZM ninja and ZM server [\#295](https://github.com/pliablepixels/zmNinja/issues/295) +- zmNinja via VPN on iOS [\#265](https://github.com/pliablepixels/zmNinja/issues/265) +- rework event graphs in event page, make event navigation easier [\#233](https://github.com/pliablepixels/zmNinja/issues/233) +- PTZ support could be improved [\#207](https://github.com/pliablepixels/zmNinja/issues/207) + +**Merged pull requests:** + +- license doc typos \#297 [\#298](https://github.com/pliablepixels/zmNinja/pull/298) ([phillxnet](https://github.com/phillxnet)) +- Some corrections to Portuguese translation [\#291](https://github.com/pliablepixels/zmNinja/pull/291) ([ljpinho](https://github.com/ljpinho)) +- Portugues Language [\#289](https://github.com/pliablepixels/zmNinja/pull/289) ([ljpinho](https://github.com/ljpinho)) +- New translated key addiction in locale-it.json [\#287](https://github.com/pliablepixels/zmNinja/pull/287) ([mcbittech](https://github.com/mcbittech)) + +## [v1.1.96](https://github.com/pliablepixels/zmNinja/tree/v1.1.96) (2016-07-13) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.1.94...v1.1.96) + +**Implemented enhancements:** + +- Make sure zmNinja plays ball with new user roles in APIs [\#93](https://github.com/pliablepixels/zmNinja/issues/93) + +**Fixed bugs:** + +- Slash screen PIN entry text error on zmN 1.1.94b [\#284](https://github.com/pliablepixels/zmNinja/issues/284) +- build for android broke - uglify is messing up release builds [\#282](https://github.com/pliablepixels/zmNinja/issues/282) +- ZMNinja back button issue [\#281](https://github.com/pliablepixels/zmNinja/issues/281) +- Modify montage filtering to make sure maxLimit does not include disabled monitors [\#277](https://github.com/pliablepixels/zmNinja/issues/277) +- Some Android phones seem to have SSL issues with self-signed certs [\#273](https://github.com/pliablepixels/zmNinja/issues/273) + +**Closed issues:** + +- Multi-server not video from cameras [\#283](https://github.com/pliablepixels/zmNinja/issues/283) + +## [v1.1.94](https://github.com/pliablepixels/zmNinja/tree/v1.1.94) (2016-07-09) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.1.93...v1.1.94) + +**Implemented enhancements:** + +- Allow to navigate to live stream on notification tap [\#278](https://github.com/pliablepixels/zmNinja/issues/278) +- Allow upto 10 monitors to be arranged per row in montage [\#276](https://github.com/pliablepixels/zmNinja/issues/276) + +**Fixed bugs:** + +- Playback of events fails using view=video mode [\#275](https://github.com/pliablepixels/zmNinja/issues/275) +- zmNinja does not launch on iOS 10 [\#271](https://github.com/pliablepixels/zmNinja/issues/271) + +**Closed issues:** + +- zmNinja-I can only see one camera in the app in montage view, but I can see my 2 cameras in browser [\#280](https://github.com/pliablepixels/zmNinja/issues/280) +- Swipe to next event for the same monitor id not working [\#274](https://github.com/pliablepixels/zmNinja/issues/274) + +## [v1.1.93](https://github.com/pliablepixels/zmNinja/tree/v1.1.93) (2016-06-16) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.1.92...v1.1.93) + +**Implemented enhancements:** + +- Implement language translations [\#261](https://github.com/pliablepixels/zmNinja/issues/261) +- Italian Language [\#260](https://github.com/pliablepixels/zmNinja/issues/260) +- Improve desktop mouse-wheel scrolling in the event view [\#258](https://github.com/pliablepixels/zmNinja/issues/258) + +**Fixed bugs:** + +- Allow special characters in password to work in wizard [\#264](https://github.com/pliablepixels/zmNinja/issues/264) +- if you open a footage modal and exit before 5 seconds, the app keeps checking for event status [\#257](https://github.com/pliablepixels/zmNinja/issues/257) +- Montage and Live View no longer working [\#256](https://github.com/pliablepixels/zmNinja/issues/256) +- 1.1.9 for Android broke pinch and zoom [\#255](https://github.com/pliablepixels/zmNinja/issues/255) + +**Closed issues:** + +- Fix android permissions [\#268](https://github.com/pliablepixels/zmNinja/issues/268) +- Validate language coverage [\#267](https://github.com/pliablepixels/zmNinja/issues/267) +- Update project to work with ionic@2 tools [\#259](https://github.com/pliablepixels/zmNinja/issues/259) +- switch to non parsed zms for montage - see if it helps packery [\#254](https://github.com/pliablepixels/zmNinja/issues/254) + +**Merged pull requests:** + +- IT Translations correction \#270 [\#272](https://github.com/pliablepixels/zmNinja/pull/272) ([mcbittech](https://github.com/mcbittech)) +- More Translations \#267 [\#269](https://github.com/pliablepixels/zmNinja/pull/269) ([mcbittech](https://github.com/mcbittech)) +- Italian Translations first commit [\#266](https://github.com/pliablepixels/zmNinja/pull/266) ([mcbittech](https://github.com/mcbittech)) + +## [v1.1.92](https://github.com/pliablepixels/zmNinja/tree/v1.1.92) (2016-05-21) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.1.9...v1.1.92) + +## [v1.1.9](https://github.com/pliablepixels/zmNinja/tree/v1.1.9) (2016-05-20) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.1.7...v1.1.9) + +**Implemented enhancements:** + +- Add ability to jump to specific timeframe during event playback [\#252](https://github.com/pliablepixels/zmNinja/issues/252) +- Allow users to specify a minimum alarm frame count for the events page [\#250](https://github.com/pliablepixels/zmNinja/issues/250) +- Implement new color scheme [\#249](https://github.com/pliablepixels/zmNinja/issues/249) +- Show recording state in monitors \(alert/alarm/recording/idle\) [\#248](https://github.com/pliablepixels/zmNinja/issues/248) +- add ability to force trigger alarms \(needs API upgrade\) [\#245](https://github.com/pliablepixels/zmNinja/issues/245) +- support multi-server feeds and the new server API [\#241](https://github.com/pliablepixels/zmNinja/issues/241) +- Write a configuration wizard [\#234](https://github.com/pliablepixels/zmNinja/issues/234) + +**Fixed bugs:** + +- Fix keyboard jump on certain fields/iOS [\#251](https://github.com/pliablepixels/zmNinja/issues/251) +- clean up buttons so they don't overlap in many views [\#246](https://github.com/pliablepixels/zmNinja/issues/246) +- Switching between profiles fails to discover monitors [\#244](https://github.com/pliablepixels/zmNinja/issues/244) +- Event Graphs issue [\#239](https://github.com/pliablepixels/zmNinja/issues/239) +- Event server customization [\#238](https://github.com/pliablepixels/zmNinja/issues/238) +- Push notification issue [\#237](https://github.com/pliablepixels/zmNinja/issues/237) +- Fix the monitor orientation code for rotated cameras [\#232](https://github.com/pliablepixels/zmNinja/issues/232) +- protocol bug - cgi-bin discover [\#231](https://github.com/pliablepixels/zmNinja/issues/231) + +**Closed issues:** + +- . [\#253](https://github.com/pliablepixels/zmNinja/issues/253) +- clean up monitorCtrl - remove Event crap - we now have different controllers [\#247](https://github.com/pliablepixels/zmNinja/issues/247) +- switching between fid mode playback \(api 1.30+\) and path mode causes issues if I don't restart app [\#243](https://github.com/pliablepixels/zmNinja/issues/243) +- video .mp4 event issue [\#242](https://github.com/pliablepixels/zmNinja/issues/242) +- check if android is exiting on background [\#240](https://github.com/pliablepixels/zmNinja/issues/240) +- Enhancement: zmNinja as surveillance solution [\#236](https://github.com/pliablepixels/zmNinja/issues/236) +- Application not recorvering from connection errors [\#199](https://github.com/pliablepixels/zmNinja/issues/199) +- Event Montage unstable [\#183](https://github.com/pliablepixels/zmNinja/issues/183) +- \[DESKTOP\] Playback control bar lost some features in 1.0.9 [\#176](https://github.com/pliablepixels/zmNinja/issues/176) + +## [v1.1.7](https://github.com/pliablepixels/zmNinja/tree/v1.1.7) (2016-04-23) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.1.4...v1.1.7) + +**Implemented enhancements:** + +- Add option to tap on alarm events in events view to see a larger version [\#229](https://github.com/pliablepixels/zmNinja/issues/229) +- Add a helper function to automatically detect cgi-bin [\#228](https://github.com/pliablepixels/zmNinja/issues/228) +- PTZ zoom support [\#224](https://github.com/pliablepixels/zmNinja/issues/224) + +**Fixed bugs:** + +- Not possible to control PTZ after swipe from non-PTZ camera [\#223](https://github.com/pliablepixels/zmNinja/issues/223) +- PTZ with moveRel \(Axis PTZ as an example\) does not work when navigated from Montage view [\#222](https://github.com/pliablepixels/zmNinja/issues/222) +- montage natural scrolling does not work [\#218](https://github.com/pliablepixels/zmNinja/issues/218) +- when dragging around in analyze graph, don't scroll the screen [\#217](https://github.com/pliablepixels/zmNinja/issues/217) +- full screen in montage does not work [\#216](https://github.com/pliablepixels/zmNinja/issues/216) + +**Closed issues:** + +- improve timeline taps - make a closest guess [\#230](https://github.com/pliablepixels/zmNinja/issues/230) +- iOS and Android: introduce native transitions and scrolling \[performance\] [\#226](https://github.com/pliablepixels/zmNinja/issues/226) +- Email notifications with animated GIF attachements [\#225](https://github.com/pliablepixels/zmNinja/issues/225) +- Add version number to help page [\#220](https://github.com/pliablepixels/zmNinja/issues/220) +- Upgrade code-base to new plugins, ionic 1.2.4, etc. [\#219](https://github.com/pliablepixels/zmNinja/issues/219) +- Error: Hook failed with error code ENOENT: [\#210](https://github.com/pliablepixels/zmNinja/issues/210) + +## [v1.1.4](https://github.com/pliablepixels/zmNinja/tree/v1.1.4) (2016-04-05) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.1.3...v1.1.4) + +## [v1.1.3](https://github.com/pliablepixels/zmNinja/tree/v1.1.3) (2016-04-02) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.1.2...v1.1.3) + +**Implemented enhancements:** + +- new feature to analyze frames quickly from event list [\#215](https://github.com/pliablepixels/zmNinja/issues/215) +- re-introduce ability to hide monitors with new drag/drop montage [\#213](https://github.com/pliablepixels/zmNinja/issues/213) +- Enhance timeline graph to allow for event frame scrubbing [\#209](https://github.com/pliablepixels/zmNinja/issues/209) +- Allow ability to only browse alarm frames while in full screen footage view [\#206](https://github.com/pliablepixels/zmNinja/issues/206) + +**Fixed bugs:** + +- zmNinja build from source does not load on iOS 9.x - hangs on splashscreen [\#212](https://github.com/pliablepixels/zmNinja/issues/212) +- Some SSL users are facing issues with reachability returning no servers reachable [\#208](https://github.com/pliablepixels/zmNinja/issues/208) + +**Closed issues:** + +- zmNinja 1.1.3 build from source - Push registration failed [\#214](https://github.com/pliablepixels/zmNinja/issues/214) +- No live view video playback, cgi path is set. [\#211](https://github.com/pliablepixels/zmNinja/issues/211) +- Fix layout for first run when no layout config exists - check demo acct [\#205](https://github.com/pliablepixels/zmNinja/issues/205) + +## [v1.1.2](https://github.com/pliablepixels/zmNinja/tree/v1.1.2) (2016-03-19) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.1.1...v1.1.2) + +**Implemented enhancements:** + +- Left drawer should open with swipe gesture in any view not just fullscreen [\#202](https://github.com/pliablepixels/zmNinja/issues/202) +- Local and External Server configuration \[$5\] [\#133](https://github.com/pliablepixels/zmNinja/issues/133) + +**Fixed bugs:** + +- quick scrub drag slider stopped working [\#196](https://github.com/pliablepixels/zmNinja/issues/196) + +**Closed issues:** + +- Add gesture to exit any fullscreen [\#203](https://github.com/pliablepixels/zmNinja/issues/203) +- Demo Account Autocreating itself [\#200](https://github.com/pliablepixels/zmNinja/issues/200) +- ionic state restore not creating platforms/android directory [\#198](https://github.com/pliablepixels/zmNinja/issues/198) +- Authentication Failed [\#195](https://github.com/pliablepixels/zmNinja/issues/195) + +## [v1.1.1](https://github.com/pliablepixels/zmNinja/tree/v1.1.1) (2016-03-14) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.1.0...v1.1.1) + +**Fixed bugs:** + +- The new montage function resets montage layout if there are hidden or disabled monitors [\#194](https://github.com/pliablepixels/zmNinja/issues/194) + +**Closed issues:** + +- Testing issue template \(dummy issue\) [\#192](https://github.com/pliablepixels/zmNinja/issues/192) +- testing issue template [\#191](https://github.com/pliablepixels/zmNinja/issues/191) +- decrease splash screen delay \(reduce startup delay\) [\#190](https://github.com/pliablepixels/zmNinja/issues/190) +- Android build fails ref \#180 [\#184](https://github.com/pliablepixels/zmNinja/issues/184) + +## [v1.1.0](https://github.com/pliablepixels/zmNinja/tree/v1.1.0) (2016-03-12) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.0.9...v1.1.0) + +**Implemented enhancements:** + +- Add a pre-configured demo account for people to test around with [\#187](https://github.com/pliablepixels/zmNinja/issues/187) +- Add gesture to open left menu while in full screen live view [\#185](https://github.com/pliablepixels/zmNinja/issues/185) +- Add touch gesture to exit live view [\#182](https://github.com/pliablepixels/zmNinja/issues/182) +- add dynamic drag and drop and multiple size options to montage - make it awesome and more consistent [\#179](https://github.com/pliablepixels/zmNinja/issues/179) +- Prev day/next day for timeline [\#177](https://github.com/pliablepixels/zmNinja/issues/177) +- 12/24 hours scheme settings [\#175](https://github.com/pliablepixels/zmNinja/issues/175) + +**Fixed bugs:** + +- switching server profiles causes inconsistency if you go to developer options [\#189](https://github.com/pliablepixels/zmNinja/issues/189) +- changing timeline limit does not go into effect until app restart [\#188](https://github.com/pliablepixels/zmNinja/issues/188) +- Desktop \(possibly others\): Inescapable UI pattern [\#174](https://github.com/pliablepixels/zmNinja/issues/174) + +**Closed issues:** + +- No image for monitors nor events [\#181](https://github.com/pliablepixels/zmNinja/issues/181) +- Android build fails [\#180](https://github.com/pliablepixels/zmNinja/issues/180) +- iPhone stopped working [\#178](https://github.com/pliablepixels/zmNinja/issues/178) +- non-free license [\#173](https://github.com/pliablepixels/zmNinja/issues/173) +- iOS: Montage View arrange views \(third icon from top-right\) does not function [\#172](https://github.com/pliablepixels/zmNinja/issues/172) + +## [v1.0.9](https://github.com/pliablepixels/zmNinja/tree/v1.0.9) (2016-02-25) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.0.7...v1.0.9) + +**Implemented enhancements:** + +- Route event playback via ZMS [\#164](https://github.com/pliablepixels/zmNinja/issues/164) +- Montage view zoom slider, ergonomy [\#163](https://github.com/pliablepixels/zmNinja/issues/163) +- \[DESKTOP\] Zooming for non touch screen displays. [\#162](https://github.com/pliablepixels/zmNinja/issues/162) +- Fix playback speed for long events [\#161](https://github.com/pliablepixels/zmNinja/issues/161) + +**Fixed bugs:** + +- Desktop: Monitors Freeze when Exiting Full Screen [\#169](https://github.com/pliablepixels/zmNinja/issues/169) +- changing to invalid credentials after valid credentials continues to work [\#167](https://github.com/pliablepixels/zmNinja/issues/167) + +**Closed issues:** + +- iOS: Events--\>Filter by Date/Time does not work [\#171](https://github.com/pliablepixels/zmNinja/issues/171) +- Desktop: Event Footage extremely low resolution [\#168](https://github.com/pliablepixels/zmNinja/issues/168) +- ionic state restore failed [\#166](https://github.com/pliablepixels/zmNinja/issues/166) +- Desktop: Montage places last image below rather than alongside previous [\#165](https://github.com/pliablepixels/zmNinja/issues/165) +- \[DESKTOP\] Playback issue on windows platform [\#151](https://github.com/pliablepixels/zmNinja/issues/151) + +## [v1.0.7](https://github.com/pliablepixels/zmNinja/tree/v1.0.7) (2016-02-09) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.0.6...v1.0.7) + +**Implemented enhancements:** + +- Refine montage history to accept from/to dates [\#160](https://github.com/pliablepixels/zmNinja/issues/160) + +**Closed issues:** + +- Build is failing [\#156](https://github.com/pliablepixels/zmNinja/issues/156) + +## [v1.0.6](https://github.com/pliablepixels/zmNinja/tree/v1.0.6) (2016-02-05) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.0.5...v1.0.6) + +**Implemented enhancements:** + +- Allow event server to work without SSL - requires zmeventserver upgrade [\#159](https://github.com/pliablepixels/zmNinja/issues/159) +- Introduce a montage timeline function [\#154](https://github.com/pliablepixels/zmNinja/issues/154) +- Addition Next frame/prev frame buttons when viewing event - for fine grained snapshot control. [\#150](https://github.com/pliablepixels/zmNinja/issues/150) +- Notification icon and sound - add ability to play default sounds [\#135](https://github.com/pliablepixels/zmNinja/issues/135) + +**Closed issues:** + +- Make exit buttons of live view and events view consistent [\#158](https://github.com/pliablepixels/zmNinja/issues/158) +- Remove SSL cert requirement [\#157](https://github.com/pliablepixels/zmNinja/issues/157) +- Closing data leaks - trying to bottle up areas which may result in chrome keeping TCP connections open in background [\#155](https://github.com/pliablepixels/zmNinja/issues/155) +- xcode fails on linking [\#153](https://github.com/pliablepixels/zmNinja/issues/153) +- installing ios-deploy ends with an error [\#152](https://github.com/pliablepixels/zmNinja/issues/152) +- Progress bar is ignored in Event View when playback is paused. [\#149](https://github.com/pliablepixels/zmNinja/issues/149) + +## [v1.0.5](https://github.com/pliablepixels/zmNinja/tree/v1.0.5) (2016-01-23) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.0.3...v1.0.5) + +**Implemented enhancements:** + +- Add ability to save a snapshot of an event playback to disk [\#148](https://github.com/pliablepixels/zmNinja/issues/148) + +**Fixed bugs:** + +- 1.0.4 Broke basic auth [\#147](https://github.com/pliablepixels/zmNinja/issues/147) +- Basic auth only - no zm auth - app goes to login on restart and says auth fails - app works [\#140](https://github.com/pliablepixels/zmNinja/issues/140) + +**Closed issues:** + +- montage display wrap got messed up in newer versions of Chrome [\#146](https://github.com/pliablepixels/zmNinja/issues/146) +- Viewing events on slow connection basically doesn't work [\#145](https://github.com/pliablepixels/zmNinja/issues/145) + +## [v1.0.3](https://github.com/pliablepixels/zmNinja/tree/v1.0.3) (2016-01-19) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.0.2...v1.0.3) + +**Implemented enhancements:** + +- Allow montage to flow as columns \(packed\) or rows \(not packed\) [\#144](https://github.com/pliablepixels/zmNinja/issues/144) +- Reduce android apk size [\#142](https://github.com/pliablepixels/zmNinja/issues/142) +- Improve timeline performance [\#129](https://github.com/pliablepixels/zmNinja/issues/129) +- For Android only: Allow an exit option in menu [\#128](https://github.com/pliablepixels/zmNinja/issues/128) +- Implement a mechanism to detect when network is on/off [\#127](https://github.com/pliablepixels/zmNinja/issues/127) +- Add support for Pan/Tilt/Zoom Presets [\#116](https://github.com/pliablepixels/zmNinja/issues/116) + +**Fixed bugs:** + +- Monitor order is different one can observe in ZM montage [\#143](https://github.com/pliablepixels/zmNinja/issues/143) +- You can swipe to dead monitor [\#138](https://github.com/pliablepixels/zmNinja/issues/138) +- switching networks should trigger authentication [\#134](https://github.com/pliablepixels/zmNinja/issues/134) +- Excessive background data usage [\#131](https://github.com/pliablepixels/zmNinja/issues/131) + +**Closed issues:** + +- \[Log in Failed\] Checking if reCaptcha is enabled in zm.. [\#141](https://github.com/pliablepixels/zmNinja/issues/141) +- Swiping with ZMS is slower than swiping without zms [\#139](https://github.com/pliablepixels/zmNinja/issues/139) +- Exit button on Android build [\#137](https://github.com/pliablepixels/zmNinja/issues/137) +- zmninja cannot talk to zmeventserver [\#136](https://github.com/pliablepixels/zmNinja/issues/136) +- HTTP basic auth credentials not stored [\#132](https://github.com/pliablepixels/zmNinja/issues/132) +- Android build fails [\#130](https://github.com/pliablepixels/zmNinja/issues/130) +- \[DESKTOP\]\[QUESTION\] gconf [\#125](https://github.com/pliablepixels/zmNinja/issues/125) +- CSS montage - implement a better reflow algorithm [\#124](https://github.com/pliablepixels/zmNinja/issues/124) +- Auto upload successful build to testfairy [\#75](https://github.com/pliablepixels/zmNinja/issues/75) +- Integrate with Travis [\#72](https://github.com/pliablepixels/zmNinja/issues/72) +- When moving montage monitors around, remember to move the size [\#16](https://github.com/pliablepixels/zmNinja/issues/16) + +## [v1.0.2](https://github.com/pliablepixels/zmNinja/tree/v1.0.2) (2015-12-28) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v1.0.1...v1.0.2) + +**Implemented enhancements:** + +- Implement a way to only play alarmed frames [\#118](https://github.com/pliablepixels/zmNinja/issues/118) + +## [v1.0.1](https://github.com/pliablepixels/zmNinja/tree/v1.0.1) (2015-12-27) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v0.87.3...v1.0.1) + +**Implemented enhancements:** + +- Add an option to play at real FPS in single monitor view [\#123](https://github.com/pliablepixels/zmNinja/issues/123) +- Offer a server selection menu on app launch [\#122](https://github.com/pliablepixels/zmNinja/issues/122) +- Add a stop button to PTZ [\#121](https://github.com/pliablepixels/zmNinja/issues/121) +- Pack in the montage view better [\#119](https://github.com/pliablepixels/zmNinja/issues/119) +- Truncate monitor name in montage if size of image is less [\#117](https://github.com/pliablepixels/zmNinja/issues/117) + +**Fixed bugs:** + +- Developer setting for Frame Update allows decimals [\#114](https://github.com/pliablepixels/zmNinja/issues/114) + +**Closed issues:** + +- HTTP Basic authentication [\#120](https://github.com/pliablepixels/zmNinja/issues/120) +- Cannot get video [\#115](https://github.com/pliablepixels/zmNinja/issues/115) + +## [v0.87.3](https://github.com/pliablepixels/zmNinja/tree/v0.87.3) (2015-12-15) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v0.87.2...v0.87.3) + +**Implemented enhancements:** + +- Add ability to detect cgi-bin configuration issues \(experimental\) [\#110](https://github.com/pliablepixels/zmNinja/issues/110) +- Allow 'show all/show alarmed' events to persist and show menu option in both Events and Timeline Views [\#108](https://github.com/pliablepixels/zmNinja/issues/108) +- Make timeline items configurable instead of forcing 200 [\#104](https://github.com/pliablepixels/zmNinja/issues/104) + +**Fixed bugs:** + +- popover "..." menu in event and timeline does not show in certain scenarios - so no menu [\#109](https://github.com/pliablepixels/zmNinja/issues/109) +- Disabling event server does not disable push notifications via APNS/GCM [\#107](https://github.com/pliablepixels/zmNinja/issues/107) +- Quick scrub on devices \(atleast iOS\) does not stop if you tap [\#106](https://github.com/pliablepixels/zmNinja/issues/106) +- Bulk frames are causing problems with the scrub bar positioning of alarmed frames [\#102](https://github.com/pliablepixels/zmNinja/issues/102) +- Gapless playback showing events from non-persisted monitors [\#86](https://github.com/pliablepixels/zmNinja/issues/86) + +**Closed issues:** + +- Timeline on v0.87.2 shows only motion events [\#105](https://github.com/pliablepixels/zmNinja/issues/105) + +## [v0.87.2](https://github.com/pliablepixels/zmNinja/tree/v0.87.2) (2015-11-20) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v0.87...v0.87.2) + +## [v0.87](https://github.com/pliablepixels/zmNinja/tree/v0.87) (2015-11-20) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v0.87.1...v0.87) + +**Fixed bugs:** + +- Tap to load events on push notification is broken [\#103](https://github.com/pliablepixels/zmNinja/issues/103) +- Monitors in zmNinja should respect sequence of monitors in Zoneminder [\#100](https://github.com/pliablepixels/zmNinja/issues/100) +- SavetoPhone not working [\#99](https://github.com/pliablepixels/zmNinja/issues/99) +- 0.87.1 broke quick scrub thumbnail [\#98](https://github.com/pliablepixels/zmNinja/issues/98) +- \[DESKTOP\] Image scaling issues [\#90](https://github.com/pliablepixels/zmNinja/issues/90) + +**Closed issues:** + +- \[DESKTOP\] Timeline is UTC [\#101](https://github.com/pliablepixels/zmNinja/issues/101) +- \[DESKTOP\] Lift 200 last entries limit for timeline [\#88](https://github.com/pliablepixels/zmNinja/issues/88) + +## [v0.87.1](https://github.com/pliablepixels/zmNinja/tree/v0.87.1) (2015-11-18) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v0.86...v0.87.1) + +**Implemented enhancements:** + +- Event page is overcrowded for mocord users - add option to show only alarmed frames [\#89](https://github.com/pliablepixels/zmNinja/issues/89) +- Ability to specify multiple ZM servers and switch between them [\#83](https://github.com/pliablepixels/zmNinja/issues/83) +- add per monitor 'alarmed' status indicator to montage view [\#82](https://github.com/pliablepixels/zmNinja/issues/82) + +**Fixed bugs:** + +- zmNinja adds cgi-bin on its own to cgi path. This is a problem for Centos [\#92](https://github.com/pliablepixels/zmNinja/issues/92) +- Can't toggle gapless playback when viewing timeline events [\#85](https://github.com/pliablepixels/zmNinja/issues/85) +- desktop app no video from timeline [\#70](https://github.com/pliablepixels/zmNinja/issues/70) + +**Closed issues:** + +- Breaking changes for this release: [\#97](https://github.com/pliablepixels/zmNinja/issues/97) +- Zoneminder specific notes for this release [\#96](https://github.com/pliablepixels/zmNinja/issues/96) +- Increase desktop limit of timeline to 2000 events instead of 200 [\#95](https://github.com/pliablepixels/zmNinja/issues/95) +- Implement daily version check for Desktop versions [\#94](https://github.com/pliablepixels/zmNinja/issues/94) +- eliminate duplicate code between timeline and event control for footage mode [\#87](https://github.com/pliablepixels/zmNinja/issues/87) +- Non-persisted monitors showing in timeline, events views [\#84](https://github.com/pliablepixels/zmNinja/issues/84) +- Clean up persistent data storage mechanism [\#81](https://github.com/pliablepixels/zmNinja/issues/81) +- Remove external deps from codebase [\#80](https://github.com/pliablepixels/zmNinja/issues/80) +- Update .gitignore to support osx [\#78](https://github.com/pliablepixels/zmNinja/issues/78) +- Welcome message on first start [\#76](https://github.com/pliablepixels/zmNinja/issues/76) +- add contributing guidelines [\#74](https://github.com/pliablepixels/zmNinja/issues/74) +- Add License [\#73](https://github.com/pliablepixels/zmNinja/issues/73) +- desktop app, can't export logs [\#71](https://github.com/pliablepixels/zmNinja/issues/71) +- make email logs work in desktop mode by opening default client [\#69](https://github.com/pliablepixels/zmNinja/issues/69) +- in quick scrub/footage mode - start playing without waiting for a tap [\#68](https://github.com/pliablepixels/zmNinja/issues/68) +- make mouse wheel work in desktop mode [\#67](https://github.com/pliablepixels/zmNinja/issues/67) + +**Merged pull requests:** + +- prevents checkin of unessicary file from osx [\#79](https://github.com/pliablepixels/zmNinja/pull/79) ([jsloyer](https://github.com/jsloyer)) +- move license file to correct filename [\#77](https://github.com/pliablepixels/zmNinja/pull/77) ([jsloyer](https://github.com/jsloyer)) + +## [v0.86](https://github.com/pliablepixels/zmNinja/tree/v0.86) (2015-11-06) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v0.85...v0.86) + +**Implemented enhancements:** + +- Make Back button to exit from live view [\#61](https://github.com/pliablepixels/zmNinja/issues/61) +- ability to run all screens of zmNinja on a desktop without console errors [\#59](https://github.com/pliablepixels/zmNinja/issues/59) +- In playback mode, add the ability to swipe to the next event of whichever monitor has the next event and/or initiate gapless playback of same. [\#49](https://github.com/pliablepixels/zmNinja/issues/49) +- In playback mode, add the ability to swipe to the next event of the same monitor and/or initiate gapless playback. [\#48](https://github.com/pliablepixels/zmNinja/issues/48) + +**Fixed bugs:** + +- tapping on events before they complete causes issues [\#44](https://github.com/pliablepixels/zmNinja/issues/44) + +**Closed issues:** + +- If swiping is enabled, don't swipe if image is zoomed in -- causes pan/zoom conflicts [\#66](https://github.com/pliablepixels/zmNinja/issues/66) +- getDiskStatus seems to be a performance bottleneck - disable for now in System State screen [\#65](https://github.com/pliablepixels/zmNinja/issues/65) +- clean up non-reachable code during portal check [\#64](https://github.com/pliablepixels/zmNinja/issues/64) + +## [v0.85](https://github.com/pliablepixels/zmNinja/tree/v0.85) (2015-11-01) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v0.84...v0.85) + +**Implemented enhancements:** + +- video branch support for zmNinja [\#60](https://github.com/pliablepixels/zmNinja/issues/60) +- changing servers requires reload of monitors - should be automatically done [\#58](https://github.com/pliablepixels/zmNinja/issues/58) + +**Fixed bugs:** + +- fix version check - in one part of the code, I'm not doing a \>= check resulting in new ZM versions failing [\#57](https://github.com/pliablepixels/zmNinja/issues/57) +- notifications delivered while the app is running should also produce the same sound [\#55](https://github.com/pliablepixels/zmNinja/issues/55) +- iOS notifications are not showing style and sound options [\#54](https://github.com/pliablepixels/zmNinja/issues/54) + +**Closed issues:** + +- permissions on Android [\#56](https://github.com/pliablepixels/zmNinja/issues/56) + +## [v0.84](https://github.com/pliablepixels/zmNinja/tree/v0.84) (2015-10-28) +[Full Changelog](https://github.com/pliablepixels/zmNinja/compare/v0.83...v0.84) + +**Implemented enhancements:** + +- offer an option to force web sockets even if push is supported [\#53](https://github.com/pliablepixels/zmNinja/issues/53) +- customize screen to load on push notification tap [\#47](https://github.com/pliablepixels/zmNinja/issues/47) + +**Fixed bugs:** + +- Ssl toggle and https in login [\#52](https://github.com/pliablepixels/zmNinja/issues/52) +- Swiping to the left should reveal next monitor, not prev monitor \(seen on iOS 9\) [\#51](https://github.com/pliablepixels/zmNinja/issues/51) +- rev 0.83, event icon is a solid block [\#50](https://github.com/pliablepixels/zmNinja/issues/50) +- Monitor view: events not showing for deselected monitors \(and should since the goal in monitor view is to see all monitors which would include their events\). [\#46](https://github.com/pliablepixels/zmNinja/issues/46) +- Montage view: swipe shows deselected monitors \(and should not\). [\#45](https://github.com/pliablepixels/zmNinja/issues/45) +- Timeline more menu bonked again [\#43](https://github.com/pliablepixels/zmNinja/issues/43) + +**Closed issues:** + +- custom range dates shown even if pullup overwrites them [\#37](https://github.com/pliablepixels/zmNinja/issues/37) +- Latest Events panel doesn't initialize correctly on first use. [\#36](https://github.com/pliablepixels/zmNinja/issues/36) +- Android client: System Status view returns HTTP error [\#32](https://github.com/pliablepixels/zmNinja/issues/32) +- app causes ZM crash/bad behavior after it's been asleep for a while [\#30](https://github.com/pliablepixels/zmNinja/issues/30) + +## [v0.83](https://github.com/pliablepixels/zmNinja/tree/v0.83) (2015-10-24) +**Implemented enhancements:** + +- ability to restrict monitors in all views - depending on some global selection [\#42](https://github.com/pliablepixels/zmNinja/issues/42) +- make it optional to swipe between live view of monitors [\#41](https://github.com/pliablepixels/zmNinja/issues/41) +- review security approach - switch to auth token instead of passing u+p in url [\#2](https://github.com/pliablepixels/zmNinja/issues/2) + +**Fixed bugs:** + +- if apis can't be reached the app assumes version is 0.0.0 and moves app to low version screen [\#40](https://github.com/pliablepixels/zmNinja/issues/40) +- Check multiple web sockets created in android -- seems old web sockets don't get deleted [\#39](https://github.com/pliablepixels/zmNinja/issues/39) +- Background mode: Popover menus stick around [\#33](https://github.com/pliablepixels/zmNinja/issues/33) + +**Closed issues:** + +- Monitor change makes enabled 0 [\#38](https://github.com/pliablepixels/zmNinja/issues/38) +- Restarting ZM in state control results in client freezing [\#35](https://github.com/pliablepixels/zmNinja/issues/35) +- radial menu is broken [\#34](https://github.com/pliablepixels/zmNinja/issues/34) +- monitor buttons to navigate can overlap exit,zoom,refresh buttons [\#31](https://github.com/pliablepixels/zmNinja/issues/31) +- pinch zoom on monitor too sensitive, detects false swipes [\#29](https://github.com/pliablepixels/zmNinja/issues/29) +- Montage re-order does not work with large list of monitors [\#28](https://github.com/pliablepixels/zmNinja/issues/28) +- investigate when timeline barfs with a "no parent" error [\#27](https://github.com/pliablepixels/zmNinja/issues/27) +- zmNinja should give a useful warning when the API is non-functional [\#25](https://github.com/pliablepixels/zmNinja/issues/25) +- apk Download of zmNinja [\#22](https://github.com/pliablepixels/zmNinja/issues/22) +- Add destroy to each view and cancel all view timers again there just to make sure [\#21](https://github.com/pliablepixels/zmNinja/issues/21) +- Add random string recalc every 1 sec to monitor view [\#20](https://github.com/pliablepixels/zmNinja/issues/20) +- Long press on android to increase individual montage size does not work [\#19](https://github.com/pliablepixels/zmNinja/issues/19) +- white screen on idle during playback [\#17](https://github.com/pliablepixels/zmNinja/issues/17) +- make sure image works if an autologin happens in the background [\#15](https://github.com/pliablepixels/zmNinja/issues/15) +- settings UI - keep hints always on top [\#14](https://github.com/pliablepixels/zmNinja/issues/14) +- skip disabled monitors in montage view [\#13](https://github.com/pliablepixels/zmNinja/issues/13) +- how to install your application? [\#12](https://github.com/pliablepixels/zmNinja/issues/12) +- Implement a way to do a sanity check on the input and inform the user if the paths are wrong [\#11](https://github.com/pliablepixels/zmNinja/issues/11) +- come up with a clean input box to make sure I account for various API/base path install combos [\#10](https://github.com/pliablepixels/zmNinja/issues/10) +- Implement event filtering for graph generation - last hr/week/month [\#9](https://github.com/pliablepixels/zmNinja/issues/9) +- Android: Montage screen - scaling is not correct [\#8](https://github.com/pliablepixels/zmNinja/issues/8) +- Android: Http problem [\#7](https://github.com/pliablepixels/zmNinja/issues/7) +- When images are loaded over a slow connection, there is a white screen till it loads [\#6](https://github.com/pliablepixels/zmNinja/issues/6) +- handle situations when zms does not respond to your commands for a while [\#5](https://github.com/pliablepixels/zmNinja/issues/5) +- test product on Android - make sure all plugins work etc. [\#4](https://github.com/pliablepixels/zmNinja/issues/4) +- we are only retrieving the first page of events - need to fix it to get all [\#1](https://github.com/pliablepixels/zmNinja/issues/1) + +**Merged pull requests:** + +- Build docs [\#24](https://github.com/pliablepixels/zmNinja/pull/24) ([bklang](https://github.com/bklang)) +- Add additional JS build dependencies [\#23](https://github.com/pliablepixels/zmNinja/pull/23) ([bklang](https://github.com/bklang)) + + + +\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..a8759a91b --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at pliablepixels@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..797350c72 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,68 @@ +##Contributing to zmNinja + +The source code will always be available under CC BY-NC-SA 4.0. If you'd like to contribute please know that if your changes are accepted and merged they will make it to the App/Play Store when I publish the app. This does not entitle you to any remuneration - If you still would like to contribute and make this solution better, please go right ahead. If you feel this prohibits you from contributing, please create a bug report or enhancement request via the github issue tracker and I'll incorporate it when I have time/agree its a good idea. + +Thanks. + + +## Steps for code contribution + +It's best if you follow a proper process to contribute code - makes it easy for me to track/review. You will need `git` + +If you are familiar with doing Pull Requests, you can ignore detailed instructions below - just do the following: +* create a [github issue](https://github.com/pliablepixels/zmNinja/issues) in zmNinja describing your feature +* create a fork and create a local branch using the issue# created (Example 459-new-feature) +* Make your changes on that branch and push/PR + +If you are not familiar with the Pull Request process, these steps explain further: + +### Detailed instructions (for folks who are not familiar with Pull Requests) +#### One time +* [Fork](https://guides.github.com/activities/forking/) zmNinja using the "Fork" button on the top right of the [zmNinja project](https://github.com/pliablepixels/zmNinja). This creates your own copy (or fork) of zmNinja on github: + +* Now launch a command line and make a local copy of your fork +``` +git clone https://github.com//zmNinja.git +``` + +* Now connect your copy to my repository (needed for future pushes) +``` +git remote add upstream https://github.com/pliablepixels/zmNinja.git +``` + + +#### Every time you want to contribute +* cd `/zmNinja` + +* Make sure you have the latest version of my repo + +``` +git checkout master +git pull upstream master +``` + +* Let's suppose you want to add some "new-feature" + +* Create an ISSUE on [zmNinja github issues](https://github.com/pliablepixels/zmNinja/issues) + +* Note down the issue number (lets say its 1234) + +* create a branch in your local git copy +``` +git checkout -b 1234-new-feature (replace 1234 and new-feature) +``` + +You will now be in a new branch for you to develop the feature + +* You can keep testing your changes. Make sure you commit often via `git add ` and `git commit -m "comments describing change" .`(you are committing to your local copy only here). + +* So far, you are committing changes to your local copy. To push it to your fork of zmNinja on github, do `git push origin 1234-new-feature` (replace 1234 and new-feature) + +* Keep repeating above steps as many times as you want till the code is ready. + +* Once done, go to your github webpage and you will see a "create pull request" button in green. Review what you are doing a pull request for and click that button - I'll get an email you want me to review your changes + + + + + diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..2ceb83291 --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,21 @@ +Before you create an issue, please make sure you have read the FAQ at https://github.com/pliablepixels/zmNinja/wiki/FAQ. Common questions on API, no image etc are covered there. + + + +**Platform & OS Version** +(example only, please edit this line) Android 6.0 Marshmallow + +**The version of the app you are reporting:** +(example only, please edit this line) 1.1 + +**Device details:** +(example only, please edit this line) Moto G + +**What is the nature of your issue** +(one of Bug, Enhancement, Question) + +**Details** +Describe in detail. If its a bug, please describe what is happening, what should happen and how to reproduce if its not obvious + + +Thanks! diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..70fda3a2d --- /dev/null +++ b/LICENSE @@ -0,0 +1,56 @@ +License for apps on Play store/App store +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The apps in Apple App store and Google Play store can be used for any purpose (personal, commercial etc). After all, you've paid for it. + + +For Desktop Clients Binaries: +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The Desktop clients binaries free to download and use ONLY for users +who are using the desktop client with the free and open source ZoneMinder +software. If you are selling a service based on ZoneMinder and are either distributing the Desktop Client to your users or asking your users to use the desktop client by download it themselves, you are violating the non-commercial use. You will need to procure a license before you do so. + + +Source Code License +~~~~~~~~~~~~~~~~~~~ +The source code of zmNinja is dual licensed. + +a) The code is free for personal, non commercial use +http://creativecommons.org/licenses/by-nc-sa/4.0/ +In summary: Share Alike, Adapt,Attribute, NonCommercial + +b) zmNinja source code is also open for commercial licensing and white-labeling. +Please contact pliablepixels@gmail.com + + + +Third Party credits +=================== +Ninja icon; +https://openclipart.org/detail/172393/ninja-logo +License: https://openclipart.org/share + +Wizard Icon: +https://openclipart.org/detail/4795/wizard-in-blue-hat +License: https://openclipart.org/share + +Blop sound for notifications: +http://soundbible.com/2067-Blop.html + +Version 1.1.0 and above of zmNinja uses Packery. +http://packery.metafizzy.co + +A commercial single developer license has been purchased for the same. +Note that this license allows me (pliablepixels) to use Packery for commercial +apps that I develop (such as zmNinja). Given that I publish my source under +CC BY-NC-SA 4.0, you can compile the code for your personal use (non commercial purposes) +and continue to use Packery. This is compliant to Packery's license too, where they +prohibit other developers to build for profit using the license I purchased. + +If however you purchase the source code from me, you will +still have to purchase an additional license for Packery from David via http://packery.metafizzy.co/#commercial-license +It's very cheap ($25 for unlimited products by one developer). + + + + + diff --git a/README.md b/README.md index d7cf7444d..067a2339d 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,78 @@ -Ionic App Base -============== +![](https://github.com/pliablepixels/zmNinja/blob/master/sample_images/zmn.png?raw=true "icon") -A starting project for Ionic that optionally supports using custom SCSS. +[zmNinja website](http://pliablepixels.github.io) -## Using this project +zmNinja is a multi platform (iOS, Android, Windows Desktop, Mac Desktop, Linux Desktop) client for ZoneMinder users. +[ZoneMinder](http://www.zoneminder.com) is an incredible open source camera monitoring system and is used +by many for home and commercial security monitoring. -We recommend using the [Ionic CLI](https://github.com/ionic-team/ionic-cli) to create new Ionic projects that are based on this project but use a ready-made starter template. -For example, to start a new Ionic project with the default tabs interface, make sure the `ionic` utility is installed: +Get in on App Store +Get it on Google Play -```bash -$ npm install -g ionic cordova -``` +**Problems running zmNinja? Check out the [FAQ](https://github.com/pliablepixels/zmNinja/wiki/FAQ)** -Then run: -```bash -$ ionic start myProject tabs --type=ionic1 -``` +Video Demo +------------- +Check out a video demo of zmNinja [here](https://youtu.be/prtA_mv68Ok) -More info on this can be found on the Ionic [Getting Started](https://ionicframework.com/getting-started) page and the [Ionic CLI](https://github.com/ionic-team/ionic-cli) repo. +Mobile Platforms +--------------------------- +zmNinja is stable as of today and runs on a variety of Android and iOS platforms. +See links above to get them on play store (Android) and app store (iOS) + +It also runs on the desktop (see below) + +Desktop Platforms +----------------- +Please download binaries for Win 7, Linux or Mac from [here](https://github.com/pliablepixels/zmNinja/releases). +Please make sure you download the correct ZIP file (32/64 bit) + + +Key Features (just watch the video already) +-------------------------------------------- +* Push Notifications for alarms (Needs the [eventserver](https://github.com/pliablepixels/zmeventserver) to be set up) +* Multiple languages (English, French, German, Spanish, Portugese, Dutch, and more) +* H264 video branch support +* live views of monitors +* Montage view (with multiple montage profile settings/sizes) +* Events history and list +* Timeline view +* Camera pan/tilt/zoom (needs to have ZM support it first) + +Thanks +------ +To the zonemider community in general, and the awesome Stack Overflow community. +But specifically, [Andrew Bauer](https://github.com/knnniggett) (knnniggett) who egged me on to take up this project. + +Important Notes +--------------- +* zmNinja needs APIs enabled in ZoneMinder. If you are running ZM 1.29 or above, APIs should automatically be available. See [this](https://github.com/pliablepixels/zmNinja/wiki/Validating-if-APIs-work-on-ZM) for instructions on how to make sure your APIs are working. If they are not working, zmNinja **will not** work. + +Before you ask for help +----------------------- +* Make sure you have read the [FAQ](https://github.com/pliablepixels/zmNinja/wiki/FAQ) +* Make sure you have [validated](https://github.com/pliablepixels/zmNinja/wiki/Validating-if-APIs-work-on-ZM) that your APIs are working (if not, its a ZM issue, please post in ZM forums) +* Please don't ask me for help with source compilation if you are not familiar with coding mobile apps - you should try and solve your own problems + + +Objective +---------- +I wanted to learn how to write a mobile app. It was (and is) fun. + +Running from source +---------------------- +Please follow [these](https://github.com/pliablepixels/zmNinja/wiki/Running-zmNinja-from-Source) instructions. + + +Screenshots: +------------ +![](https://github.com/pliablepixels/zmNinja/blob/master/sample_images/IMG_0757.PNG?raw=true) +![](https://github.com/pliablepixels/zmNinja/blob/master/sample_images/IMG_0758.PNG?raw=true) +![](https://github.com/pliablepixels/zmNinja/blob/master/sample_images/IMG_0759.PNG?raw=true) +![](https://github.com/pliablepixels/zmNinja/blob/master/sample_images/IMG_0760.PNG?raw=true) +![](https://github.com/pliablepixels/zmNinja/blob/master/sample_images/IMG_0761.PNG?raw=true) +![](https://github.com/pliablepixels/zmNinja/blob/master/sample_images/IMG_0762.PNG?raw=true) -## Issues -Issues have been disabled on this repo. If you do find an issue or have a question, consider posting it on the [Ionic Forum](https://forum.ionicframework.com/). If there is truly an error, follow our guidelines for [submitting an issue](https://ionicframework.com/submit-issue/) to the main Ionic repository. diff --git a/build_android.sh b/build_android.sh new file mode 100755 index 000000000..a80e76d25 --- /dev/null +++ b/build_android.sh @@ -0,0 +1,108 @@ +#!/bin/bash + +# App signining credentials in this file +NINJAKEYSTORE=~/Desktop/zmNinja.keystore + +if [ ! -f "$NINJAKEYSTORE" ]; then + echo "zmNinja keystore not found" + exit +fi + +mkdir release_files +rm -f release_files/* + +# no arguments - build both +# 1 == build crosswalk only +# 2 == build native only +BUILD_MODE="all" +if [ "$1" = "1" ]; then + BUILD_MODE="xwalk" + echo "only building crosswalk" +fi + +if [ "$1" = "2" ]; then + BUILD_MODE="native" + echo "only building native view (5+)" +fi + +############ Crosswalk build #################################### +if [ "$BUILD_MODE" = "xwalk" ] || [ "$BUILD_MODE" = "all" ]; then + + echo "Building Release mode for Xwalk android..." + echo "--------------------------------------------" + echo "Removing android and re-adding..." + cordova platform remove android + cordova platform add android + cordova plugin remove cordova-plugin-crosswalk-webview + echo "Adding crosswalk..." + #cordova plugin add cordova-plugin-crosswalk-webview + cordova plugin add cordova-plugin-crosswalk-webview@2.2.0 --variable XWALK_MODE="lite" --variable "XWALK_VERSION"="17.46.459.1" + #ionic plugin add cordova-plugin-crosswalk-webview + # crosswalk handles SSL certificate handling in a different way + # need to switch plugins + echo "Adding crosswalk cert plugin..." + cordova plugin remove cordova-plugin-certificates + cordova plugin add https://github.com/danjarvis/cordova-plugin-crosswalk-certificate + cp "$NINJAKEYSTORE" platforms/android/ + cordova build android --release -- --targetSdkVersion=23 + + # copy builds to my release directory + cp platforms/android/build/outputs/apk/android-x86-release-unsigned.apk release_files/ + cp platforms/android/build/outputs/apk/android-armv7-release-unsigned.apk release_files/ + echo "Copied files to release_files" + + # sign them + cd release_files/ + jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ../platforms/android/zmNinja.keystore android-armv7-release-unsigned.apk zmNinja + jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ../platforms/android/zmNinja.keystore android-x86-release-unsigned.apk zmNinja + ~/Library/Android/sdk/build-tools/25.0.2/zipalign -v 4 android-x86-release-unsigned.apk zmNinja-x86-pre5.apk + ~/Library/Android/sdk/build-tools/25.0.2/zipalign -v 4 android-armv7-release-unsigned.apk zmNinja-arm-pre5.apk + rm -f android-x86-release-unsigned.apk android-armv7-release-unsigned.apk + cd .. +fi + + +############ Native web view build ############################### +if [ "$BUILD_MODE" = "native" ] || [ "$BUILD_MODE" = "all" ]; then + + echo "Building Release mode for android 5+..." + echo "--------------------------------------------" + APPVER=`cat config.xml | grep "widget " | sed 's/.* version=\"\([^\"]*\)\" xmlns.*/\1/'` + a=( ${APPVER//./ } ) + vcode="$(((a[0]*10000+a[1]*100+a[2])))9" + + echo "Removing android and re-adding..." + cordova platform remove android + cordova platform add android + + #clean up past build stuff + echo "Adding default browser..." + cordova plugin remove cordova-plugin-crosswalk-webview + + # use the right plugin for SSL certificate mgmt + cordova plugin remove cordova-plugin-crosswalk-certificate + cordova plugin add https://github.com/hypery2k/cordova-certificate-plugin + #ionic platform remove android + #ionic platform add android + cp "$NINJAKEYSTORE" platforms/android/ + + # Make sure native builds are only deployed in devices < Android 5 + cordova build android --release -- --minSdkVersion=21 --versionCode=${vcode} + + # copy build to release folder and sign + cp platforms/android/build/outputs/apk/android-release-unsigned.apk release_files/ + echo "Copied files to release_files" + + cd release_files/ + jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ../platforms/android/zmNinja.keystore android-release-unsigned.apk zmNinja + ~/Library/Android/sdk/build-tools/25.0.2/zipalign -v 4 android-release-unsigned.apk zmNinja.apk + rm -f android-release-unsigned.apk + cd .. +fi + +# Do a phone perm check + + ./checkperms.sh release_files/zmNinja.apk + echo "*** Phone State Check:" + ./checkperms.sh release_files/zmNinja.apk | grep PHONE_STATE + diff --git a/checkperms.sh b/checkperms.sh new file mode 100755 index 000000000..b5f92c5b8 --- /dev/null +++ b/checkperms.sh @@ -0,0 +1,8 @@ +#!/bin/sh +if [ -z "$1" ]; then + FILE="platforms/android/build/outputs/apk/android-debug.apk" +else + FILE="$1" +fi +echo "*** Permissions for $FILE ***" +`echo $ANDROID_HOME`/build-tools/23.0.1/aapt d permissions $FILE diff --git a/config.xml b/config.xml index 5afdb605b..7f0553e2e 100644 --- a/config.xml +++ b/config.xml @@ -27,6 +27,7 @@ + @@ -76,6 +77,7 @@ + @@ -84,9 +86,16 @@ - + + + + + + + + diff --git a/electron_js/main.js b/electron_js/main.js new file mode 100644 index 000000000..7aae0ea00 --- /dev/null +++ b/electron_js/main.js @@ -0,0 +1,112 @@ +const electron = require('electron'); +const windowStateKeeper = require('electron-window-state'); +const {app, globalShortcut} = electron; + +// Module to create native browser window. +const {BrowserWindow} = electron; +var isFs = false; + + + + + +// Keep a global reference of the window object, if you don't, the window will +// be closed automatically when the JavaScript object is garbage collected. +let win; +app.commandLine.appendSwitch ('ignore-certificate-errors', 'true'); + +const shouldQuit = app.makeSingleInstance((commandLine, workingDirectory) => { + // Someone tried to run a second instance, we should focus our window. + if (win) { + if (win.isMinimized()) win.restore(); + win.focus(); + } +}); + +if (shouldQuit) { + app.quit(); + return; +} + + +function createWindow() { + +const mx = globalShortcut.register('CommandOrControl+Alt+F', () => { + console.log('CommandOrControl+F is pressed'); + isFs = !isFs; + win.setFullScreen(isFs); + }) + + const dbgx = globalShortcut.register('CommandOrControl+Alt+D', () => { + console.log('CommandOrControl+Alt+D is pressed'); + win.webContents.openDevTools(); + }) + + + // Create the browser window. + let mainWindowState = windowStateKeeper({ + defaultWidth: 1000, + defaultHeight: 800, + webPreferences:{nodeIntegration:false} + + }); + win = new BrowserWindow({ + x: mainWindowState.x, + y: mainWindowState.y, + width: mainWindowState.width, + height: mainWindowState.height, + webPreferences:{nodeIntegration:false}}); + + mainWindowState.manage(win); + // fs will be arg 1 if its not run in electron debug mode + if (process.argv.slice(1)=='fs' || process.argv.slice(2)=='fs') + { + win.setFullScreen(true); + isFs = true; + } + + + + // and load the index.html of the app. + win.loadURL(`file://${__dirname}/index.html`); + + // Open the DevTools. + //win.webContents.openDevTools(); + + // Emitted when the window is closed. + win.on('closed', () => { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + win = null; + }); +} + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on('ready', createWindow); + + + +// Quit when all windows are closed. +app.on('window-all-closed', () => { + // On macOS it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on('activate', () => { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (win === null) { + createWindow(); + } +}); + +app.on('will-quit', () => { + // Unregister all shortcuts. + globalShortcut.unregisterAll() +}); diff --git a/electron_js/package.json b/electron_js/package.json new file mode 100644 index 000000000..bcab2f07b --- /dev/null +++ b/electron_js/package.json @@ -0,0 +1,5 @@ +{ + "name" : "zmNinjaDesktop", + "version" : "0.1.0", + "main" : "main.js" +} diff --git a/make_desktop.sh b/make_desktop.sh new file mode 100755 index 000000000..b3d6e4e54 --- /dev/null +++ b/make_desktop.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +exe() { echo "\$ $@" ; "$@" ; } + +echo ---------------------------------------------------- +echo Pliable Pixels Desktop build process +echo ---------------------------------------------------- +APPVER=`cat config.xml | grep "widget " | sed 's/.* version=\"\([^\"]*\)\" xmlns.*/\1/'` +APPVER+="D" +echo "Application version:$APPVER" + +declare -a app_ports=("../zmNinja-mac.app/Contents/Resources" "../zmNinja-linux32bit/resources" "../zmNinja-linux64bit/resources" "../zmNinja-win64bit/resources" "../zmNinja-win32bit/resources" "../zmNinja-linuxarm/resources") + +for i in "${app_ports[@]}" +do +if [ -d "$i" ]; then + DIRNAME=`expr "$i" : '\.\./\(.*\)/'` + echo "Dirname:" $DIRNAME + PDIRNAME=`echo "$DIRNAME" | sed "s/\/Contents//" ` + echo "Pdirname:" $PDIRNAME + ZIPNAME="${PDIRNAME}_${APPVER}.zip" + echo "------------------------------------------------------------------------" + echo "Working on packaging $i" + echo "------------------------------------------------------------------------" + exe rm -fr $i/app + exe mkdir $i/app + exe mkdir $i/app/node_modules + exe cp -R node_modules/electron-window-state $i/app/node_modules + exe cp -R node_modules/jsonfile $i/app/node_modules + exe cp -R node_modules/mkdirp $i/app/node_modules + exe cp -R node_modules/deep-equal $i/app/node_modules + exe cp -R www/* $i/app/ + exe cp electron_js/* $i/app + exe cp www/ZMNINJA-LICENSE-DESKTOP-CLIENT.txt ../$DIRNAME + echo $APPVER > ../$DIRNAME/version + exe cp resources/icon.png ../$DIRNAME + exe cd $i + cat app/js/DataModel.js | sed "s/var zmAppVersion[ ]*=[ ]*\"unknown\"/var zmAppVersion=\"$APPVER\"/" > app/js/DataModel.js.tmp + exe rm -fr app/js/DataModel.js + exe mv app/js/DataModel.js.tmp app/js/DataModel.js + + + rm -fr app.asar + exe asar pack app app.asar + exe rm -fr app + exe cd - + #OSX ditto does a better job than zip! + #echo "Creating ZIP $ZIPNAME..." + #exe zip -r ../$ZIPNAME ../$DIRNAME + + echo "Done!" + +else + echo "$i does not exist, skipping" +fi +done + + diff --git a/package-lock.json b/package-lock.json index 83e2edaea..eed5651a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3488,6 +3488,215 @@ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=" }, + "cordova-android": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/cordova-android/-/cordova-android-6.2.3.tgz", + "integrity": "sha1-JJ8hts5fHxyEenq4OxaQnb7Vqig=", + "requires": { + "cordova-common": "2.0.2", + "elementtree": "0.1.6", + "nopt": "3.0.6", + "properties-parser": "0.2.3", + "q": "1.5.0", + "shelljs": "0.5.3" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true + }, + "ansi": { + "version": "0.3.1", + "bundled": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true + }, + "base64-js": { + "version": "0.0.8", + "bundled": true + }, + "big-integer": { + "version": "1.6.22", + "bundled": true + }, + "bplist-parser": { + "version": "0.1.1", + "bundled": true, + "requires": { + "big-integer": "1.6.22" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "cordova-common": { + "version": "2.0.2", + "bundled": true, + "requires": { + "ansi": "0.3.1", + "bplist-parser": "0.1.1", + "cordova-registry-mapper": "1.1.15", + "elementtree": "0.1.6", + "glob": "5.0.15", + "minimatch": "3.0.3", + "osenv": "0.1.4", + "plist": "1.2.0", + "q": "1.5.0", + "semver": "5.3.0", + "shelljs": "0.5.3", + "underscore": "1.8.3", + "unorm": "1.4.1" + } + }, + "cordova-registry-mapper": { + "version": "1.1.15", + "bundled": true + }, + "elementtree": { + "version": "0.1.6", + "bundled": true, + "requires": { + "sax": "0.3.5" + } + }, + "glob": { + "version": "5.0.15", + "bundled": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.3", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "lodash": { + "version": "3.10.1", + "bundled": true + }, + "minimatch": { + "version": "3.0.3", + "bundled": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "nopt": { + "version": "3.0.6", + "bundled": true, + "requires": { + "abbrev": "1.1.0" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "plist": { + "version": "1.2.0", + "bundled": true, + "requires": { + "base64-js": "0.0.8", + "util-deprecate": "1.0.2", + "xmlbuilder": "4.0.0", + "xmldom": "0.1.27" + } + }, + "properties-parser": { + "version": "0.2.3", + "bundled": true + }, + "q": { + "version": "1.5.0", + "bundled": true + }, + "sax": { + "version": "0.3.5", + "bundled": true + }, + "semver": { + "version": "5.3.0", + "bundled": true + }, + "shelljs": { + "version": "0.5.3", + "bundled": true + }, + "underscore": { + "version": "1.8.3", + "bundled": true + }, + "unorm": { + "version": "1.4.1", + "bundled": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "xmlbuilder": { + "version": "4.0.0", + "bundled": true, + "requires": { + "lodash": "3.10.1" + } + }, + "xmldom": { + "version": "0.1.27", + "bundled": true + } + } + }, "cordova-app-hello-world": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/cordova-app-hello-world/-/cordova-app-hello-world-3.9.0.tgz", @@ -3881,9 +4090,6 @@ "resolved": "https://registry.npmjs.org/cordova-plugin-app-version/-/cordova-plugin-app-version-0.1.9.tgz", "integrity": "sha1-nbBgeGMzenEEiTAuX1CpBPFEm9s=" }, - "cordova-plugin-certificates": { - "version": "git+https://github.com/hypery2k/cordova-certificate-plugin.git#762175849f553a4a98a47f6ab55438df8223647e" - }, "cordova-plugin-compat": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/cordova-plugin-compat/-/cordova-plugin-compat-1.1.0.tgz", @@ -3894,6 +4100,14 @@ "resolved": "https://registry.npmjs.org/cordova-plugin-console/-/cordova-plugin-console-1.0.7.tgz", "integrity": "sha1-ibepLtHDNYiN/ADZAtxBcgHPOws=" }, + "cordova-plugin-crosswalk-certificate": { + "version": "git+https://github.com/danjarvis/cordova-plugin-crosswalk-certificate.git#d94d92cdf7c4440d92614eb04332af6b0fb1de3e" + }, + "cordova-plugin-crosswalk-webview": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cordova-plugin-crosswalk-webview/-/cordova-plugin-crosswalk-webview-2.2.0.tgz", + "integrity": "sha1-tbd4HjqROwGABWV9NHzbcm/ZLlM=" + }, "cordova-plugin-customurlscheme": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/cordova-plugin-customurlscheme/-/cordova-plugin-customurlscheme-4.3.0.tgz", diff --git a/package.json b/package.json index 806b114ba..c1995dffa 100644 --- a/package.json +++ b/package.json @@ -16,14 +16,16 @@ "async": "^1.4.2", "autoprefixer": "^7.1.4", "com.telerik.plugins.nativepagetransitions": "^0.6.5", + "cordova-android": "^6.2.3", "cordova-ios": "^4.4.0", "cordova-library-helper": "^1.0.4", "cordova-plugin-add-swift-support": "^1.7.0", "cordova-plugin-android-permissions": "^1.0.0", "cordova-plugin-app-version": "^0.1.9", - "cordova-plugin-certificates": "git+https://github.com/hypery2k/cordova-certificate-plugin.git", "cordova-plugin-compat": "^1.1.0", "cordova-plugin-console": "^1.0.7", + "cordova-plugin-crosswalk-certificate": "git+https://github.com/danjarvis/cordova-plugin-crosswalk-certificate.git", + "cordova-plugin-crosswalk-webview": "^2.2.0", "cordova-plugin-customurlscheme": "^4.3.0", "cordova-plugin-device": "^1.1.6", "cordova-plugin-email": "^1.2.6", @@ -160,6 +162,7 @@ ], "cordova": { "platforms": [ + "android", "ios" ], "plugins": { @@ -168,7 +171,6 @@ }, "cordova-plugin-settings-hook": {}, "cordova-sqlite-storage": {}, - "cordova-plugin-certificates": {}, "cordova-library-helper": { "PHOTO_LIBRARY_USAGE_DESCRIPTION": "Save media to your Camera Roll" }, @@ -203,7 +205,15 @@ "SENDER_ID": "710936220256" }, "cordova-plugin-email": {}, - "cordova-plugin-statusbar": {} + "cordova-plugin-statusbar": {}, + "cordova-plugin-crosswalk-certificate": {}, + "cordova-plugin-crosswalk-webview": { + "XWALK_MODE": "lite", + "XWALK_VERSION": "17.46.459.1", + "XWALK_LITEVERSION": "xwalk_core_library_canary:17+", + "XWALK_COMMANDLINE": "--disable-pull-to-refresh-effect", + "XWALK_MULTIPLEAPK": "true" + } } } } \ No newline at end of file diff --git a/release_files/zmNinja-arm-pre5.apk b/release_files/zmNinja-arm-pre5.apk new file mode 100644 index 000000000..d43c4c46b Binary files /dev/null and b/release_files/zmNinja-arm-pre5.apk differ diff --git a/release_files/zmNinja-x86-pre5.apk b/release_files/zmNinja-x86-pre5.apk new file mode 100644 index 000000000..f62ff79ad Binary files /dev/null and b/release_files/zmNinja-x86-pre5.apk differ diff --git a/resources/android/icon/drawable-hdpi-icon.png b/resources/android/icon/drawable-hdpi-icon.png index cf630d2d0..d79947937 100644 Binary files a/resources/android/icon/drawable-hdpi-icon.png and b/resources/android/icon/drawable-hdpi-icon.png differ diff --git a/resources/android/icon/drawable-ldpi-icon.png b/resources/android/icon/drawable-ldpi-icon.png index a5310295b..a19ac62fa 100644 Binary files a/resources/android/icon/drawable-ldpi-icon.png and b/resources/android/icon/drawable-ldpi-icon.png differ diff --git a/resources/android/icon/drawable-mdpi-icon.png b/resources/android/icon/drawable-mdpi-icon.png index a8193db21..3f8d95602 100644 Binary files a/resources/android/icon/drawable-mdpi-icon.png and b/resources/android/icon/drawable-mdpi-icon.png differ diff --git a/resources/android/icon/drawable-xhdpi-icon.png b/resources/android/icon/drawable-xhdpi-icon.png index d6cf1b2eb..f8f7d05ac 100644 Binary files a/resources/android/icon/drawable-xhdpi-icon.png and b/resources/android/icon/drawable-xhdpi-icon.png differ diff --git a/resources/android/icon/drawable-xxhdpi-icon.png b/resources/android/icon/drawable-xxhdpi-icon.png index a3d24e697..ff226a3bd 100644 Binary files a/resources/android/icon/drawable-xxhdpi-icon.png and b/resources/android/icon/drawable-xxhdpi-icon.png differ diff --git a/resources/android/icon/drawable-xxxhdpi-icon.png b/resources/android/icon/drawable-xxxhdpi-icon.png index eec428697..59a3cc065 100644 Binary files a/resources/android/icon/drawable-xxxhdpi-icon.png and b/resources/android/icon/drawable-xxxhdpi-icon.png differ diff --git a/resources/android/splash/drawable-land-hdpi-screen.png b/resources/android/splash/drawable-land-hdpi-screen.png index 074c3306a..6050ae999 100644 Binary files a/resources/android/splash/drawable-land-hdpi-screen.png and b/resources/android/splash/drawable-land-hdpi-screen.png differ diff --git a/resources/android/splash/drawable-land-ldpi-screen.png b/resources/android/splash/drawable-land-ldpi-screen.png index e5c661ace..06d581147 100644 Binary files a/resources/android/splash/drawable-land-ldpi-screen.png and b/resources/android/splash/drawable-land-ldpi-screen.png differ diff --git a/resources/android/splash/drawable-land-mdpi-screen.png b/resources/android/splash/drawable-land-mdpi-screen.png index 4def38dcb..394c41c23 100644 Binary files a/resources/android/splash/drawable-land-mdpi-screen.png and b/resources/android/splash/drawable-land-mdpi-screen.png differ diff --git a/resources/android/splash/drawable-land-xhdpi-screen.png b/resources/android/splash/drawable-land-xhdpi-screen.png index 2c99a0611..1c0ef5169 100644 Binary files a/resources/android/splash/drawable-land-xhdpi-screen.png and b/resources/android/splash/drawable-land-xhdpi-screen.png differ diff --git a/resources/android/splash/drawable-land-xxhdpi-screen.png b/resources/android/splash/drawable-land-xxhdpi-screen.png index 20a398fe0..8cb4b17d0 100644 Binary files a/resources/android/splash/drawable-land-xxhdpi-screen.png and b/resources/android/splash/drawable-land-xxhdpi-screen.png differ diff --git a/resources/android/splash/drawable-land-xxxhdpi-screen.png b/resources/android/splash/drawable-land-xxxhdpi-screen.png index 63896f617..e411153a9 100644 Binary files a/resources/android/splash/drawable-land-xxxhdpi-screen.png and b/resources/android/splash/drawable-land-xxxhdpi-screen.png differ diff --git a/resources/android/splash/drawable-port-hdpi-screen.png b/resources/android/splash/drawable-port-hdpi-screen.png index 2b9bc71a9..a011c130d 100644 Binary files a/resources/android/splash/drawable-port-hdpi-screen.png and b/resources/android/splash/drawable-port-hdpi-screen.png differ diff --git a/resources/android/splash/drawable-port-ldpi-screen.png b/resources/android/splash/drawable-port-ldpi-screen.png index bd92936f4..55ce32bb4 100644 Binary files a/resources/android/splash/drawable-port-ldpi-screen.png and b/resources/android/splash/drawable-port-ldpi-screen.png differ diff --git a/resources/android/splash/drawable-port-mdpi-screen.png b/resources/android/splash/drawable-port-mdpi-screen.png index aa0537aff..0d90a3e40 100644 Binary files a/resources/android/splash/drawable-port-mdpi-screen.png and b/resources/android/splash/drawable-port-mdpi-screen.png differ diff --git a/resources/android/splash/drawable-port-xhdpi-screen.png b/resources/android/splash/drawable-port-xhdpi-screen.png index a5736b764..fd2047d88 100644 Binary files a/resources/android/splash/drawable-port-xhdpi-screen.png and b/resources/android/splash/drawable-port-xhdpi-screen.png differ diff --git a/resources/android/splash/drawable-port-xxhdpi-screen.png b/resources/android/splash/drawable-port-xxhdpi-screen.png index 238fd3d8a..ff117d22f 100644 Binary files a/resources/android/splash/drawable-port-xxhdpi-screen.png and b/resources/android/splash/drawable-port-xxhdpi-screen.png differ diff --git a/resources/android/splash/drawable-port-xxxhdpi-screen.png b/resources/android/splash/drawable-port-xxxhdpi-screen.png index ca706f081..a6214aa68 100644 Binary files a/resources/android/splash/drawable-port-xxxhdpi-screen.png and b/resources/android/splash/drawable-port-xxxhdpi-screen.png differ diff --git a/resources/icon.png.md5 b/resources/icon.png.md5 new file mode 100644 index 000000000..a8d9c88c6 --- /dev/null +++ b/resources/icon.png.md5 @@ -0,0 +1 @@ +66f301be9c398273cfbd403b0c2f2554 \ No newline at end of file diff --git a/resources/splash.png.md5 b/resources/splash.png.md5 new file mode 100644 index 000000000..ae2ef7be7 --- /dev/null +++ b/resources/splash.png.md5 @@ -0,0 +1 @@ +8961610c7ed99dde6eab74b1cf0b6110 \ No newline at end of file