日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android7.1 Presentation双屏异显原理分析

發(fā)布時間:2025/3/15 Android 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android7.1 Presentation双屏异显原理分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

緒論
???????隨著用戶的需求增多,特別是對于一些Android平板電腦以及其他的一些Android智能設備可能有多個屏幕,用戶不僅想要在主屏幕上顯示內(nèi)容,同樣在第二屏幕上也要顯示想要的內(nèi)容,這樣可以達到更好的體驗效果。Google也是不負眾望在Android4.2版本以后提供了Presentation類,可以輕松實現(xiàn)在兩塊屏幕上同時顯示不同的內(nèi)容。

??????Presentation是一個特殊的dialog,它的目的是顯示內(nèi)容到第二屏幕。在Presentation創(chuàng)建的時候關(guān)聯(lián)一個目標設備,確定Presentation要顯示在那個設備上,根據(jù)這個設備的信息來配置Presentation的context和resources信息。

??????Presentation的context與包含它的Activity的context是不相同的,用presentation的上下文來填充一個presentation的layout和加載其它的資源是非常重要的,可以確保我們加載的目標設備正確的尺寸密度assets。

??????當Presentation附屬的display被移除的話,Presentation就會自動被取消。當創(chuàng)建Presentation的Activity自己處于paused或者resumed,無論Presentation在顯示什么內(nèi)容,該Activity就要關(guān)心對Presentation?進行pausing?and?resuming。

??????本文將講解如何使用Presentation類做到雙屏異顯,以及實現(xiàn)的原理。

使用方法
??????在將presentation顯示出來之前,最重要的事情就是選擇要將presentation顯示在哪個設備上。要選擇一個presentation顯示在哪個設備可能是一件非常困難的事情,因為有可能此時系統(tǒng)中有多個設備。與其自己猜想哪個設備是最適合顯示presentation,可以讓系統(tǒng)幫我們選擇一個最好的設備。在Android系統(tǒng)中為我們提供了兩種使用presentation的方法:

media router
??????選擇顯示presentation的設備最簡單的方法就是使用Media?Router,media?router服務持續(xù)追蹤在系統(tǒng)中哪個音頻視頻線路是可用的,當routes被選擇或者不被選擇,或者更好的顯示presentation?display的線路發(fā)生改變后media?router就會發(fā)送消息。所以一些應用程序可以自動監(jiān)視這些消息來在首選設備上顯示或取消presentation。

??????首選顯示presentation的設備是Media?Router進行推薦的,如果應用想要顯示內(nèi)容在第二屏幕上就該使用該設備。有時可能沒有首選顯示presentation的設備,在這種情況下,應用可以在本地顯示內(nèi)容而不使用presentation。

?????下面將給出如何使用media router在首選的設備創(chuàng)建和顯示presentation。

??????根據(jù)上面代碼可以看出通過系統(tǒng)服務Media?Router來選擇一個合適的route,從route中來獲取首選的display,如果之前已經(jīng)有presentation,就要判斷一下之前presentation顯示的display是否與新的display相同,如果不相同說明首選的display發(fā)生了改變,就將該presentation取消,置空,再去創(chuàng)建,否則不用創(chuàng)建。如果是第一次創(chuàng)建presentation只要首選的display不為空就會創(chuàng)建該presentation,創(chuàng)建完成后調(diào)用presentation的show方法將該presentation顯示出來。

display manager
??????另外一個獲取首選display的方法是直接使用display?Manager來獲取。display?manager服務提供方法枚舉和描述系統(tǒng)中所有的設備,包括可以顯示presentation的設備。display?manager持續(xù)追蹤系統(tǒng)中所有的設備,然而,并不是所有的設備都適合顯示presentation,例如,如果一個Activity試圖在主屏幕上顯示一個presentation,它可能會掩蓋自己的內(nèi)容,這就象在Activity上打開一個dialog一樣。

?????下面將給出例子,演示如何使用Display?Manager獲取合適的display顯示presentation。

????根據(jù)上面代碼可以看出通過系統(tǒng)服務Display?Manager來獲取所有適合顯示presentation的display列表,如果獲取到了多個適合display對象,之后我們就要考慮給用戶一個選擇,我們選擇第一個為首選的display。最后顯示presentation。

獲取首選顯示設備

????根據(jù)上文可以知道我們有兩種方法使用presentation,而在本文中主要講解第二種直接使用display?Manager來獲取首選display。

獲取display服務


