android10 launcher修改簡單記錄

首先要對hotseat等位置有一定的了解砸逊。


https://blog.csdn.net/baidu_41672657/article/details/83383137

首先改橫屏是修改device/qcom/xxx/system.prop文件中的。
persist.panel.orientation=270逸贾,一開始是persist.panel.orientation=0
這個數(shù)值可以通過adb直接修改,重啟后生效津滞。

setprop persist.panel.orientation 270

關(guān)于adb調(diào)屏幕的命令還有

adb shell settings put system show_touches 1
adb shell settings put system pointer_location 1

是打開Show taps和Pointer location([顯示點(diǎn)按操作反饋]和[指針位置])铝侵。

修改點(diǎn)如下。
1.由于是豎屏橫用触徐,所以需要修改hotseat 位置咪鲜,讓其居于底部。修改hotseat_transpose_layout_with_orientation的值撞鹉,由true改成false疟丙。

//packages/apps/Launcher3/res/values/config.xml
 <!-- Hotseat -->
-    <bool name="hotseat_transpose_layout_with_orientation">true</bool>
+    <bool name="hotseat_transpose_layout_with_orientation">false</bool>

2.需要強(qiáng)制所有app橫屏,在updateRotationUnchecked中增加返回true的部分鸟雏,修改如下享郊。

//frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java
class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
      *         UNFREEZE THE SCREEN.
      */
     boolean updateRotationUnchecked(boolean forceUpdate) {
+        if (true) {
+            return true;
+        }
+
         ScreenRotationAnimation screenRotationAnimation;
         if (!forceUpdate) {
             if (mDeferredRotationPauseCount > 0) {

3.需調(diào)整navigationbar位置。系統(tǒng)設(shè)置為橫屏顯示后孝鹊,橫屏后 navigationBar默認(rèn)在左邊炊琉。需修改DisplayPolicy中的navigationBarPosition函數(shù),屏蔽判斷部分又活,使其直接返回NAV_BAR_BOTTOM苔咪。

//frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java

    @NavigationBarPosition
    int navigationBarPosition(int displayWidth, int displayHeight, int displayRotation) {
       /* if (navigationBarCanMove() && displayWidth > displayHeight) {
            if (displayRotation == Surface.ROTATION_270) {
                return NAV_BAR_LEFT;
            } else if (displayRotation == Surface.ROTATION_90) {
                return NAV_BAR_RIGHT;
            }
        }*/
        return NAV_BAR_BOTTOM;
    }

4.配置hotseat 位置居于底部后锰悼,allapp界面部分改變了,本身是4x4的布局悼泌,現(xiàn)在圖標(biāo)變小填充并且不再是4x4松捉。需修改availableHeightPx 和availableWidthPx 部分夹界。

//packages/apps/Launcher3/src/com/android/launcher3/DeviceProfile.java
    public DeviceProfile(Context context, InvariantDeviceProfile inv,
            Point minSize, Point maxSize,
            int width, int height, boolean isLandscape, boolean isMultiWindowMode) {

        this.inv = inv;
        this.isLandscape = isLandscape;
        this.isMultiWindowMode = isMultiWindowMode;

        // Determine sizes.
        widthPx = width;
        heightPx = height;
        if (isLandscape) {
/*            availableWidthPx = maxSize.x;
            availableHeightPx = minSize.y;*/
            availableWidthPx = minSize.x;
            availableHeightPx = maxSize.y;
        } else {
            availableWidthPx = minSize.x;
            availableHeightPx = maxSize.y;
        }

5.workspace區(qū)域添加的圖標(biāo)顯示不全馆里。具體修改如下。

//packages/apps/Launcher3/src/com/android/launcher3/CellLayout.java
public class CellLayout extends ViewGroup implements Transposable {
         if (mFixedCellWidth < 0 || mFixedCellHeight < 0) {
             int cw = DeviceProfile.calculateCellWidth(childWidthSize, mCountX);
-            int ch = DeviceProfile.calculateCellHeight(childHeightSize, mCountY);
+            int ch = childHeightSize;//DeviceProfile.calculateCellHeight(childHeightSize, mCountY);
             if (cw != mCellWidth || ch != mCellHeight) {
                 mCellWidth = cw;
                 mCellHeight = ch;


6.去掉all apps 界面搜索應(yīng)用欄,需修改AllAppsContainerViewAllAppsTransitionController可柿。
AllAppsContainerView 中增加mSearchContainer.setVisibility(View.GONE);
AllAppsTransitionController中注釋掉mAppsView.getSearchUiManager().setContentVisibility(visibleElements, setter, allAppsFade);

//packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsContainerView.java

public class AllAppsContainerView extends SpringRelativeLayout implements DragSo
         mSearchContainer = findViewById(R.id.search_container_all_apps);
         mSearchUiManager = (SearchUiManager) mSearchContainer;
         mSearchUiManager.initialize(this);
+
+        mSearchContainer.setVisibility(View.GONE);
+
     }

//packages/apps/Launcher3/src/com/android/launcher3/allapps/AllAppsTransitionController.java
public class AllAppsTransitionController implements StateHandler, OnDeviceProfil
         setter.setViewAlpha(mAppsView.getScrollBar(), hasContent ? 1 : 0, allAppsFade);
         mAppsView.getFloatingHeaderView().setContentVisibility(hasHeaderExtra, hasContent, setter,
                 allAppsFade);
-        mAppsView.getSearchUiManager().setContentVisibility(visibleElements, setter, allAppsFade);
+        //mAppsView.getSearchUiManager().setContentVisibility(visibleElements, setter, allAppsFade);

7.去掉Google 搜索鸠踪。注釋掉bindAndInitFirstWorkspaceScreenqsb部分。

//packages/apps/Launcher3/src/com/android/launcher3/Workspace.java

    public void bindAndInitFirstWorkspaceScreen(View qsb) {
        if (!FeatureFlags.QSB_ON_FIRST_SCREEN) {
            return;
        }
        // Add the first page
        CellLayout firstPage = insertNewWorkspaceScreen(Workspace.FIRST_SCREEN_ID, 0);
        // Always add a QSB on the first screen.
/*        if (qsb == null) {
            // In transposed layout, we add the QSB in the Grid. As workspace does not touch the
            // edges, we do not need a full width QSB.
            qsb = LayoutInflater.from(getContext())
                    .inflate(R.layout.search_container_workspace,firstPage, false);
        }

        CellLayout.LayoutParams lp = new CellLayout.LayoutParams(0, 0, firstPage.getCountX(), 1);
        lp.canReorder = false;
        if (!firstPage.addViewToCellLayout(qsb, 0, R.id.search_container_workspace, lp, true)) {
            Log.e(TAG, "Failed to add to item at (0, 0) to CellLayout");
        }*/
    }

8.國內(nèi)基本上都是去掉Android原生的抽屜式的复斥,修改部分基本參考這個营密。太長了就不寫了。
android10.0(Q) Launcher3 去掉抽屜

9.修改hotseat目锭。hotseat一般默認(rèn)是4個评汰,布局為4x1。
現(xiàn)需增加為8個痢虹,布局改成4x2被去。

①首先修改device_profiles.xml,這個文件存在于go\res\xml和res\xml文件夾〗蔽ǎ可以都改一下惨缆,因?yàn)閱为?dú)編譯launcher模塊和全編的話使用的是 不同的device_profiles.xml。

// device_profiles.xml
<profiles xmlns:launcher="http://schemas.android.com/apk/res-auto" >

    <grid-option
        launcher:name="4_by_4"
        launcher:numRows="4"
        launcher:numColumns="4"
        launcher:numFolderRows="4"
        launcher:numFolderColumns="4"
        launcher:numHotseatIcons="4"
        launcher:defaultLayoutId="@xml/default_workspace_4x4" >

        <display-option
            launcher:name="Go Device"
            launcher:minWidthDps="296"
            launcher:minHeightDps="491.33"
            launcher:iconImageSize="60"
            launcher:iconTextSize="14.0"
            launcher:canBeDefault="true" />

    </grid-option>

</profiles>

launcher:numHotseatIcons="4"改成launcher:numHotseatIcons="8"丰捷。

②然后修改default_workspace_4x4.xml文件坯墨。增加resolve數(shù)據(jù)。Hotseat的launcher:screen與workspace中不同病往,并不代表屏幕位置捣染,而是代表插入的位置。
修改后如下所示停巷。

<favorites xmlns:launcher="http://schemas.android.com/apk/res-auto/com.android.launcher3">

    <!-- Hotseat (We use the screen as the position of the item in the hotseat) -->
    <!-- Dialer, Messaging, Browser, Camera -->
    <resolve
        launcher:container="-101"
        launcher:screen="0"
        launcher:x="0"
        launcher:y="0" >
        <favorite launcher:uri="#Intent;action=android.intent.action.DIAL;end" />
        <favorite launcher:uri="tel:123" />
        <favorite launcher:uri="#Intent;action=android.intent.action.CALL_BUTTON;end" />
    </resolve>

    <resolve
        launcher:container="-101"
        launcher:screen="1"
        launcher:x="1"
        launcher:y="0" >
        <favorite launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_MESSAGING;end" />
        <favorite launcher:uri="sms:" />
        <favorite launcher:uri="smsto:" />
        <favorite launcher:uri="mms:" />
        <favorite launcher:uri="mmsto:" />
    </resolve>

   <resolve
        launcher:container="-101"
        launcher:screen="2"
        launcher:x="2"
        launcher:y="0" >
        <favorite
            launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_BROWSER;end" />
        <favorite launcher:uri="http://www.example.com/" />
    </resolve>
       <resolve
           launcher:container="-101"
           launcher:screen="3"
           launcher:x="3"
           launcher:y="0" >
           <favorite launcher:uri="#Intent;action=android.media.action.STILL_IMAGE_CAMERA;end" />
           <favorite launcher:uri="#Intent;action=android.intent.action.CAMERA_BUTTON;end" />
       </resolve>
    <resolve
        launcher:container="-101"
        launcher:screen="0"
        launcher:x="0"
        launcher:y="1" >
        <favorite launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_CONTACTS;end" />
    </resolve>
    <resolve
        launcher:container="-101"
        launcher:screen="1"
        launcher:x="1"
        launcher:y="1" >
        <favorite launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_DeskClock;end" />
    </resolve>
    <resolve
        launcher:container="-101"
        launcher:screen="2"
        launcher:x="2"
        launcher:y="1" >
        <favorite launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_MUSIC;end" />
    </resolve>
    <resolve
        launcher:container="-101"
        launcher:screen="3"
        launcher:x="3"
        launcher:y="1" >
        <favorite launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_CALENDAR;end" />
    </resolve>
    <!-- Bottom row -->
<!--    <resolve-->
<!--        launcher:screen="0"-->
<!--        launcher:x="0"-->
<!--        launcher:y="-1" >-->
<!--        <favorite launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_EMAIL;end" />-->
<!--        <favorite launcher:uri="mailto:" />-->
<!--    </resolve>-->

<!--    <resolve-->
<!--        launcher:screen="0"-->
<!--        launcher:x="1"-->
<!--        launcher:y="-1" >-->
<!--        <favorite launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_GALLERY;end" />-->
<!--        <favorite launcher:uri="#Intent;type=images/*;end" />-->
<!--    </resolve>-->

<!--    <resolve-->
<!--        launcher:screen="0"-->
<!--        launcher:x="3"-->
<!--        launcher:y="-1" >-->
<!--        <favorite launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_MARKET;end" />-->
<!--        <favorite launcher:uri="market://details?id=com.android.launcher" />-->
<!--    </resolve>-->

</favorites>

并且要注意耍攘,缺少category的要在對應(yīng)的apk中添加。例如我的DeskClock叠穆,AndroidManifest.xml缺少
<category android:name="android.intent.category.APP_DeskClock"/>少漆,要加進(jìn)去。

③屏蔽檢驗(yàn)部分代碼硼被。
LoaderCursor中的checkItemPlacement會判斷hotseat的一行是否填充示损,如果填充了就不能再進(jìn)行填充了。這里會影響數(shù)據(jù)庫的數(shù)據(jù)生成嚷硫,因此要屏蔽部分代碼检访。將hotseatOccupancy內(nèi)的代碼屏蔽始鱼。

//packages/apps/Launcher3/src/com/android/launcher3/model/LoaderCursor.java
    /**
     * check & update map of what's occupied; used to discard overlapping/invalid items
     */
    protected boolean checkItemPlacement(ItemInfo item) {
..........
            if (hotseatOccupancy != null) {
               /* if (hotseatOccupancy.cells[(int) item.screenId][0]) {
                    Log.e(TAG, "Error loading shortcut into hotseat " + item
                            + " into position (" + item.screenId + ":" + item.cellX + ","
                            + item.cellY + ") already occupied");
                    return false;
                } else {
                    hotseatOccupancy.cells[item.screenId][0] = true;
                    return true;
                }*/
            } 
..........
}


}

還有就是如果單獨(dú)編譯launcher的情況下,如果修改default_workspace_4x4文件中hotseat的個數(shù)的話脆贵,重新編譯后医清,要刪除設(shè)備上launcher的數(shù)據(jù)庫,否則重新安裝的時候數(shù)據(jù)庫不會更新卖氨。
打開Android studio中的Device File Explorer会烙,找到launcher.db這個文件。
路徑是/data/user/0/com.android.launcher3/databases/launcher.db

可通過cmd控制臺筒捺,刪除launcher.db柏腻。另外,部分時候也需要查看launcher.db這個數(shù)據(jù)庫系吭∥迳可通過sqlitestudio打開.db文件。
通過查看.db文件肯尺,hotseat數(shù)據(jù)為8個沃缘,接下來的問題就是修改其顯示。

image.png

④修改hotseat的高度则吟。
首先要修改GridOccupancy 的行數(shù)槐臀。
將checkItemPlacement中的final GridOccupancy occupancy = new GridOccupancy(mIDP.numHotseatIcons, 1);
修改為final GridOccupancy occupancy = new GridOccupancy(mIDP.numHotseatIcons/2, 2);

//packages/apps/Launcher3/src/com/android/launcher3/model/LoaderCursor.java
    protected boolean checkItemPlacement(ItemInfo item) {
..........
            if (hotseatOccupancy != null) {
               /* if (hotseatOccupancy.cells[(int) item.screenId][0]) {
                    Log.e(TAG, "Error loading shortcut into hotseat " + item
                            + " into position (" + item.screenId + ":" + item.cellX + ","
                            + item.cellY + ") already occupied");
                    return false;
                } else {
                    hotseatOccupancy.cells[item.screenId][0] = true;
                    return true;
                }*/
            } else {
                final GridOccupancy occupancy = new GridOccupancy(mIDP.numHotseatIcons/2, 2);
..........

            }
..........

}

setGridSize(idp.numHotseatIcons, 1);修改為 setGridSize(idp.numHotseatIcons/2, 2);
修改后如下。

// packages/apps/Launcher3/src/com/android/launcher3/Hotseat.java
    public void resetLayout(boolean hasVerticalHotseat) {
        removeAllViewsInLayout();
        mHasVerticalHotseat = hasVerticalHotseat;
        InvariantDeviceProfile idp = mActivity.getDeviceProfile().inv;
        if (hasVerticalHotseat) {
            setGridSize(1, idp.numHotseatIcons);
        } else {
            setGridSize(idp.numHotseatIcons/2, 2);
        }
    }

這樣就占了2層逾滥。
然后修改hotseat高度峰档。
由于是橫條,所以需要將DeviceProfile中的hotseatBarSizePx = ResourceUtils.pxFromDp(inv.iconSize, dm) + (isVerticalBarLayout()修改為hotseatBarSizePx = ResourceUtils.pxFromDp(inv.iconSize *2, dm) + (isVerticalBarLayout()
因?yàn)閟etInsets中有一句lp.height = grid.hotseatBarSizePx + insets.bottom;,也就是說Hotseat的height 取決于hotseatBarSizePx 寨昙。

// packages/apps/Launcher3/src/com/android/launcher3/Hotseat.java
    @Override
    public void setInsets(Rect insets) {
        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
        DeviceProfile grid = mActivity.getWallpaperDeviceProfile();
        insets = grid.getInsets();
        if (grid.isVerticalBarLayout()) {
            lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
            if (grid.isSeascape()) {
                lp.gravity = Gravity.LEFT;
                lp.width = grid.hotseatBarSizePx + insets.left;
            } else {
                lp.gravity = Gravity.RIGHT;
                lp.width = grid.hotseatBarSizePx + insets.right;
            }
        } else {
            lp.gravity = Gravity.BOTTOM;
            lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
            lp.height = grid.hotseatBarSizePx + insets.bottom;
        }
        Rect padding = grid.getHotseatLayoutPadding();
        setPadding(padding.left, padding.top, padding.right, padding.bottom);

        setLayoutParams(lp);
        InsettableFrameLayout.dispatchInsets(this, insets);
    }

⑤在addInScreen之前屏蔽掉x和y對于hotseat的特殊計(jì)算讥巡,這里計(jì)算會導(dǎo)致hotaset里的圖標(biāo)的y坐標(biāo)永遠(yuǎn)為0,導(dǎo)致只能顯示一行舔哪。

    int getCellYFromOrder(int rank) {
        return mHasVerticalHotseat ? (getCountY() - (rank + 1)) : 0;
    }

mHasVerticalHotseat是表示hotseat是否為豎條欢顷,由于我這里是橫條所以一直會返回0.從getCellXFromOrder也可以看出hotseat未修改的源碼的x是根據(jù)rank,這里是screenId去賦值的捉蚤。

    int getCellXFromOrder(int rank) {
        return mHasVerticalHotseat ? 0 : rank;
    }

這里要屏蔽掉對x和y的特殊計(jì)算抬驴,讓其根據(jù)default_workspace_4x4.xml中的 launcher:xlauncher:y的值去對快捷圖標(biāo)的x和y進(jìn)行賦值,而不是根據(jù)launcher:screen缆巧。
修改后如下布持。

//packages/apps/Launcher3/src/com/android/launcher3/WorkspaceLayoutManager.java
    default void addInScreenFromBind(View child, ItemInfo info) {
        int x = info.cellX;
        int y = info.cellY;
        /*if (info.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT) {
            int screenId = info.screenId;
            x = getHotseat().getCellXFromOrder(screenId);
            y = getHotseat().getCellYFromOrder(screenId);
        }*/
        addInScreen(child, info.container, info.screenId, x, y, info.spanX, info.spanY);
    }

參考鏈接:

Android10.0 MTK 平板橫屏方案修改(強(qiáng)制app橫屏 + 開機(jī)logo/動畫+關(guān)機(jī)充電橫屏 + RecoveryUI 橫屏)

android10.0(Q) Launcher3 去掉抽屜

Android10.0 MTK 平臺 Launcher3 修改定制

Android 8.1 MTK平臺 強(qiáng)制第三方 APP 橫屏(微信、今日頭條等)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末陕悬,一起剝皮案震驚了整個濱河市题暖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖胧卤,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唯绍,死亡現(xiàn)場離奇詭異,居然都是意外死亡枝誊,警方通過查閱死者的電腦和手機(jī)况芒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叶撒,“玉大人绝骚,你說我怎么就攤上這事∪” “怎么了皮壁?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哪审。 經(jīng)常有香客問我,道長虑瀑,這世上最難降的妖魔是什么湿滓? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮舌狗,結(jié)果婚禮上叽奥,老公的妹妹穿的比我還像新娘。我一直安慰自己痛侍,他們只是感情好朝氓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著主届,像睡著了一般赵哲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上君丁,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天枫夺,我揣著相機(jī)與錄音,去河邊找鬼绘闷。 笑死橡庞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的印蔗。 我是一名探鬼主播扒最,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼华嘹!你這毒婦竟也來了吧趣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎再菊,沒想到半個月后爪喘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纠拔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年秉剑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稠诲。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡侦鹏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出臀叙,到底是詐尸還是另有隱情略水,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布劝萤,位于F島的核電站渊涝,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏床嫌。R本人自食惡果不足惜跨释,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厌处。 院中可真熱鬧鳖谈,春花似錦、人聲如沸阔涉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瑰排。三九已至贯要,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凶伙,已是汗流浹背郭毕。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留函荣,地道東北人显押。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像傻挂,于是被迫代替她去往敵國和親乘碑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355