Home | History | Annotate | Download | only in screen_orientation
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CONTENT_BROWSER_SCREEN_ORIENTATION_SCREEN_ORIENTATION_PROVIDER_ANDROID_H_
      6 #define CONTENT_BROWSER_SCREEN_ORIENTATION_SCREEN_ORIENTATION_PROVIDER_ANDROID_H_
      7 
      8 #include <jni.h>
      9 
     10 #include "base/compiler_specific.h"
     11 #include "content/public/browser/screen_orientation_provider.h"
     12 #include "content/public/browser/web_contents_observer.h"
     13 
     14 namespace content {
     15 
     16 class ScreenOrientationDispatcherHost;
     17 class WebContentsImpl;
     18 
     19 class ScreenOrientationProviderAndroid : public ScreenOrientationProvider,
     20                                          public WebContentsObserver {
     21  public:
     22   explicit ScreenOrientationProviderAndroid(
     23       ScreenOrientationDispatcherHost* dispatcher,
     24       WebContents* web_contents);
     25 
     26   static bool Register(JNIEnv* env);
     27 
     28   // ScreenOrientationProvider
     29   virtual void LockOrientation(int request_id,
     30                                blink::WebScreenOrientationLockType) OVERRIDE;
     31   virtual void UnlockOrientation() OVERRIDE;
     32   virtual void OnOrientationChange() OVERRIDE;
     33 
     34   // WebContentsObserver
     35   virtual void DidToggleFullscreenModeForTab(bool entered_fullscreen) OVERRIDE;
     36 
     37   // Ask the ScreenOrientationListener (Java) to start accurately listening to
     38   // the screen orientation. It keep track of the number of start request if it
     39   // is already running an accurate listening.
     40   static void StartAccurateListening();
     41 
     42   // Ask the ScreenOrientationListener (Java) to stop accurately listening to
     43   // the screen orientation. It will actually stop only if the number of stop
     44   // requests matches the number of start requests.
     45   static void StopAccurateListening();
     46 
     47  private:
     48   WebContentsImpl* web_contents_impl();
     49 
     50   // Whether the passed |lock| matches the current orientation. In other words,
     51   // whether the orientation will need to change to match the |lock|.
     52   bool LockMatchesCurrentOrientation(blink::WebScreenOrientationLockType lock);
     53 
     54   // Returns the lock type that should be associated with 'natural' lock.
     55   // Returns WebScreenOrientationLockDefault if the natural lock type can't be
     56   // found.
     57   blink::WebScreenOrientationLockType GetNaturalLockType() const;
     58 
     59   virtual ~ScreenOrientationProviderAndroid();
     60 
     61   // ScreenOrientationDispatcherHost owns ScreenOrientationProvider so
     62   // dispatcher_ should not point to an invalid memory.
     63   ScreenOrientationDispatcherHost* dispatcher_;
     64 
     65   // Whether the ScreenOrientationProvider currently has a lock applied.
     66   bool lock_applied_;
     67 
     68   struct LockInformation {
     69     LockInformation(int request_id, blink::WebScreenOrientationLockType lock);
     70     int request_id;
     71     blink::WebScreenOrientationLockType lock;
     72   };
     73   LockInformation* pending_lock_;
     74 
     75   DISALLOW_COPY_AND_ASSIGN(ScreenOrientationProviderAndroid);
     76 };
     77 
     78 } // namespace content
     79 
     80 #endif // CONTENT_BROWSER_SCREEN_ORIENTATION_SCREEN_ORIENTATION_PROVIDER_ANDROID_H_
     81