?????我們在Activity中使用getSystemService函數(shù),通過參數(shù)Context.DISPLAY_SERVICE來指定要獲取Service的類型。調(diào)用到Activity.java的getSystemService函數(shù)中,如果去需要創(chuàng)建的對象為Window?manager或者search?manager就直接將對象返回,因為在activity.java中有這兩個對象,如果我們要獲取display?Service就需要繼續(xù)獲取。

由于Activity.java繼承自ContextThemeWrapper.java,所以就會調(diào)用父類的getSystemService函數(shù)。

????在父類中首先判斷獲取的Service是否是inflater服務,如果是就創(chuàng)建一個mInflater返回,否則就調(diào)用getBaseContext函數(shù)獲取在ContextWrapper.java中設置的context對象,在創(chuàng)建Activity的時候ActivityThread調(diào)用ContextImpl的createActivityContext函數(shù)創(chuàng)建一個ContextImpl對象,然后通過Activity的attach函數(shù)將該contex對象設置到ContextWrapper中。所以getBaseContext函數(shù)獲取的也就是一個ContextImpl對象,之后會調(diào)用該對象的getSystemService函數(shù)。最后就會調(diào)用到SystemServiceRegistry的getSystemService函數(shù)獲取服務。

??????根據(jù)SystemServiceRegistry的名字可以看出來,該類是注冊了系統(tǒng)服務的,我們通過context以及需要獲取對象的name就可以獲取相應的系統(tǒng)服務了。下面詳細講解該類。

??????SystemServiceRegistry的作用就是管理系統(tǒng)中的所有的服務,并且使用context通過getSystemService獲取服務對象。

??????SystemServiceRegistry對象配置在了preloaded-classes文件中,當系統(tǒng)啟動的時候在ZygoteInit的preload函數(shù)中進行加載該文件,對該文件中的對象進行預加載初始化。在SystemServiceRegistry對象的靜態(tài)代碼塊中調(diào)用registerService函數(shù)將系統(tǒng)中的服務注冊在SYSTEM_SERVICE_NAMES和SYSTEM_SERVICE_FETCHERS中,例如我們要獲取的Display服務:

????將Context.DISPLAY_SERVICE,DisplayManager.class以及CachedServiceFetcher對象類型為DisplayManager傳入registerService函數(shù)。

????在該函數(shù)中將傳入的對象記錄在兩個hashMap中,這兩個map在初始化完成后就不允許改變了。

????如上文當我們使用getSystemService獲取服務時,根據(jù)服務name從SYSTEM_SERVICE_FETCHERS中取出fetcher對象,display對象的fetcher對象為CachedServiceFetcher。

????調(diào)用getService函數(shù)來獲取服務,先從cache里面獲取service,如果cache中沒有服務對象就調(diào)用createService函數(shù)進行創(chuàng)建,將新創(chuàng)建的服務對象放入cache中用對應下標記錄。createService函數(shù)為抽象函數(shù)在子類中實現(xiàn),從上文注冊display對象時可以看出createService函數(shù)創(chuàng)建了DisplayManager對象傳入?yún)?shù)context對象,context對象為調(diào)用getSystemService函數(shù)的activity。

????在DisplayManager的構(gòu)造函數(shù)中將傳入的context對象記錄在mContext成員變量中,并且創(chuàng)建DisplayManagerGlobal對象,mGlobal對象的創(chuàng)建屬于單例模式。

????在getInstance函數(shù)中,創(chuàng)建一個Display服務的binder對象,將binder轉(zhuǎn)換成IDisplayManager接口對象,記錄在成員變量mDm中。

將創(chuàng)建好的服務返回記錄在cache中,并且返回到獲取服務的Activity中。這就獲取到了display服務了。

設備初始化


??????在講解獲取設備時,首先講一下系統(tǒng)中的設備如何初始化。在開機過程中系統(tǒng)調(diào)用DisplayManagerService的onStart函數(shù)來注冊本地服務,并且發(fā)送Handle消息MSG_REGISTER_DEFAULT_DISPLAY_ADAPTER來注冊本地設備。在調(diào)用registerDisplayAdapterLocked函數(shù)時,創(chuàng)建LocalDisplayAdapter對象傳入該函數(shù)。

??????在registerDisplayAdapterLocked函數(shù)中將傳入的adapter對象放入mDisplayAdapters列表,并且調(diào)用LocalDisplayAdapter的registerLocked函數(shù)來注冊設備。

