private void CatcherHelper_NotificationListSizeChanged(object sender, NotificationListSizeChangedEventArgs e)
 {
     RunOnUiThread(() =>
     {
         if (e.ThereAreNotifications)
         {
             if (clearAll != null)
             {
                 clearAll.Visibility = ViewStates.Visible;
             }
         }
         else
         {
             if (clearAll != null)
             {
                 clearAll.Visibility = ViewStates.Invisible;
             }
             if (configurationManager.RetrieveAValue(ConfigurationParameters.TurnOffScreenAfterLastNotificationCleared)
                 &&
                 ActivityLifecycleHelper.GetInstance().GetActivityState(typeof(LockScreenActivity)) == ActivityStates.Resumed)
             {
                 AwakeHelper.TurnOffScreen();
             }
         }
     });
 }
 protected override void OnPause()
 {
     base.OnPause();
     watchDog.Stop();
     watchDog.Elapsed -= WatchdogInterval_Elapsed;
     ActivityLifecycleHelper.GetInstance().NotifyActivityStateChange(typeof(LockScreenActivity), ActivityStates.Paused);
 }
 private void WatchdogInterval_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
 {
     //it works correctly, but I want to refactor this. (Regression)
     if (ActivityLifecycleHelper.GetInstance().GetActivityState(typeof(LockScreenActivity)) == ActivityStates.Resumed)
     {
         AwakeHelper.TurnOffScreen();
     }
 }
        protected override void OnResume()
        {
            base.OnResume();
            AddFlags();
            watchDog.Elapsed += WatchdogInterval_Elapsed;
            watchDog.Stop();
            watchDog.Start();
            ActivityLifecycleHelper.GetInstance().NotifyActivityStateChange(typeof(LockScreenActivity), ActivityStates.Resumed);
            if (configurationManager.RetrieveAValue(ConfigurationParameters.TutorialRead) == false)
            {
                welcome            = FindViewById <TextView>(Resource.Id.welcomeoverlay);
                welcome.Text       = Resources.GetString(Resource.String.tutorialtext);
                welcome.Visibility = ViewStates.Visible;
                welcome.Touch     += Welcome_Touch;
            }
            //Check if Awake is enabled.
            //Refactor
            switch (AwakeHelper.GetAwakeStatus())
            {
            case AwakeStatus.None:
                livedisplayinfo.Text = Resources.GetString(Resource.String.idk);
                break;

            case AwakeStatus.CompletelyDisabled:
                livedisplayinfo.Text = "Completely disabled";
                break;

            case AwakeStatus.Up:
                livedisplayinfo.Text = "Awake is active";
                break;

            case AwakeStatus.Sleeping:
                livedisplayinfo.Text = "Awake is Sleeping";
                break;

            case AwakeStatus.UpWithDeviceMotionDisabled:
                livedisplayinfo.Text = "Awake is active but not listening orientation changes";
                break;

            case AwakeStatus.SleepingWithDeviceMotionEnabled:
                livedisplayinfo.Text = "Awake is sleeping but listening orientation changes";
                break;

            case AwakeStatus.DisabledbyUser:
                livedisplayinfo.Text = "Awake is disabled by the user.";
                break;

            default:
                break;
            }
        }
 public override void OnDestroy()
 {
     base.OnDestroy();
     ActivityLifecycleHelper.GetInstance().ActivityStateChanged -= LockScreenActivity_OnActivityStateChanged;
     floatingNotificationView.Click                -= FloatingNotificationView_Click;
     NotificationAdapterViewHolder.ItemClicked     -= NotificationAdapterViewHolder_ItemClicked;
     NotificationAdapterViewHolder.ItemLongClicked -= NotificationAdapterViewHolder_ItemLongClicked;
     CatcherHelper.NotificationRemoved             -= CatcherHelper_NotificationRemoved;
     CatcherHelper.NotificationPosted              -= CatcherHelper_NotificationPosted;
     if (floatingNotificationView != null)
     {
         floatingNotificationAppName.Dispose();
         floatingNotificationWhen.Dispose();
         floatingNotificationTitle.Dispose();
         floatingNotificationText.Dispose();
         windowManager.RemoveView(floatingNotificationView);
         windowManager.Dispose();
     }
     openNotification?.Dispose();
 }
        protected override void OnDestroy()
        {
            base.OnDestroy();
            ActivityLifecycleHelper.GetInstance().NotifyActivityStateChange(typeof(LockScreenActivity), ActivityStates.Destroyed);
            //Unbind events

            clearAll.Click -= BtnClearAll_Click;
            WallpaperPublisher.NewWallpaperIssued       -= Wallpaper_NewWallpaperIssued;
            CatcherHelper.NotificationListSizeChanged   -= CatcherHelper_NotificationListSizeChanged;
            WidgetStatusPublisher.OnWidgetStatusChanged += WidgetStatusPublisher_OnWidgetStatusChanged;
            lockscreen.Touch -= Lockscreen_Touch;

            watchDog.Stop();
            watchDog.Elapsed -= WatchdogInterval_Elapsed;
            watchDog.Dispose();
            //Dispose Views
            //Views
            recycler.Dispose();
            clearAll.Dispose();
            lockscreen.Dispose();

            viewPropertyAnimator.Dispose();
        }
        private void Wallpaper_NewWallpaperIssued(object sender, WallpaperChangedEventArgs e)
        {
            RunOnUiThread(() =>
            {
                if (configurationManager.RetrieveAValue(ConfigurationParameters.AwakeCausesBlackWallpaper))
                {
                    Window.DecorView.SetBackgroundColor(Color.Black);
                    return;
                }
                if (configurationManager.RetrieveAValue(ConfigurationParameters.DisableWallpaperChangeAnim) == false) //If the animation is not disabled.
                {
                    if (ActivityLifecycleHelper.GetInstance().GetActivityState(typeof(LockScreenActivity)) == ActivityStates.Resumed)
                    {
                        //Animate only when the activity is visible to the user.
                        Window.DecorView.Animate().SetDuration(100).Alpha(0.5f);
                    }
                }

                if (e.Wallpaper?.Bitmap != null)
                {
                    Window.DecorView.Background = e.Wallpaper;
                }
            });
        }
        public override void OnCreate()
        {
            base.OnCreate();
            WindowManagerTypes layoutType = WindowManagerTypes.Phone;

            if (Build.VERSION.SdkInt > BuildVersionCodes.NMr1)      //Nougat 7.1
            {
                layoutType = WindowManagerTypes.ApplicationOverlay; //Android Oreo does not allow to add windows of WindowManagerTypes.Phone
            }

            windowManager = GetSystemService(WindowService).JavaCast <IWindowManager>();

            var lol = LayoutInflater.From(this);

            floatingNotificationView = (LinearLayout)lol.Inflate(Resource.Layout.FloatingNotification, null);
            //var floatingList = (RecyclerView)lol.Inflate(Resource.Layout.NotificationList, null);

            //using (var layoutManager = new LinearLayoutManager(Application.Context))
            //{
            //    floatingList.SetLayoutManager(layoutManager);
            //    floatingList.SetAdapter(CatcherHelper.notificationAdapter);
            //}
            int width = 200;
            var floatingNotificationWidth = TypedValue.ApplyDimension(ComplexUnitType.Dip, width, Resources.DisplayMetrics);

            //var uiOptions = (int)floatingList.SystemUiVisibility;
            //var newUiOptions = uiOptions;

            //newUiOptions |= (int)SystemUiFlags.Fullscreen;
            //newUiOptions |= (int)SystemUiFlags.HideNavigation;
            //newUiOptions |= (int)SystemUiFlags.Immersive;
            //// This option will make bars disappear by themselves
            //newUiOptions |= (int)SystemUiFlags.ImmersiveSticky;
            //floatingList.SystemUiVisibility = (StatusBarVisibility)newUiOptions;

            WindowManagerLayoutParams layoutParams = new WindowManagerLayoutParams
            {
                Width  = (int)floatingNotificationWidth,
                Height = ViewGroup.LayoutParams.WrapContent,
                Type   = layoutType,
                Flags  =
                    WindowManagerFlags.NotFocusable
                    | WindowManagerFlags.WatchOutsideTouch
                    | WindowManagerFlags.ShowWhenLocked,
                Format  = Format.Translucent,
                Gravity = GravityFlags.CenterHorizontal | GravityFlags.CenterVertical
            };

            floatingNotificationView.Visibility = ViewStates.Gone;

            windowManager.AddView(floatingNotificationView, layoutParams);
            //windowManager.AddView(floatingList, layoutParams);

            floatingNotificationAppName          = floatingNotificationView.FindViewById <TextView>(Resource.Id.tvAppName);
            floatingNotificationWhen             = floatingNotificationView.FindViewById <TextView>(Resource.Id.tvWhen);
            floatingNotificationTitle            = floatingNotificationView.FindViewById <TextView>(Resource.Id.tvTitle);
            floatingNotificationText             = floatingNotificationView.FindViewById <TextView>(Resource.Id.tvText);
            floatingNotificationActionsContainer = floatingNotificationView.FindViewById <LinearLayout>(Resource.Id.notificationActions);

            CatcherHelper.NotificationRemoved             += CatcherHelper_NotificationRemoved;
            CatcherHelper.NotificationPosted              += CatcherHelper_NotificationPosted;
            NotificationAdapterViewHolder.ItemClicked     += NotificationAdapterViewHolder_ItemClicked;
            NotificationAdapterViewHolder.ItemLongClicked += NotificationAdapterViewHolder_ItemLongClicked;
            ActivityLifecycleHelper.GetInstance().ActivityStateChanged += LockScreenActivity_OnActivityStateChanged;
            floatingNotificationView.SetOnTouchListener(this);
        }