2024-02-27

1、Android13 修改Launcher3抽屉改成为滑动模式:
.../PortraitStatesTouchController.java | 5 +
.../android/launcher3/DeleteDropTarget.java | 6 +
.../android/launcher3/LauncherAppState.java | 3 +
.../model/AddWorkspaceItemsTask.java | 8 +-
.../android/launcher3/model/BgDataModel.java | 7 ++
.../launcher3/model/ItemInstallQueue.java | 54 +++++++++
.../android/launcher3/model/LoaderTask.java | 114 +++++++++++++++++-
.../model/WorkspaceItemSpaceFinder.java | 2 +-
.../model/data/WorkspaceItemInfo.java | 16 +++
.../touch/AllAppsSwipeController.java | 0
10 files changed, 212 insertions(+), 3 deletions(-)
mode change 100644 => 100755 vendor/mediatek/proprietary/packages/apps/Launcher3/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java
mode change 100644 => 100755 vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/DeleteDropTarget.java
mode change 100644 => 100755 vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/LauncherAppState.java
mode change 100644 => 100755 vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/AddWorkspaceItemsTask.java
mode change 100644 => 100755 vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/BgDataModel.java
mode change 100644 => 100755 vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/ItemInstallQueue.java
mode change 100644 => 100755 vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java
mode change 100644 => 100755 vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WorkspaceItemSpaceFinder.java
mode change 100644 => 100755 vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/data/WorkspaceItemInfo.java
mode change 100644 => 100755 vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/touch/AllAppsSwipeController.java

diff --git a/vendor/mediatek/proprietary/packages/apps/Launcher3/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java b/vendor/mediatek/proprietary/packages/apps/Launcher3/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java
old mode 100644
new mode 100755
index e56c90c20cb..c539b06c633
--- a/vendor/mediatek/proprietary/packages/apps/Launcher3/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java
+++ b/vendor/mediatek/proprietary/packages/apps/Launcher3/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java
@@ -34,6 +34,8 @@ import static com.android.launcher3.states.StateAnimationConfig.ANIM_VERTICAL_PR
import static com.android.launcher3.states.StateAnimationConfig.ANIM_WORKSPACE_FADE;
import static com.android.launcher3.states.StateAnimationConfig.ANIM_WORKSPACE_SCALE;

+import com.android.launcher3.LauncherAppState;

import android.view.MotionEvent;
import android.view.animation.Interpolator;

@@ -155,6 +157,9 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr
} else if (fromState == OVERVIEW) {
return isDragTowardPositive ? OVERVIEW : NORMAL;
} else if (fromState == NORMAL && isDragTowardPositive) {

  •       if (LauncherAppState.isUserSingleLayerStyle()) {
    
  •           return fromState;
    
  •        }
           return ALL_APPS;
       }
       return fromState;
    