??????在注冊設備時遍歷BUILT_IN_DISPLAY_IDS_TO_SCAN列表,在該列表中有主屏幕,HDMI屏幕,依附HDMI的TERTIARY屏幕三種類型的屏幕。依次根據(jù)這三個設備調(diào)用tryConnectDisplayLocked函數(shù)來嘗試連接設備。

??????在嘗試連接設備時調(diào)用SurfaceControl的getBuiltInDisplay函數(shù)獲取到對應設備id的token對象,如果token為null說明不存在該設備,如果找到對應的token對象,看一下該設備有沒有可用的configs,如果沒有直接返回。再判斷有沒有活動的配置activeConfig,如果沒有也會返回。最后都滿足要求的話,在mDevices列表中獲取Device,如果此時還沒有創(chuàng)建Device對象,就創(chuàng)建LocalDisplayDevice對象,并且加入mDevices列表,調(diào)用sendDisplayDeviceEventLocked發(fā)送設備添加的消息,如果之前已經(jīng)創(chuàng)建過了Device對象就判斷該設備的信息是否更新了,如果更新了就發(fā)送設備改變的消息。

??????在發(fā)送消息時, 通過mHandle對象發(fā)送一個Runnable對象,在run函數(shù)中調(diào)用mListener的onDisplayDeviceEvent函數(shù)通知監(jiān)聽器設備變化。mHandle與mListener都是在創(chuàng)建LocalDisplayAdapter的時候進行賦值的,如上文調(diào)用registerDisplayAdapterLocked函數(shù)時創(chuàng)建,最后回到DisplayManagerService的DisplayAdapterListener對象中。

在DisplayAdapterListener中監(jiān)聽了設備的增加,變化,移除事件。

????當設備增加時調(diào)用handleDisplayDeviceAdded函數(shù),并且將前邊創(chuàng)建的LocalDisplayDevice傳給該對象。

??????之后調(diào)用LocalDisplayDevice的getDisplayDeviceInfoLocked函數(shù)獲取設備信息,在該函數(shù)中設置主屏設備,以及其他設備的初始化信息。之后調(diào)用addLogicalDisplayLocked函數(shù)基于所給的display信息來添加一個logical?display。

????首先獲取設備的信息,根據(jù)設備的flag來判斷是否是默認主屏幕,以設備id,layerStack,LocalDisplayDevice作為參數(shù)創(chuàng)建LogicalDisplay對象。

????在創(chuàng)建LogicalDisplay時也創(chuàng)建一個mBaseDisplayInfo對象,之后調(diào)用updateLocked函數(shù)來根據(jù)可用的Device來更新logical?display,如果logical?display依附的設備已經(jīng)被移除了它就不可用了。updateLocked函數(shù)主要內(nèi)容如下:


????mPrimaryDisplayDevice對象在LogicalDisplay的構(gòu)造函數(shù)中進行賦值是一個LocalDisplayDevice,調(diào)用該對象的getDisplayDeviceInfoLocked獲取設備的基本信息,賦值給mBaseDisplayInfo對象中。

?????更新完設備信息回到addLogicalDisplayLocked函數(shù),將新創(chuàng)建的設備對象放入mLogicalDisplays列表中,我們可以通過設備id在該列表中獲取我們需要的設備對象。

獲取設備

??????當獲取display服務后調(diào)用getDisplays函數(shù),通過參數(shù)DisplayManager.DISPLAY_CATEGORY_PRESENTATION?確定獲取的設備為可以顯示presentation的設備。代碼位于DisplayManager.java中

?????在該函數(shù)中首先獲取系統(tǒng)中所有的設備id,如果傳入的category為null調(diào)用addAllDisplaysLocked函數(shù)獲取所有的設備信息,如果category為DISPLAY_CATEGORY_PRESENTATION,以設備類型為TYPE_WIFI,TYPE_HDMI,TYPE_OVERLAY,?TYPE_VIRTUAL?這些系統(tǒng)中可能存在的設備來調(diào)用addPresentationDisplaysLocked函數(shù)來尋找合適設備。

??????遍歷所有的設備id,通過getOrCreateDisplayLocked來獲取或者創(chuàng)建設備,當獲取到設備后如果設備有FLAG_PRESENTATION標簽,并且設備的類型與傳入的類型相同,說明該設備適合顯示presentation,將該設備加入列表displays列表。下面具體分析getOrCreateDisplayLocked如何獲取設備。

??????在該函數(shù)中根據(jù)設備id從mDisplays列表中獲取display,如果設備已經(jīng)添加到了mDisplays列表,并且設備可用,就直接把設備返回。如果設備沒有創(chuàng)建出來,就調(diào)用DisplayManagerGlobal的getCompatibleDisplay函數(shù)創(chuàng)建設備對象,將創(chuàng)建出來的設備添加進mDisplays列表。

??????在getCompatibleDisplay函數(shù)中調(diào)用getDisplayInfo函數(shù)獲取設備信息,根據(jù)設備信息,設備id,以及兼容性設備信息以及activityToken創(chuàng)建Display對象返回。在調(diào)用getDisplayInfo函數(shù)獲取設備信息時,先判斷設備信息是否使用緩存技術(shù),如果使用就先從緩存中找設備信息,如果找到直接返回。如果找不到再使用BInder遠程調(diào)用到DisplayManagerService中的getDisplayInfo,獲取到設備信息后再放入緩存中,讓下次調(diào)用使用。如果不使用緩存,直接去DisplayManagerService中獲取。

?????在DisplayManagerService中調(diào)用getDisplayInfoInternal獲取設備信息。

??????根據(jù)設備id從列表mLogicalDisplays獲取出對應的LogicalDisplay對象,當系統(tǒng)在啟動時會將LogicalDisplay與對應的設備id記錄在mLogicalDisplays列表中,如上文。如果通過設備id在列表中找不到設備信息,說明系統(tǒng)中不存在該設備返回null,如果找到LogicalDisplay,就調(diào)用該對象的getDisplayInfoLocked函數(shù)獲取設備信息。

??????在該函數(shù)中新創(chuàng)建一個DisplayInfo對象,將mBaseDisplayInfo?copy到新創(chuàng)建的DisplayInfo對象中,如果mOverrideDisplayInfo不為空就重新賦值DisplayInfo,根據(jù)之前分析屏幕旋轉(zhuǎn)可以知道到設備旋轉(zhuǎn)時mOverrideDisplayInfo不為空。如上面分析mBaseDisplayInfo對象在設備初始化時創(chuàng)建以及賦值,此時我們就獲取到所需要的設備。

創(chuàng)建presentation對象
????獲取到presentation要顯示的設備后,就將Activity的context對象和設備信息作為參數(shù)來創(chuàng)建Presentation對象。

??????由于Presentation繼承自Dialog,在創(chuàng)建Presentation時首選調(diào)用父類的構(gòu)造函數(shù),將presentation的上下文傳給父類,之后將設備記錄在成員變量mDisplay中,創(chuàng)建DisplayManagerService的遠程BInder對象,WindowManagerService的遠程BInder對象。最后將presentation設置為不能在外部點擊取消。

?????下面分析一下createPresentationContext函數(shù)創(chuàng)建presentation上下文的過程。outerContext為我們創(chuàng)建presentation的context,創(chuàng)建presentation必須有一個context對象,如果為null就拋出異常。同時,如果沒有指定presentation要顯示在哪個設備上,也會拋出異常。之后通過outerContext根據(jù)設備信息來創(chuàng)建displayContext,該context是一個ContextImpl對象,根據(jù)displayContext來獲取設備的主題信息。

??????之后根據(jù)外部的Window?manager獲取設備的Window?manager,這樣做主要是由于外部的Window?manager有一些如父窗口的額外信息,如果presentation使用應用窗口類型這樣做是非常重要的。最后創(chuàng)建ContextThemeWrapper對象返回,如果用戶通過presentation的context調(diào)用getSystemService函數(shù)獲取系統(tǒng)服務時,如果獲取的是Window?manager就直接將displayWindowManager返回,如果獲取別的就調(diào)用父類獲取,如上文講解。

?????獲取到presentation的context對象后,就調(diào)用父類Dialog的構(gòu)造函數(shù)。CreateContextThemeWrapper為false,將presentation的context賦值給mContext對象。將displayWindowManager賦值給mWindowManager,創(chuàng)建PhoneWindow對象記錄在mWindow對象中,之后創(chuàng)建ListenersHandler對象,監(jiān)聽dialog的消失,取消,顯示事件。

這時就創(chuàng)建成功了一個presentation對象。

請求顯示presentation


??????當創(chuàng)建presentation對象后調(diào)用presentation對象的show方法請求顯示presentation,在Presentation中的show方法直接調(diào)用父類Dialog的show方法。