diff --git a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/DeleteDropTarget.java b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/DeleteDropTarget.java
old mode 100644
new mode 100755
index 95d3ad9dbb7..5f0c8ad1e9a
--- a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/DeleteDropTarget.java
+++ b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/DeleteDropTarget.java
@@ -89,6 +89,12 @@ public class DeleteDropTarget extends ButtonDropTarget {

 @Override
 protected boolean supportsDrop(ItemInfo info) {
  •    if (info != null &&
    
  •            info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION
    
  •            && LauncherAppState.isUserSingleLayerStyle()) {
    
  •        return false;
    
  •    }
       return true;
    
    }

diff --git a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/LauncherAppState.java b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/LauncherAppState.java
old mode 100644
new mode 100755
index 597bc8da3a4..24f0eb1eb71
--- a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/LauncherAppState.java
+++ b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/LauncherAppState.java
@@ -68,6 +68,9 @@ public class LauncherAppState implements SafeCloseable {
private final IconCache mIconCache;
private final InvariantDeviceProfile mInvariantDeviceProfile;
private final RunnableList mOnTerminateCallback = new RunnableList();

  • public static boolean isUserSingleLayerStyle() {

  •   return true;
    
  • }

    public static LauncherAppState getInstance(final Context context) {
    return INSTANCE.get(context);
    diff --git a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/AddWorkspaceItemsTask.java
    old mode 100644
    new mode 100755
    index 31ef2e5ea67..1ff1f228532
    --- a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/AddWorkspaceItemsTask.java
    +++ b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/AddWorkspaceItemsTask.java
    @@ -97,8 +97,14 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask {
    continue;
    }

  •               boolean mForceAdd = false;
    
  •               if (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION
    
  •                       && item instanceof WorkspaceItemInfo) {
    
  •                    mForceAdd = ((WorkspaceItemInfo) item).hasExtraFlag(WorkspaceItemInfo.EXTRA_FLAG_FORCE_ADD);
    
  •                }
    
  •                // b/139663018 Short-circuit this logic if the icon is a system app
    
  •                if (PackageManagerHelper.isSystemApp(app.getContext(), item.getIntent())) {
    
  •                if (!mForceAdd && PackageManagerHelper.isSystemApp(app.getContext(), item.getIntent())) {
                       if (TestProtocol.sDebugTracing) {
                           Log.d(TestProtocol.MISSING_PROMISE_ICON,
                                   LOG + " Item is a system app.");
    

diff --git a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/BgDataModel.java b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/BgDataModel.java
old mode 100644
new mode 100755
index de23c4b31f4..ca5b6de3dfc
--- a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/BgDataModel.java
+++ b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/BgDataModel.java
@@ -403,6 +403,13 @@ public class BgDataModel {
items.addAll(appWidgets);
return items;
}

  • public synchronized ArrayList<ItemInfo> getAllWorkspaceItemsWithoutAppWidget() {

  •    ArrayList<ItemInfo> items = new ArrayList<>(workspaceItems.size());
    
  •    items.addAll(workspaceItems);
    
  •    return items;
    
  • }

    /**

    • Calls the provided {@code op} for all workspaceItems in the in-memory model (both persisted
      diff --git a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/ItemInstallQueue.java b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/ItemInstallQueue.java
      old mode 100644
      new mode 100755
      index 5a220f74c73..2f98689b66a
      --- a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/ItemInstallQueue.java
      +++ b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/ItemInstallQueue.java
      @@ -186,6 +186,15 @@ public class ItemInstallQueue {
      public void queueItem(String packageName, UserHandle userHandle) {
      queuePendingShortcutInfo(new PendingInstallShortcutInfo(packageName, userHandle));
      }
  • /**

  • * Adds an item to the install queue
    
  • */
    
  • public void queueItem(LauncherActivityInfo launcherActivityInfo, UserHandle userHandle) {

  •    queuePendingShortcutInfo(new PendingInstallShortcutInfo(launcherActivityInfo, userHandle));
    
  • }

  • /**
    * Returns a stream of all pending shortcuts in the queue
    @@ -250,9 +259,18 @@ public class ItemInstallQueue {
    private static class PendingInstallShortcutInfo extends ItemInfo {

       final Intent intent;
    
  •   LauncherActivityInfo activityInfo = null;
    
       @Nullable ShortcutInfo shortcutInfo;
       @Nullable AppWidgetProviderInfo providerInfo;
    
  •    public PendingInstallShortcutInfo(LauncherActivityInfo activityInfo, UserHandle userHandle) {
    
  •        itemType = Favorites.ITEM_TYPE_APPLICATION;
    
  •        intent = new Intent().setComponent(activityInfo.getComponentName());
    
  •        this.activityInfo = activityInfo;
    
  •        user = userHandle;
    
  •    }
    
       /**
        * Initializes a PendingInstallShortcutInfo to represent a pending launcher target.
    

@@ -305,6 +323,12 @@ public class ItemInstallQueue {
si.itemType = ITEM_TYPE_APPLICATION;

                 LauncherActivityInfo lai;
  •                if (activityInfo != null) {
    
  •                    laiList.clear();
    
  •                    laiList.add(activityInfo);
    
  •                    si.addExtraFlag(WorkspaceItemInfo.EXTRA_FLAG_FORCE_ADD);
    
  •                }
    
  •                boolean usePackageIcon = laiList.isEmpty();
                   if (usePackageIcon) {
                       lai = null;
    

@@ -343,6 +367,34 @@ public class ItemInstallQueue {
return null;
}

  •    /*@Override
    
  •    public boolean equals(Object obj) {
    
  •        if (obj instanceof PendingInstallShortcutInfo) {
    
  •            PendingInstallShortcutInfo other = (PendingInstallShortcutInfo) obj;
    
  •            boolean userMatches = user.equals(other.user);
    
  •            boolean itemTypeMatches = itemType == other.itemType;
    
  •            boolean intentMatches = intent.toUri(0).equals(other.intent.toUri(0));
    
  •            boolean shortcutInfoMatches = shortcutInfo == null
    
  •                    ? other.shortcutInfo == null
    
  •                    : other.shortcutInfo != null
    
  •                        && shortcutInfo.getId().equals(other.shortcutInfo.getId())
    
  •                        && shortcutInfo.getPackage().equals(other.shortcutInfo.getPackage());
    
  •            boolean providerInfoMatches = providerInfo == null
    
  •                    ? other.providerInfo == null
    
  •                    : other.providerInfo != null
    
  •                        && providerInfo.provider.equals(other.providerInfo.provider);
    
  •            return userMatches
    
  •                    && itemTypeMatches
    
  •                    && intentMatches
    
  •                    && shortcutInfoMatches
    
  •                    && providerInfoMatches;
    
  •        }
    
  •        return false;
    
  •    }*/
    
  •    @Override
       public boolean equals(Object obj) {
           if (obj instanceof PendingInstallShortcutInfo) {
    

@@ -369,6 +421,8 @@ public class ItemInstallQueue {
}
return false;
}

  • }

    private static String getIntentPackage(Intent intent) {
    diff --git a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java
    old mode 100644
    new mode 100755
    index f1c5d59fc8f..2ba26da8cb8
    --- a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java
    +++ b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java
    @@ -117,6 +117,7 @@ public class LoaderTask implements Runnable {
    private static final String TAG = "LoaderTask";

    private static final boolean DEBUG = true;

  • private static final boolean DEBUG_BOBO = true;

    protected final LauncherAppState mApp;
    private final AllAppsList mBgAllAppsList;
    @@ -186,6 +187,22 @@ public class LoaderTask implements Runnable {

     filterCurrentWorkspaceItems(firstScreens, allItems, firstScreenItems,
             new ArrayList<>() /* otherScreenItems are ignored */);
    
  •    if (DEBUG_BOBO) {
    
  •        Log.d(TAG, "sendFirstScreenActiveInstallsBroadcast firstScreenItems size: "
    
  •                + firstScreenItems.size());
    
  •        for (ItemInfo itemInfo : firstScreenItems) {
    
  •            Log.d(TAG, "firstScreenItems: " + itemInfo);
    
  •        }
    
  •       Log.d(TAG, "sendFirstScreenActiveInstallsBroadcast firstScreenItems end");
    
  •        Log.d(TAG, "sendFirstScreenActiveInstallsBroadcast allItems size: "
    
  •                + allItems.size());
    
  •        for (ItemInfo itemInfo : allItems) {
    
  •            Log.d(TAG, "allItems: " + itemInfo);
    
  •        }
    
  •        Log.d(TAG, "sendFirstScreenActiveInstallsBroadcast allItems end");
    
  •    }      
       mFirstScreenBroadcast.sendBroadcasts(mApp.getContext(), firstScreenItems);
    

    }

@@ -196,6 +213,10 @@ public class LoaderTask implements Runnable {
return;
}
}

  •   if (DEBUG_BOBO) {
    
  •        Log.d(TAG, "run start");
    
  •    }
    
       Object traceToken = TraceHelper.INSTANCE.beginSection(TAG);
       TimingLogger logger = new TimingLogger(TAG, "run");
    

@@ -208,6 +229,14 @@ public class LoaderTask implements Runnable {
} finally {
Trace.endSection();
}

  •        if (DEBUG_BOBO) {
    
  •            Log.d(TAG, "shortcutInfo size: " + allShortcuts.size());
    
  •            for (ShortcutInfo shortcutInfo : allShortcuts) {
    
  •                Log.d(TAG, "shortcutInfo: " + shortcutInfo);
    
  •            }
    
  •            Log.d(TAG, "shortcutInfo end");
    
  •        }
           logASplit(logger, "loadWorkspace");
    
           // Sanitize data re-syncs widgets/shortcuts based on the workspace loaded from db.
    

@@ -242,6 +271,14 @@ public class LoaderTask implements Runnable {
} finally {
Trace.endSection();
}

  •        if (DEBUG_BOBO) {
    
  •            Log.d(TAG, "allActivityList size: " + allActivityList.size());
    
  •            for (LauncherActivityInfo activityInfo : allActivityList) {
    
  •                Log.d(TAG, "activityInfo: " + activityInfo.getComponentName());
    
  •            }
    
  •            Log.d(TAG, "allActivityList end");
    
  •        }
           logASplit(logger, "loadAllApps");
    
           verifyNotStopped();
    

@@ -270,6 +307,14 @@ public class LoaderTask implements Runnable {

         // third step
         List<ShortcutInfo> allDeepShortcuts = loadDeepShortcuts();
  •        if (DEBUG_BOBO) {
    
  •            Log.d(TAG, "allDeepShortcuts size: " + allDeepShortcuts.size());
    
  •            for (ShortcutInfo shortcutInfo : allDeepShortcuts) {
    
  •                Log.d(TAG, "shortcutInfo: " + shortcutInfo);
    
  •            }
    
  •            Log.d(TAG, "allDeepShortcuts end");
    
  •        }
           logASplit(logger, "loadDeepShortcuts");
    
           verifyNotStopped();
    

@@ -290,7 +335,14 @@ public class LoaderTask implements Runnable {

         // fourth step
-                    mBgDataModel.widgetsModel.update(mApp, null);
+                    mBgDataModel.widgetsModel.update(mApp, null);                  
+            if (DEBUG_BOBO) {
+                Log.d(TAG, "allWidgetsList size: " + allWidgetsList.size());
+                for (ComponentWithLabelAndIcon componentWithLabelAndIcon : allWidgetsList) {
+                    Log.d(TAG, "componentWithLabelAndIcon: " + componentWithLabelAndIcon.getComponent());
+                }
+                Log.d(TAG, "allWidgetsList end");
+            }
             logASplit(logger, "load widgets");
 
             verifyNotStopped();
@@ -312,6 +364,9 @@ public class LoaderTask implements Runnable {
             updateHandler.finish();
             logASplit(logger, "finish icon update");
 
+            // add apps for single layer--bobo
+            updateForSingleLayerStyle(allActivityList);
+
             mModelDelegate.modelLoadComplete();
             transaction.commit();
             memoryLogger.clearLogs();
@@ -324,9 +379,57 @@ public class LoaderTask implements Runnable {
         } finally {
             logger.dumpToLog();
         }
+       
+        if (DEBUG_BOBO) {
+            Log.d(TAG, "run end");
+        }
         TraceHelper.INSTANCE.endSection(traceToken);
     }
 
+   private void updateForSingleLayerStyle(List<LauncherActivityInfo> allActivityList) {
+        if (!LauncherAppState.isUserSingleLayerStyle()) {
+            return;
+        }
+        if (allActivityList == null || allActivityList.size() <= 0) {
+            return;
+        }
+        Map<String, LauncherActivityInfo> newAppsMap = new HashMap<>();
+        for (LauncherActivityInfo info : allActivityList) {
+            newAppsMap.put(getComponentKey(info.getComponentName(), info.getUser().getIdentifier()),
+                    info);
+        }
+        ArrayList<ItemInfo> addedItems = mBgDataModel.getAllWorkspaceItemsWithoutAppWidget();
+        for (ItemInfo info : addedItems) {
+            if (info.getTargetComponent() == null) continue;
+            if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) {
+                newAppsMap.remove(getComponentKey(info.getTargetComponent(), info.user.getIdentifier()));
+            } else if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_FOLDER) {
+                //TODO
+            }
+        }
+        if (DEBUG_BOBO) {
+            Log.d(TAG, "updateForSingleLayerStyle newAppsMap:" + newAppsMap.size());
+            newAppsMap.values().stream().forEach(item->{
+                Log.d(TAG, "updateForSingleLayerStyle activityInfo: " + item.getComponentName());
+            });
+        }
+        ItemInstallQueue.INSTANCE.get(mApp.getContext())
+                .pauseModelPush(ItemInstallQueue.FLAG_LOADER_RUNNING);
+        newAppsMap.values().stream().forEach(item->{
+            ItemInstallQueue.INSTANCE.get(mApp.getContext())
+                    .queueItem(item, item.getUser());
+        });
+        ItemInstallQueue.INSTANCE.get(mApp.getContext())
+                .resumeModelPush(ItemInstallQueue.FLAG_LOADER_RUNNING);
+        if (DEBUG_BOBO) {
+            Log.d(TAG, "updateForSingleLayerStyle end");
+        }
+    }
+
+    private String getComponentKey(ComponentName componentName, int userId) {
+        return componentName.toString() + "_" + userId;
+    }
+
     public synchronized void stopLocked() {
         mStopped = true;
         this.notify();
@@ -1058,6 +1161,15 @@ public class LoaderTask implements Runnable {
                             suggestionInfos);
                     info.suggestedFolderNames = suggestionInfos;
                 }
+            }          
+            if (DEBUG_BOBO) {
+                Log.d(TAG, "loadFolderNames mBgDataModel.folders size: " + mBgDataModel.folders.size());
+                for (int i = 0; i < mBgDataModel.folders.size(); i++) {
+                    FolderInfo info = mBgDataModel.folders.valueAt(i);
+                    Log.d(TAG, "info: " +
+                            info.suggestedFolderNames);
+                }
+                Log.d(TAG, "loadFolderNames end");
             }
         }
     }
diff --git a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WorkspaceItemSpaceFinder.java b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WorkspaceItemSpaceFinder.java
old mode 100644
new mode 100755
index 93fc6a539f1..ec685f7902b
--- a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WorkspaceItemSpaceFinder.java
+++ b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/WorkspaceItemSpaceFinder.java
@@ -66,7 +66,7 @@ public class WorkspaceItemSpaceFinder {
         int screenCount = workspaceScreens.size();
         // First check the preferred screen.
         IntSet screensToExclude = new IntSet();
-        if (FeatureFlags.QSB_ON_FIRST_SCREEN) {
+        if (FeatureFlags.QSB_ON_FIRST_SCREEN || LauncherAppState.isUserSingleLayerStyle()) {
             screensToExclude.add(FIRST_SCREEN_ID);
         }
 
diff --git a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/data/WorkspaceItemInfo.java b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/data/WorkspaceItemInfo.java
old mode 100644
new mode 100755
index 2b3da335c37..3f4be285775
--- a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/data/WorkspaceItemInfo.java
+++ b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/model/data/WorkspaceItemInfo.java
@@ -111,6 +111,7 @@ public class WorkspaceItemInfo extends ItemInfoWithIcon {
         iconResource = info.iconResource;
         status = info.status;
         personKeys = info.personKeys.clone();
+       mExtraFlags = info.mExtraFlags;
     }
 
     /** TODO: Remove this.  It's only called by ApplicationInfo.makeWorkspaceItem. */
@@ -228,4 +229,19 @@ public class WorkspaceItemInfo extends ItemInfoWithIcon {
     public WorkspaceItemInfo clone() {
         return new WorkspaceItemInfo(this);
     }
+   
+    public static final int EXTRA_FLAG_FORCE_ADD = 1;
+   private int mExtraFlags = 0;
+    public void addExtraFlag(int flag) {
+        mExtraFlags |= flag;
+    }
+
+    public void removeExtraFlag(int flag) {
+        mExtraFlags &= ~flag;
+    }
+
+    public boolean hasExtraFlag(int flag) {
+        return (mExtraFlags & flag) == flag;
+    }
+
 }
diff --git a/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/touch/AllAppsSwipeController.java b/vendor/mediatek/proprietary/packages/apps/Launcher3/src/com/android/launcher3/touch/AllAppsSwipeController.java
old mode 100644
new mode 100755
-- 
2.17.1



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容