????如果已經(jīng)調(diào)用過presentation的show方法那么mShowing為true,并且mDecor(最頂層的Window)已經(jīng)創(chuàng)建過,就直接將mDecor設置為VISIBLE,并返回。如果是第一次調(diào)用show方法,mCreated為false?那么dispatchOnCreate函數(shù)調(diào)用我們presentation的onCreate來調(diào)用setContentView設置presentation的布局,并且初始化一些對象。之后調(diào)用onStart函數(shù),由于Presentation重寫了父類的onStart函數(shù),所以首先調(diào)用子類的onStart函數(shù)。


??????在Presentation的onStart函數(shù)中注冊mDisplayListener監(jiān)聽,用來監(jiān)聽設備的移除,配置改變。現(xiàn)在就要開始監(jiān)視設備的改變了,可能display?metrics已經(jīng)發(fā)生改變,例如轉(zhuǎn)屏等事件發(fā)生,如果設備信息真的發(fā)生了改變就需要將presentation立即取消。

??????重新回到Dialog的show函數(shù)中,通過PhoneWindow的getDecorView函數(shù)獲取頂層的mDecor對象,如果mDecor為空就調(diào)用installDecor函數(shù)進行獲取Decor對象。獲取到mDecor對象后調(diào)用addView將該對象添加到WindowManager中。最后調(diào)用到WindowManagerGlobal的addView函數(shù)來添加view。

??????在添加view時獲取Window的參數(shù)wparams,如果該Window存在父窗口,就根據(jù)參數(shù)為子窗口調(diào)節(jié)布局參數(shù)。如果不存在父窗口就判斷是否有硬件加速,如果應用設置了硬件加速,就在wparams進行標記。

??????之后開始監(jiān)聽系統(tǒng)配置的變化,創(chuàng)建Runnable對象mSystemPropertyUpdater,將該對象添加到SystemProperties中,如果系統(tǒng)配置發(fā)生變化就會調(diào)用該對象的run函數(shù),在run函數(shù)中遍歷mRoots列表中的ViewRootImpl對象來加載每個view的系統(tǒng)配置。

?
??????接著在系統(tǒng)中獲取view的下標,根據(jù)下標進行判斷,如果下標小于0說明view已經(jīng)添加進了Window?Manager,如果大于零再判斷該view是否已經(jīng)死亡,如果死亡就調(diào)用ViewRootImpl的doDie函數(shù)處理。

??????如果這個view是一個面板窗口,需要找到他所連接的窗口,以便未來進行參考。首先判斷該窗口類型是否大于第一個子窗口,小于等于最后一個子窗口,如果是就從mRoots列表中找到一個View窗口Binder對象和傳入view的Binder對象相同,就從對應的mVIews中取出panelParentView。

????下面就是比較重要的操作根據(jù)view的上下文和設備信息來創(chuàng)建一個ViewRootImpl對象,ViewRootImpl構(gòu)造函數(shù)內(nèi)容如下所示。

??????將傳入的context參數(shù)記錄在全局變量mContext中,display記錄在mDisplay中,創(chuàng)建mWindowSession對象,這個比較重要下面分析,創(chuàng)建W類的對象mWindow是ViewRootImpl中的一個內(nèi)部類,再初始化一些其他的對象,最后加載系統(tǒng)配置信息。下面分析一下mWindowSession對象的創(chuàng)建過程,在WindowManagerGlobal.java中實現(xiàn)。

????如果sWindowSession已經(jīng)創(chuàng)建過直接返回,如果沒有創(chuàng)建過先創(chuàng)建input?method的服務對象imm,之后創(chuàng)建WIndowManagerService的服務對象windowManager,調(diào)用windowManager的openSession函數(shù)將IWindowSessionCallback對象,input?method的客戶端,input?method的上下文最為參數(shù),通BInder傳輸?shù)絎indowManagerService中。

????在WindowManagerService中創(chuàng)建Session對象返回。這就創(chuàng)建完成了一個mWindowSession對象。回到上文當創(chuàng)建完成一個ViewRootImpl對象,繼續(xù)在WindowManagerGlobal的addView函數(shù)中執(zhí)行。

????設置view的參數(shù),將view加入到mViews列表,新創(chuàng)建的ViewRootImpl對象加入mRoots列表,view參數(shù)信息加入mParams列表。

??????最后調(diào)用ViewRootImpl的setView函數(shù),將view對象,wparams,panelParentView設置到ViewRootImpl中。在ViewRootImpl中進行添加Window到WIndowManager,測量,布局,以及繪制Window流程,下面將詳細講解。

添加窗口


??????在setView函數(shù)中首先根據(jù)mView是否為NULL,判斷是否已經(jīng)為該ViewRootImp設置過view了,如果已經(jīng)設置過了就什么也不用操作,如果該ViewRootImp還沒有設置過任何的view對象,就會將需要設置的view對象賦值給成員變量mView。對一些其它的對象進行賦值,靜mAdded賦值為true表示已經(jīng)添加過view對象.

????之后用res變量來記錄添加Window的返回結(jié)果,調(diào)用requestLayout函數(shù)來請求layout,在后文詳細分析。如果input類型不是沒有input?channel就為該Window創(chuàng)建一個mInputChannel對象用來接收input事件。判斷Window是否存在屬性PRIVATE_FLAG_FORCE_DECOR_VIEW_VISIBILITY。

最后調(diào)用Session的addToDisplay函數(shù),將該Window添加到WindowManager中,以后詳細分析。
---------------------?
作者:宇落無痕?
來源:CSDN?
原文:https://blog.csdn.net/fu_kevin0606/article/details/79420621?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

總結(jié)

以上是生活随笔為你收集整理的Android7.1 Presentation双屏异显原理分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男女啪啪免费看 | 一区二区福利视频 | 亚洲中国色老太 | 国产99在线观看 | 久久国产精品久久久久久电车 | 亚洲不卡视频在线观看 | 欧美一区二区三区四区视频 | 能看的毛片 | 天天躁狠狠躁 | 青青草视频在线观看 | 美女日批网站 | 亚洲精品乱码久久久久久麻豆不卡 | 色七七视频| 国产精品一区二区久久 | 成年人在线视频网站 | 成人免费xxxxx在线视频 | 久久久久人妻精品色欧美 | 亚洲精品成人片在线观看精品字幕 | 亚洲国产日韩欧美一区二区三区 | 日日日日干 | 亚洲色图1 | 日本在线网址 | 成人福利在线播放 | 性欧美17一18内谢 | 精品乱码一区二区三四区视频 | 91女神在线| 天堂网av在线播放 | 欧美成人精品二区三区99精品 | 欧美熟妇7777一区二区 | 91丝袜 | 九九热最新视频 | 六月婷婷色 | 青娱乐国产精品 | 欧美精品一区二区三区三州 | 无码少妇一区二区三区 | 18做爰免费视频网站 | 羞羞动漫在线观看 | 亚洲欧美综合一区 | 91免费福利 | 金鱼妻日剧免费观看完整版全集 | 亚洲精品777 | 亚洲三级在线免费观看 | 免费av黄色 | 人人草人人射 | 91尤物视频在线观看 | 中日毛片| 亚洲国产精品久久久久婷蜜芽 | 美女又黄又爽 | 91成人免费看片 | 欧洲av一区二区 | 午夜视频福利网站 | 91美女啪啪 | 熟妇女人妻丰满少妇中文字幕 | 欧美三日本三级少妇三级99观看视频 | 国产乱子一区二区 | 欧美成人手机在线 | 国产精品成av人在线视午夜片 | 久久密av | 日韩xxx视频| av在线观 | 国产精品无码一区二区桃花视频 | 亚洲天堂岛 | 黄色国产一区 | 96av在线 | 视频在线a | 葵司有码中文字幕二三区 | 在线观看毛片网站 | 黄色性视频网站 | 精品欧美日韩 | 欧洲自拍一区 | 国内外成人免费视频 | 九九激情视频 | 爱情岛论坛av | 性做久久久久久免费观看欧美 | 蜜臀久久精品 | 欧美在线天堂 | 91精品视频免费观看 | 91成品视频 | 国产成人日韩 | 爱爱的免费视频 | 国产在线拍揄自揄拍 | 国内久久| 久久精品首页 | 国产乱free国语对白 | 成人小视频免费在线观看 | 国产黄色激情视频 | 爆操少妇 | 91成人看| 欧美一区二区三区免费在线观看 | 在线观看国产区 | 亚洲av无码精品色午夜果冻不卡 | 99爱视频| 午夜aa| 日本视频免费观看 | 波多野结衣调教 | 97在线公开视频 | 欧美裸体xxxx| 久久免费久久 | 色桃av|