diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9c0becf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+*.iml
+.gradle
+/local.properties
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+/.idea
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..8103e29
--- /dev/null
+++ b/README.md
@@ -0,0 +1,14 @@
+# GamingMode
+
+exTHmUI 游戏模式
+
+## 性能调节器说明
+当进入游戏模式或者用户调节 SeekBar 时, 游戏模式会设置 `sys.performance.level` 这个属性。\
+设备维护者需要在代码中添加对这个属性变化的监听。
+
+### 属性值说明
+- 0-6 : 数值越大性能越高
+-  -1 : 恢复默认性能 
+
+## 使用的第三方组件
+- [EasyDanmaku](https://github.com/LittleFogCat/EasyDanmaku)
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000..01d3dc8
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,51 @@
+apply plugin: 'com.android.application'
+
+android {
+    compileSdkVersion 29
+    buildToolsVersion "29.0.3"
+
+    defaultConfig {
+        applicationId "org.exthmui.game"
+        minSdkVersion 29
+        targetSdkVersion 29
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+}
+
+dependencies {
+    compileOnly fileTree(dir: 'system_libs/', include: ['*.jar'])
+
+    implementation fileTree(dir: "libs", include: ["*.jar"])
+
+    implementation 'androidx.appcompat:appcompat:1.2.0'
+    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+    implementation 'androidx.preference:preference:1.1.1'
+    implementation 'com.google.android.material:material:1.1.0'
+    implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
+    testImplementation 'junit:junit:4.12'
+    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+
+}
+
+allprojects{
+    gradle.projectsEvaluated {
+        tasks.withType(JavaCompile) {
+            options.compilerArgs.add('-Xbootclasspath/p:app/system_libs/framework.jar')
+        }
+    }
+}
\ No newline at end of file
diff --git a/app/keystore.properties b/app/keystore.properties
new file mode 100644
index 0000000..5c4b578
--- /dev/null
+++ b/app/keystore.properties
@@ -0,0 +1,4 @@
+keyAlias=platform
+keyPassword=android
+storeFile=platform.jks
+storePassword=android
diff --git a/app/platform.jks b/app/platform.jks
new file mode 100644
index 0000000..7ca31cf
--- /dev/null
+++ b/app/platform.jks
Binary files differ
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/app/src/androidTest/java/org/exthmui/game/ExampleInstrumentedTest.java b/app/src/androidTest/java/org/exthmui/game/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..6d029f1
--- /dev/null
+++ b/app/src/androidTest/java/org/exthmui/game/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package org.exthmui.game;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+        assertEquals("org.exthmui.game", appContext.getPackageName());
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/Android.bp b/app/src/main/Android.bp
new file mode 100644
index 0000000..ad773ec
--- /dev/null
+++ b/app/src/main/Android.bp
@@ -0,0 +1,32 @@
+android_app {
+    name: "GamingMode",
+
+    resource_dirs: ["res"],
+
+    srcs: ["java/**/*.java"],
+
+    static_libs: [
+        "androidx.annotation_annotation",
+        "androidx.appcompat_appcompat",
+        "androidx.preference_preference",
+        "androidx-constraintlayout_constraintlayout",
+        "com.google.android.material_material",
+        "androidx.localbroadcastmanager_localbroadcastmanager",
+        "org.lineageos.platform.internal",
+    ],
+
+    platform_apis: true,
+    product_specific: true,
+    certificate: "platform",
+
+    required: ["privapp_whitelist_org.exthmui.game.xml"],
+
+}
+
+prebuilt_etc {
+    name: "privapp_whitelist_org.exthmui.game.xml",
+
+    src: "privapp_whitelist_org.exthmui.game.xml",
+    sub_dir: "permissions",
+
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..b46f012
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="org.exthmui.game"
+    android:sharedUserId="android.uid.system">
+
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
+    <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
+    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
+
+    <application
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_name"
+        android:roundIcon="@mipmap/ic_launcher_round"
+        android:supportsRtl="true"
+        android:theme="@style/AppTheme">
+        <receiver
+            android:name=".receiver.GamingBroadcastReceiver"
+            android:enabled="true">
+            <intent-filter>
+                <action android:name="exthmui.intent.action.GAMING_MODE_ON" />
+            </intent-filter>
+        </receiver>
+
+        <service
+            android:name=".services.OverlayService"
+            android:enabled="true"
+            android:exported="false" />
+        <service
+            android:name=".services.GamingService"
+            android:enabled="true" />
+        <service
+            android:name=".services.DanmakuService"
+            android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
+            <intent-filter>
+                <action android:name="android.service.notification.NotificationListenerService" />
+            </intent-filter>
+        </service>
+    </application>
+
+</manifest>
\ No newline at end of file
diff --git a/app/src/main/java/org/exthmui/game/misc/Constants.java b/app/src/main/java/org/exthmui/game/misc/Constants.java
new file mode 100644
index 0000000..76822ed
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/misc/Constants.java
@@ -0,0 +1,114 @@
+package org.exthmui.game.misc;
+
+import android.provider.Settings;
+
+public class Constants {
+
+    // Notification
+    public final static String CHANNEL_GAMING_MODE_STATUS = "gaming_mode_status";
+
+    public final static String PROP_GAMING_PERFORMANCE = "sys.performance.level";
+
+    public static class Broadcasts {
+        public static final String SYS_BROADCAST_GAMING_MODE_ON = "exthmui.intent.action.GAMING_MODE_ON";
+        public static final String SYS_BROADCAST_GAMING_MODE_OFF = "exthmui.intent.action.GAMING_MODE_OFF";
+
+        // Local broadcast
+        public static final String BROADCAST_CONFIG_CHANGED = "org.exthmui.game.CONFIG_CHANGED";
+        public static final String BROADCAST_NEW_DANMAKU = "org.exthmui.game.NEW_DANMAKU";
+
+        /*
+        * GAMING_ACTION 需要携带的extra: String target, value
+        */
+        public static final String BROADCAST_GAMING_ACTION = "org.exthmui.game.GAMING_ACTION";
+        public static final String BROADCAST_GAMING_MENU_CONTROL = "org.exthmui.game.GAMING_MENU_CONTROL";
+    }
+
+    public static class ConfigKeys {
+        // 显示弹幕
+        public static final String SHOW_DANMAKU = Settings.System.GAMING_MODE_SHOW_DANMAKU;
+        // 弹幕速度
+        public static final String DANMAKU_SPEED_HORIZONTAL = Settings.System.GAMING_MODE_DANMAKU_SPEED_HORIZONTAL;
+        public static final String DANMAKU_SPEED_VERTICAL = Settings.System.GAMING_MODE_DANMAKU_SPEED_VERTICAL;
+        // 弹幕大小
+        public static final String DANMAKU_SIZE_HORIZONTAL = Settings.System.GAMING_MODE_DANMAKU_SIZE_HORIZONTAL;
+        public static final String DANMAKU_SIZE_VERTICAL = Settings.System.GAMING_MODE_DANMAKU_SIZE_VERTICAL;
+
+        // 动态过滤通知
+        public static final String DYNAMIC_NOTIFICATION_FILTER = Settings.System.GAMING_MODE_DANMAKU_DYNAMIC_NOTIFICATION_FILTER;
+        // 通知黑名单
+        public static final String NOTIFICATION_APP_BLACKLIST = Settings.System.GAMING_MODE_DANMAKU_APP_BLACKLIST;
+
+        // 禁用自动亮度
+        public static final String DISABLE_AUTO_BRIGHTNESS = Settings.System.GAMING_MODE_DISABLE_AUTO_BRIGHTNESS;
+
+        // 请勿打扰模式
+        public static final String DISABLE_RINGTONE = Settings.System.GAMING_MODE_DISABLE_RINGTONE;
+
+        // 屏蔽按键
+        public static final String DISABLE_HW_KEYS = Settings.System.GAMING_MODE_DISABLE_HW_KEYS;
+
+        // 屏蔽手势
+        public static final String DISABLE_GESTURE = Settings.System.GAMING_MODE_DISABLE_GESTURE;
+
+        // 性能配置
+        public static final String CHANGE_PERFORMANCE_LEVEL = Settings.System.GAMING_MODE_CHANGE_PERFORMANCE_LEVEL;
+        public static final String PERFORMANCE_LEVEL = Settings.System.GAMING_MODE_PERFORMANCE_LEVEL;
+
+        // 快速启动app
+        public static final String QUICK_START_APPS = Settings.System.GAMING_MODE_QS_APP_LIST;
+    }
+
+    public static class ConfigDefaultValues {
+        // 显示弹幕
+        public static final boolean SHOW_DANMAKU = true;
+        // 弹幕速度
+        public static final int DANMAKU_SPEED_HORIZONTAL = 300;
+        public static final int DANMAKU_SPEED_VERTICAL = 300;
+        // 弹幕大小
+        public static final int DANMAKU_SIZE_HORIZONTAL = 36;
+        public static final int DANMAKU_SIZE_VERTICAL = 36;
+
+        // 动态过滤通知
+        public static final boolean DYNAMIC_NOTIFICATION_FILTER = true;
+
+        // 请勿打扰模式
+        public static final boolean DISABLE_RINGTONE = true;
+
+        // 关闭自动亮度
+        public static final boolean DISABLE_AUTO_BRIGHTNESS = true;
+
+        // 屏蔽手势
+        public static final boolean DISABLE_GESTURE = true;
+
+        // 屏蔽按键
+        public static final boolean DISABLE_HW_KEYS = false;
+
+        // 性能配置
+        public static final boolean CHANGE_PERFORMANCE_LEVEL = true;
+        public static final int PERFORMANCE_LEVEL = 5;
+    }
+
+    public static class GamingActionTargets {
+        // 显示弹幕
+        public static final String SHOW_DANMAKU = ConfigKeys.SHOW_DANMAKU;
+        // 请勿打扰模式
+        public static final String DISABLE_RINGTONE = ConfigKeys.DISABLE_RINGTONE;
+        // 屏蔽按键
+        public static final String DISABLE_HW_KEYS = ConfigKeys.DISABLE_HW_KEYS;
+        // 屏蔽手势
+        public static final String DISABLE_GESTURE = ConfigKeys.DISABLE_GESTURE;
+        // 自动亮度
+        public static final String DISABLE_AUTO_BRIGHTNESS = ConfigKeys.DISABLE_AUTO_BRIGHTNESS;
+        // 性能配置
+        public static final String PERFORMANCE_LEVEL = ConfigKeys.PERFORMANCE_LEVEL;
+    }
+
+    public static class LocalConfigKeys {
+        // 悬浮球位置
+        public static final String FLOATING_BUTTON_COORDINATE_HORIZONTAL_X = "floating_button_horizontal_x";
+        public static final String FLOATING_BUTTON_COORDINATE_HORIZONTAL_Y = "floating_button_horizontal_y";
+        public static final String FLOATING_BUTTON_COORDINATE_VERTICAL_X = "floating_button_vertical_x";
+        public static final String FLOATING_BUTTON_COORDINATE_VERTICAL_Y = "floating_button_vertical_y";
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/qs/AppTile.java b/app/src/main/java/org/exthmui/game/qs/AppTile.java
new file mode 100644
index 0000000..cdafbd9
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/qs/AppTile.java
@@ -0,0 +1,21 @@
+package org.exthmui.game.qs;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+
+public class AppTile extends TileBase {
+
+    public AppTile(Context context, String packageName) {
+        super(context, packageName, packageName, null);
+        PackageManager pm = context.getPackageManager();
+        try {
+            ApplicationInfo applicationInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
+            qsText.setText(applicationInfo.loadLabel(pm));
+            qsIcon.setImageDrawable(applicationInfo.loadIcon(pm));
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+        }
+
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/qs/AutoBrightnessTile.java b/app/src/main/java/org/exthmui/game/qs/AutoBrightnessTile.java
new file mode 100644
index 0000000..f1c76bb
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/qs/AutoBrightnessTile.java
@@ -0,0 +1,13 @@
+package org.exthmui.game.qs;
+
+import android.content.Context;
+
+import org.exthmui.game.R;
+import org.exthmui.game.misc.Constants;
+
+public class AutoBrightnessTile extends TileBase {
+    public AutoBrightnessTile(Context context) {
+        super(context, "自动亮度", Constants.GamingActionTargets.DISABLE_AUTO_BRIGHTNESS, R.drawable.ic_qs_auto_brightness);
+        setNeedInverse(true);
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/qs/DNDTile.java b/app/src/main/java/org/exthmui/game/qs/DNDTile.java
new file mode 100644
index 0000000..eddda11
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/qs/DNDTile.java
@@ -0,0 +1,17 @@
+package org.exthmui.game.qs;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import org.exthmui.game.R;
+import org.exthmui.game.misc.Constants;
+
+public class DNDTile extends TileBase {
+    public DNDTile(Context context) {
+        super(context, "勿扰模式", Constants.GamingActionTargets.DISABLE_RINGTONE, R.drawable.ic_qs_dnd);
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/qs/DanmakuTile.java b/app/src/main/java/org/exthmui/game/qs/DanmakuTile.java
new file mode 100644
index 0000000..695fad5
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/qs/DanmakuTile.java
@@ -0,0 +1,12 @@
+package org.exthmui.game.qs;
+
+import android.content.Context;
+
+import org.exthmui.game.R;
+import org.exthmui.game.misc.Constants;
+
+public class DanmakuTile extends TileBase {
+    public DanmakuTile(Context context) {
+        super(context, "通知弹幕", Constants.GamingActionTargets.SHOW_DANMAKU, R.drawable.ic_qs_danmaku);
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/qs/LockGestureTile.java b/app/src/main/java/org/exthmui/game/qs/LockGestureTile.java
new file mode 100644
index 0000000..8418fcd
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/qs/LockGestureTile.java
@@ -0,0 +1,12 @@
+package org.exthmui.game.qs;
+
+import android.content.Context;
+
+import org.exthmui.game.R;
+import org.exthmui.game.misc.Constants;
+
+public class LockGestureTile extends TileBase {
+    public LockGestureTile(Context context) {
+        super(context, "屏蔽手势", Constants.GamingActionTargets.DISABLE_GESTURE, R.drawable.ic_qs_disable_gesture);
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/qs/LockHwKeysTile.java b/app/src/main/java/org/exthmui/game/qs/LockHwKeysTile.java
new file mode 100644
index 0000000..d628d5a
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/qs/LockHwKeysTile.java
@@ -0,0 +1,12 @@
+package org.exthmui.game.qs;
+
+import android.content.Context;
+
+import org.exthmui.game.R;
+import org.exthmui.game.misc.Constants;
+
+public class LockHwKeysTile extends TileBase {
+    public LockHwKeysTile(Context context) {
+        super(context, "屏蔽按键", Constants.GamingActionTargets.DISABLE_HW_KEYS, R.drawable.ic_qs_disable_hw_key);
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/qs/ScreenCaptureTile.java b/app/src/main/java/org/exthmui/game/qs/ScreenCaptureTile.java
new file mode 100644
index 0000000..5e2988f
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/qs/ScreenCaptureTile.java
@@ -0,0 +1,45 @@
+package org.exthmui.game.qs;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.RemoteException;
+import android.util.Log;
+import android.view.View;
+import android.view.WindowManagerGlobal;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import org.exthmui.game.R;
+import org.exthmui.game.misc.Constants;
+
+public class ScreenCaptureTile extends TileBase {
+
+    private static final String TAG = "ScreenCaptureTile";
+
+    private Intent hideMenuIntent = new Intent(Constants.Broadcasts.BROADCAST_GAMING_MENU_CONTROL).putExtra("cmd", "hide");
+    private Handler mHandler = new Handler();
+
+    public ScreenCaptureTile(Context context) {
+        super(context, "屏幕截图", "", R.drawable.ic_qs_screenshot);
+        qsIcon.setSelected(true);
+    }
+
+    @Override
+    public void setConfig(Bundle bundle) {
+
+    }
+
+    @Override
+    public void onClick(View v) {
+        LocalBroadcastManager.getInstance(mContext).sendBroadcastSync(hideMenuIntent);
+        mHandler.postDelayed(() -> {
+            try {
+                WindowManagerGlobal.getWindowManagerService().takeScreenshot(1);
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error while trying to take screenshot.", e);
+            }
+        }, 500);
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/qs/TileBase.java b/app/src/main/java/org/exthmui/game/qs/TileBase.java
new file mode 100644
index 0000000..30e8034
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/qs/TileBase.java
@@ -0,0 +1,82 @@
+package org.exthmui.game.qs;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import org.exthmui.game.R;
+import org.exthmui.game.misc.Constants;
+
+public class TileBase extends LinearLayout implements View.OnClickListener {
+    ImageView qsIcon;
+    TextView qsText;
+
+    Context mContext;
+
+    private boolean isSelected;
+    private String key;
+    Intent intent;
+    private boolean needInverse;
+
+    public TileBase(Context context, CharSequence text, String key, int iconRes) {
+        this(context, null);
+        qsIcon.setImageResource(iconRes);
+        qsText.setText(text);
+        this.key = key;
+        intent = new Intent(Constants.Broadcasts.BROADCAST_GAMING_ACTION).putExtra("target", key);
+    }
+
+    public TileBase(Context context, CharSequence text, String key, Drawable icon) {
+        this(context, null);
+        qsIcon.setImageDrawable(icon);
+        qsText.setText(text);
+        this.key = key;
+        intent = new Intent(Constants.Broadcasts.BROADCAST_GAMING_ACTION).putExtra("target", key);
+    }
+
+    public TileBase(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public TileBase(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public TileBase(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        mContext = context;
+        LayoutInflater.from(context).inflate(R.layout.gaming_qs_view, this, true);
+        qsIcon = findViewById(R.id.qs_icon);
+        qsText = findViewById(R.id.qs_text);
+        this.setOnClickListener(this);
+    }
+
+    public void setConfig(Bundle bundle) {
+        isSelected = bundle.getBoolean(key, isSelected);
+        qsIcon.setSelected(needInverse ? !isSelected : isSelected);
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setNeedInverse(boolean val) {
+        needInverse = val;
+    }
+
+    @Override
+    public void onClick(View v) {
+        intent.putExtra("value", !isSelected);
+        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/receiver/GamingBroadcastReceiver.java b/app/src/main/java/org/exthmui/game/receiver/GamingBroadcastReceiver.java
new file mode 100644
index 0000000..e9f85ec
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/receiver/GamingBroadcastReceiver.java
@@ -0,0 +1,24 @@
+package org.exthmui.game.receiver;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.UserHandle;
+import android.util.Log;
+
+import org.exthmui.game.misc.Constants;
+import org.exthmui.game.services.GamingService;
+
+public class GamingBroadcastReceiver extends BroadcastReceiver {
+
+    @Override
+    public void onReceive(Context context, Intent intent) {
+        if (intent != null) {
+            if (Constants.Broadcasts.SYS_BROADCAST_GAMING_MODE_ON.equals(intent.getAction())) {
+                Intent serviceIntent = new Intent(context, GamingService.class);
+                serviceIntent.putExtras(intent);
+                context.startForegroundServiceAsUser(serviceIntent, UserHandle.CURRENT);
+            }
+        }
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/services/DanmakuService.java b/app/src/main/java/org/exthmui/game/services/DanmakuService.java
new file mode 100644
index 0000000..fb0cf55
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/services/DanmakuService.java
@@ -0,0 +1,140 @@
+package org.exthmui.game.services;
+
+import android.app.Notification;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Bundle;
+import android.service.notification.NotificationListenerService;
+import android.service.notification.StatusBarNotification;
+import android.text.TextUtils;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import org.exthmui.game.misc.Constants;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class DanmakuService extends NotificationListenerService {
+
+    private Map<String, String> mLastNotificationMap = new HashMap<>();
+
+    private int filterThreshold = 3;
+    private boolean showDanmaku = Constants.ConfigDefaultValues.SHOW_DANMAKU;
+    private boolean useFilter = Constants.ConfigDefaultValues.DYNAMIC_NOTIFICATION_FILTER;
+    private String[] mNotificationBlacklist = new String[]{};
+    private BroadcastReceiver configReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (Constants.Broadcasts.BROADCAST_CONFIG_CHANGED.equals(intent.getAction())) {
+                updateConfig(intent);
+            }
+        }
+    };
+
+    public DanmakuService() {
+    }
+
+    @Override
+    public void onListenerConnected() {
+        super.onListenerConnected();
+        LocalBroadcastManager.getInstance(this).registerReceiver(configReceiver, new IntentFilter(Constants.Broadcasts.BROADCAST_CONFIG_CHANGED));
+    }
+
+    @Override
+    public void onListenerDisconnected() {
+        unregisterReceiver(configReceiver);
+        super.onListenerDisconnected();
+    }
+
+    @Override
+    public void onNotificationPosted(StatusBarNotification sbn) {
+        if (!showDanmaku) return;
+        Bundle extras = sbn.getNotification().extras;
+        if (!isInBlackList(sbn.getPackageName())){
+            String lastNotification = mLastNotificationMap.getOrDefault(sbn.getPackageName(), "");
+            String title = extras.getString(Notification.EXTRA_TITLE);
+            if (TextUtils.isEmpty(title)) title = extras.getString(Notification.EXTRA_TITLE_BIG);
+            String text = extras.getString(Notification.EXTRA_TEXT);
+            StringBuilder builder = new StringBuilder();
+            if (!TextUtils.isEmpty(title)) {
+                builder.append("[");
+                builder.append(title);
+                builder.append("] ");
+            }
+            if (!TextUtils.isEmpty(text)) {
+                builder.append(text);
+            }
+            String danmakuText = builder.toString();
+            if (!TextUtils.isEmpty(danmakuText) && (!useFilter || compareDanmaku(danmakuText, lastNotification))) {
+                sendDanmaku(danmakuText);
+            }
+            mLastNotificationMap.put(sbn.getPackageName(), danmakuText);
+        }
+    }
+
+    private boolean isInBlackList(String packageName) {
+        if (mNotificationBlacklist == null) return false;
+        for (String str : mNotificationBlacklist) {
+            if (TextUtils.equals(str, packageName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void sendDanmaku(String text) {
+        Intent intent = new Intent(Constants.Broadcasts.BROADCAST_NEW_DANMAKU);
+        intent.putExtra("danmaku_text", text);
+        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
+    }
+
+    private boolean compareDanmaku(String a, String b) {
+        String tA = a.replaceAll("[0-9]", "");
+        String tB = b.replaceAll("[0-9]", "");
+        if (TextUtils.isEmpty(tA) || TextUtils.isEmpty(tB)) {
+            return levenshtein(a, b) > filterThreshold;
+        } else {
+            return levenshtein(tA, tB) > filterThreshold;
+        }
+    }
+
+    private void updateConfig(Intent intent) {
+        if (intent != null) {
+            showDanmaku = intent.getBooleanExtra(Constants.ConfigKeys.SHOW_DANMAKU, showDanmaku);
+            useFilter = intent.getBooleanExtra(Constants.ConfigKeys.DYNAMIC_NOTIFICATION_FILTER, useFilter);
+            mNotificationBlacklist = intent.getStringArrayExtra(Constants.ConfigKeys.NOTIFICATION_APP_BLACKLIST);
+        }
+    }
+
+    // 最小编辑距离
+    public static int levenshtein(CharSequence a, CharSequence b) {
+        if (TextUtils.isEmpty(a)) {
+            return TextUtils.isEmpty(b) ? 0 : b.length();
+        } else if (TextUtils.isEmpty(b)) {
+            return TextUtils.isEmpty(a) ? 0 : a.length();
+        }
+        final int lenA = a.length(), lenB = b.length();
+        int[][] dp = new int[lenA+1][lenB+1];
+        int flag = 0;
+        for (int i = 0; i <= lenA; i++) {
+            for (int j = 0; j <= lenB; j++) dp[i][j] = lenA + lenB;
+        }
+        for(int i=1; i <= lenA; i++) dp[i][0] = i;
+        for(int j=1; j <= lenB; j++) dp[0][j] = j;
+        for (int i = 1; i <= lenA; i++) {
+            for (int j = 1; j <= lenB; j++) {
+                if (a.charAt(i-1) == b.charAt(j-1)) {
+                    flag = 0;
+                } else {
+                    flag = 1;
+                }
+                dp[i][j] = Math.min(dp[i-1][j-1] + flag, Math.min(dp[i-1][j] + 1, dp[i][j-1] + 1));
+            }
+        }
+        return dp[lenA][lenB];
+    }
+
+}
diff --git a/app/src/main/java/org/exthmui/game/services/GamingService.java b/app/src/main/java/org/exthmui/game/services/GamingService.java
new file mode 100644
index 0000000..2a5f246
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/services/GamingService.java
@@ -0,0 +1,291 @@
+package org.exthmui.game.services;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.app.Service;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.media.AudioManager;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.SystemProperties;
+import android.os.UserHandle;
+import android.provider.Settings;
+import android.telecom.TelecomManager;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.widget.Toast;
+
+import androidx.annotation.Nullable;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import com.android.internal.statusbar.IStatusBarService;
+
+import org.exthmui.game.R;
+import org.exthmui.game.misc.Constants;
+
+import lineageos.hardware.LineageHardwareManager;
+
+public class GamingService extends Service {
+
+    private static final int NOTIFICATION_ID = 1;
+
+    private Intent mOverlayServiceIntent;
+    private Notification mGamingNotification;
+
+    private String mCurrentPackage;
+
+    private Bundle mCurrentConfig = new Bundle();
+
+    private AudioManager mAudioManager;
+    private IStatusBarService mStatusBarService;
+    private LineageHardwareManager mLineageHardware;
+
+    private BroadcastReceiver mGamingModeOffReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (Constants.Broadcasts.SYS_BROADCAST_GAMING_MODE_OFF.equals(intent.getAction())) {
+                stopSelf();
+            }
+        }
+    };
+
+    private BroadcastReceiver mGamingActionReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String target = intent.getStringExtra("target");
+            Intent configChangedIntent = new Intent(Constants.Broadcasts.BROADCAST_CONFIG_CHANGED);
+            if (Constants.GamingActionTargets.DISABLE_AUTO_BRIGHTNESS.equals(target)) {
+                setDisableAutoBrightness(intent.getBooleanExtra("value", Constants.ConfigDefaultValues.DISABLE_AUTO_BRIGHTNESS), false);
+            } else if (Constants.GamingActionTargets.DISABLE_GESTURE.equals(target)) {
+                setDisableGesture(intent.getBooleanExtra("value", Constants.ConfigDefaultValues.DISABLE_GESTURE));
+            } else if (Constants.GamingActionTargets.DISABLE_HW_KEYS.equals(target)) {
+                setDisableHwKeys(intent.getBooleanExtra("value", Constants.ConfigDefaultValues.DISABLE_HW_KEYS), false);
+            } else if (Constants.GamingActionTargets.DISABLE_RINGTONE.equals(target)) {
+                setDisableRingtone(intent.getBooleanExtra("value", Constants.ConfigDefaultValues.DISABLE_RINGTONE));
+            } else if (Constants.GamingActionTargets.SHOW_DANMAKU.equals(target)) {
+                setShowDanmaku(intent.getBooleanExtra("value", Constants.ConfigDefaultValues.SHOW_DANMAKU));
+            } else if (Constants.GamingActionTargets.PERFORMANCE_LEVEL.equals(target)) {
+                setPerformanceLevel(intent.getIntExtra("value", Constants.ConfigDefaultValues.PERFORMANCE_LEVEL));
+            } else {
+                return;
+            }
+            configChangedIntent.putExtras(mCurrentConfig);
+            LocalBroadcastManager.getInstance(GamingService.this).sendBroadcast(configChangedIntent);
+        }
+    };
+
+
+    public GamingService() {
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        createNotificationChannel(this, Constants.CHANNEL_GAMING_MODE_STATUS, getString(R.string.channel_gaming_mode_status), NotificationManager.IMPORTANCE_LOW);
+
+        mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
+        mStatusBarService = IStatusBarService.Stub.asInterface(ServiceManager.getService(Context.STATUS_BAR_SERVICE));
+        try {
+            mLineageHardware = LineageHardwareManager.getInstance(this);
+        } catch (Error e) {
+            e.printStackTrace();
+        }
+
+        registerReceiver(mGamingModeOffReceiver, new IntentFilter(Constants.Broadcasts.SYS_BROADCAST_GAMING_MODE_OFF));
+        LocalBroadcastManager.getInstance(this).registerReceiver(mGamingActionReceiver, new IntentFilter(Constants.Broadcasts.BROADCAST_GAMING_ACTION));
+
+        mOverlayServiceIntent = new Intent(this, OverlayService.class);
+
+        PendingIntent stopGamingIntent = PendingIntent.getBroadcast(this, 0, new Intent(Constants.Broadcasts.SYS_BROADCAST_GAMING_MODE_OFF), 0);
+        Notification.Builder builder = new Notification.Builder(this, Constants.CHANNEL_GAMING_MODE_STATUS);
+        Notification.Action.Builder actionBuilder = new Notification.Action.Builder(null, getString(R.string.action_stop_gaming_mode), stopGamingIntent);
+        builder.addAction(actionBuilder.build());
+        builder.setContentText(getString(R.string.gaming_mode_running));
+        builder.setSmallIcon(R.drawable.ic_launcher_foreground);
+
+        mGamingNotification = builder.build();
+        startForeground(NOTIFICATION_ID, mGamingNotification);
+
+        Toast.makeText(this, R.string.gaming_mode_on, Toast.LENGTH_SHORT).show();
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        if (!TextUtils.equals(intent.getStringExtra("package"), mCurrentPackage)) {
+            mCurrentPackage = intent.getStringExtra("package");
+            updateConfig();
+        }
+
+        mOverlayServiceIntent.putExtras(mCurrentConfig);
+        startServiceAsUser(mOverlayServiceIntent, UserHandle.CURRENT);
+        Settings.System.putInt(getContentResolver(), Settings.System.GAMING_MODE_ACTIVE, 1);
+        return super.onStartCommand(intent, flags, startId);
+    }
+
+    private void updateConfig() {
+        // danmaku
+        mCurrentConfig.putBoolean(Constants.ConfigKeys.SHOW_DANMAKU, getBooleanSetting(Constants.ConfigKeys.SHOW_DANMAKU, Constants.ConfigDefaultValues.SHOW_DANMAKU));
+        mCurrentConfig.putInt(Constants.ConfigKeys.DANMAKU_SPEED_HORIZONTAL, getIntSetting(Constants.ConfigKeys.DANMAKU_SPEED_HORIZONTAL, Constants.ConfigDefaultValues.DANMAKU_SPEED_HORIZONTAL));
+        mCurrentConfig.putInt(Constants.ConfigKeys.DANMAKU_SPEED_VERTICAL, getIntSetting(Constants.ConfigKeys.DANMAKU_SPEED_VERTICAL, Constants.ConfigDefaultValues.DANMAKU_SPEED_VERTICAL));
+        mCurrentConfig.putInt(Constants.ConfigKeys.DANMAKU_SIZE_HORIZONTAL, getIntSetting(Constants.ConfigKeys.DANMAKU_SIZE_HORIZONTAL, Constants.ConfigDefaultValues.DANMAKU_SIZE_HORIZONTAL));
+        mCurrentConfig.putInt(Constants.ConfigKeys.DANMAKU_SIZE_VERTICAL, getIntSetting(Constants.ConfigKeys.DANMAKU_SIZE_VERTICAL, Constants.ConfigDefaultValues.DANMAKU_SIZE_VERTICAL));
+        mCurrentConfig.putBoolean(Constants.ConfigKeys.DYNAMIC_NOTIFICATION_FILTER, getBooleanSetting(Constants.ConfigKeys.DYNAMIC_NOTIFICATION_FILTER, Constants.ConfigDefaultValues.DYNAMIC_NOTIFICATION_FILTER));
+        mCurrentConfig.putStringArray(Constants.ConfigKeys.NOTIFICATION_APP_BLACKLIST, getStringArraySetting(Constants.ConfigKeys.NOTIFICATION_APP_BLACKLIST));
+
+        // performance
+        boolean changePerformance = getBooleanSetting(Constants.ConfigKeys.CHANGE_PERFORMANCE_LEVEL, Constants.ConfigDefaultValues.CHANGE_PERFORMANCE_LEVEL);
+        int performanceLevel = getIntSetting(Constants.ConfigKeys.PERFORMANCE_LEVEL, Constants.ConfigDefaultValues.PERFORMANCE_LEVEL);
+        if (changePerformance) {
+            setPerformanceLevel(performanceLevel);
+        } else {
+            mCurrentConfig.putInt(Constants.ConfigKeys.PERFORMANCE_LEVEL, performanceLevel);
+        }
+
+        // hw keys & gesture
+        boolean disableHwKeys = getBooleanSetting(Constants.ConfigKeys.DISABLE_HW_KEYS, Constants.ConfigDefaultValues.DISABLE_HW_KEYS);
+        boolean disableGesture = getBooleanSetting(Constants.ConfigKeys.DISABLE_GESTURE, Constants.ConfigDefaultValues.DISABLE_GESTURE);
+        setDisableHwKeys(disableHwKeys, false);
+        setDisableGesture(disableGesture);
+
+        // quick-start apps
+        mCurrentConfig.putStringArray(Constants.ConfigKeys.QUICK_START_APPS, getStringArraySetting(Constants.ConfigKeys.QUICK_START_APPS));
+        setAutoRotation(false);
+
+        // misc
+        boolean disableRingtone = getBooleanSetting(Constants.ConfigKeys.DISABLE_RINGTONE, Constants.ConfigDefaultValues.DISABLE_RINGTONE);
+        setDisableRingtone(disableRingtone);
+        boolean disableAutoBrightness = getBooleanSetting(Constants.ConfigKeys.DISABLE_AUTO_BRIGHTNESS, Constants.ConfigDefaultValues.DISABLE_AUTO_BRIGHTNESS);
+        setDisableAutoBrightness(disableAutoBrightness, false);
+
+        Intent intent = new Intent(Constants.Broadcasts.BROADCAST_CONFIG_CHANGED);
+        intent.putExtras(mCurrentConfig);
+        LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
+    }
+
+    private void setDisableHwKeys(boolean disable, boolean restore) {
+        if (mLineageHardware == null) return;
+        if (!mCurrentConfig.containsKey("old_disable_hw_keys")) {
+            boolean oldValue = mLineageHardware.get(LineageHardwareManager.FEATURE_KEY_DISABLE);
+            mCurrentConfig.putBoolean("old_disable_hw_keys", oldValue);
+        }
+        if (!restore) {
+            mCurrentConfig.putBoolean(Constants.ConfigKeys.DISABLE_HW_KEYS, disable);
+            mLineageHardware.set(LineageHardwareManager.FEATURE_KEY_DISABLE, disable);
+        } else {
+            boolean oldValue = mCurrentConfig.getBoolean("old_disable_hw_keys");
+            mCurrentConfig.putBoolean(Constants.ConfigKeys.DISABLE_HW_KEYS, oldValue);
+            mLineageHardware.set(LineageHardwareManager.FEATURE_KEY_DISABLE, oldValue);
+        }
+    }
+
+    private void setDisableGesture(boolean disable) {
+        mCurrentConfig.putBoolean(Constants.ConfigKeys.DISABLE_GESTURE, disable);
+        try {
+            mStatusBarService.setBlockedGesturalNavigation(disable);
+        } catch (RemoteException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void setShowDanmaku(boolean show) {
+        mCurrentConfig.putBoolean(Constants.ConfigKeys.SHOW_DANMAKU, show);
+    }
+
+    private void setPerformanceLevel(int level) {
+        SystemProperties.set(Constants.PROP_GAMING_PERFORMANCE, String.valueOf(level));
+        mCurrentConfig.putInt(Constants.ConfigKeys.PERFORMANCE_LEVEL, level);
+    }
+
+    private void setDisableRingtone(boolean disable) {
+        if (!mCurrentConfig.containsKey("old_ringer_mode")) {
+            mCurrentConfig.putInt("old_ringer_mode", mAudioManager.getRingerMode());
+        }
+        int oldRingerMode = mCurrentConfig.getInt("old_ringer_mode", AudioManager.RINGER_MODE_NORMAL);
+        mAudioManager.setRingerMode(disable ? AudioManager.RINGER_MODE_VIBRATE : oldRingerMode);
+        mCurrentConfig.putBoolean(Constants.ConfigKeys.DISABLE_RINGTONE, disable);
+    }
+
+    private void setDisableAutoBrightness(boolean disable, boolean restore) {
+        if (!mCurrentConfig.containsKey("old_auto_brightness")) {
+            int oldValue = getIntSetting(Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+            mCurrentConfig.putInt("old_auto_brightness", oldValue);
+        }
+        if (!restore) {
+            if (disable) {
+                Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+            } else {
+                Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+            }
+            mCurrentConfig.putBoolean(Constants.ConfigKeys.DISABLE_AUTO_BRIGHTNESS, disable);
+        } else {
+            int oldValue = mCurrentConfig.getInt("old_auto_brightness");
+            mCurrentConfig.putBoolean(Constants.ConfigKeys.DISABLE_AUTO_BRIGHTNESS, oldValue == Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+            Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, oldValue);
+        }
+    }
+
+    private void setAutoRotation(boolean restore) {
+        if (!mCurrentConfig.containsKey("old_auto_rotation")) {
+            mCurrentConfig.putInt("old_auto_rotation", getIntSetting(Settings.System.ACCELEROMETER_ROTATION, 0));
+        }
+        if (!restore) {
+            Settings.System.putInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, 1);
+        } else {
+            int oldValue = mCurrentConfig.getInt("old_auto_rotation");
+            Settings.System.putInt(getContentResolver(), Settings.System.ACCELEROMETER_ROTATION, oldValue);
+        }
+    }
+
+    @Override
+    public void onDestroy() {
+        unregisterReceiver(mGamingModeOffReceiver);
+        stopServiceAsUser(mOverlayServiceIntent, UserHandle.CURRENT);
+        setDisableGesture(false);
+        setDisableHwKeys(false, true);
+        setDisableAutoBrightness(false, true);
+        setDisableRingtone(false);
+        setPerformanceLevel(-1);
+        setAutoRotation(true);
+        Settings.System.putInt(getContentResolver(), Settings.System.GAMING_MODE_ACTIVE, 0);
+        Toast.makeText(this, R.string.gaming_mode_off, Toast.LENGTH_SHORT).show();
+        super.onDestroy();
+    }
+
+    @Nullable
+    @Override
+    public IBinder onBind(Intent intent) {
+        return null;
+    }
+
+    private static void createNotificationChannel(Context context, String channelId, String channelName, int importance) {
+        NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
+        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+        notificationManager.createNotificationChannel(channel);
+    }
+
+    private boolean getBooleanSetting(String key, boolean def) {
+        return Settings.System.getInt(getContentResolver(), key, def ? 1 : 0) != 0;
+    }
+
+    private int getIntSetting(String key, int def) {
+        return Settings.System.getInt(getContentResolver(), key, def);
+    }
+
+    private String[] getStringArraySetting(String key) {
+        String val = Settings.System.getString(getContentResolver(), key);
+        if (!TextUtils.isEmpty(val)) {
+            return val.split(";");
+        } else {
+            return null;
+        }
+    }
+
+}
diff --git a/app/src/main/java/org/exthmui/game/services/OverlayService.java b/app/src/main/java/org/exthmui/game/services/OverlayService.java
new file mode 100644
index 0000000..31053bc
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/services/OverlayService.java
@@ -0,0 +1,341 @@
+package org.exthmui.game.services;
+
+import android.app.Service;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.SharedPreferences;
+import android.graphics.PixelFormat;
+import android.os.Bundle;
+import android.os.IBinder;
+import android.preference.PreferenceManager;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.Gravity;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import org.exthmui.game.R;
+import org.exthmui.game.misc.Constants;
+import org.exthmui.game.ui.GamingPerformanceView;
+import org.exthmui.game.ui.QuickStartAppView;
+import org.exthmui.game.ui.QuickSettingsView;
+
+import top.littlefogcat.danmakulib.danmaku.Danmaku;
+import top.littlefogcat.danmakulib.danmaku.DanmakuManager;
+import top.littlefogcat.danmakulib.utils.ScreenUtil;
+
+public class OverlayService extends Service {
+
+    private View mGamingFloatingButton;
+    private LinearLayout mGamingOverlayView;
+    private ScrollView mGamingMenu;
+    private FrameLayout mDanmakuContainer;
+    private QuickSettingsView mQSView;
+    private QuickStartAppView mQSAppView;
+
+    private DanmakuManager mDanmakuManager;
+
+    private WindowManager mWindowManager;
+    private WindowManager.LayoutParams mGamingFBLayoutParams;
+
+    private GamingPerformanceView performanceController;
+
+    private Bundle configBundle;
+
+    private OMReceiver mOMReceiver = new OMReceiver();
+    private BroadcastReceiver mSysConfigChangedReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (Intent.ACTION_CONFIGURATION_CHANGED.equals(intent.getAction())) updateConfig();
+        }
+    };
+
+    private SharedPreferences mPreferences;
+
+    public OverlayService() {
+    }
+
+    @Override
+    public IBinder onBind(Intent intent) {
+        return null;
+    }
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        configBundle = new Bundle();
+
+        if (Settings.canDrawOverlays(this)) {
+            initView();
+        }
+
+        IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(Constants.Broadcasts.BROADCAST_NEW_DANMAKU);
+        intentFilter.addAction(Constants.Broadcasts.BROADCAST_CONFIG_CHANGED);
+        intentFilter.addAction(Constants.Broadcasts.BROADCAST_GAMING_MENU_CONTROL);
+        LocalBroadcastManager.getInstance(this).registerReceiver(mOMReceiver, intentFilter);
+
+        registerReceiver(mSysConfigChangedReceiver, new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED));
+
+        mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
+    }
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        if (intent.getExtras() != null) configBundle.putAll(intent.getExtras());
+        updateConfig();
+        return super.onStartCommand(intent, flags, startId);
+    }
+
+    private void initView() {
+        mWindowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
+        initGamingMenu();
+        initFloatingButton();
+        initDanmaku();
+    }
+
+    private void updateConfig() {
+        ScreenUtil.init(this);
+
+        if (mQSView != null) {
+            mQSView.setConfig(configBundle);
+        }
+
+        if (configBundle.containsKey(Constants.ConfigKeys.QUICK_START_APPS)) {
+            mQSAppView.setConfig(configBundle);
+        }
+
+        // 悬浮球位置调整
+        if (mGamingFloatingButton != null && mGamingFBLayoutParams != null) {
+            int defaultX = ((int) getResources().getDimension(R.dimen.game_button_size) - ScreenUtil.getScreenWidth()) / 2;
+            if (ScreenUtil.isPortrait()) {
+                mGamingFBLayoutParams.x = mPreferences.getInt(Constants.LocalConfigKeys.FLOATING_BUTTON_COORDINATE_VERTICAL_X, defaultX);
+                mGamingFBLayoutParams.y = mPreferences.getInt(Constants.LocalConfigKeys.FLOATING_BUTTON_COORDINATE_VERTICAL_Y, 10);
+            } else {
+                mGamingFBLayoutParams.x = mPreferences.getInt(Constants.LocalConfigKeys.FLOATING_BUTTON_COORDINATE_HORIZONTAL_X, defaultX);
+                mGamingFBLayoutParams.y = mPreferences.getInt(Constants.LocalConfigKeys.FLOATING_BUTTON_COORDINATE_HORIZONTAL_Y, 10);
+            }
+            if (mWindowManager != null) {
+                mWindowManager.updateViewLayout(mGamingFloatingButton, mGamingFBLayoutParams);
+            }
+            mQSAppView.setFloatingButtonCoordinate(mGamingFBLayoutParams.x, mGamingFBLayoutParams.y);
+        }
+
+        // 弹幕设置
+        mDanmakuManager.setMaxDanmakuSize(20); // 设置同屏最大弹幕数
+        DanmakuManager.Config config = mDanmakuManager.getConfig(); // 弹幕相关设置
+        config.setScrollSpeed(ScreenUtil.isPortrait() ?
+                configBundle.getInt(Constants.ConfigKeys.DANMAKU_SPEED_VERTICAL, Constants.ConfigDefaultValues.DANMAKU_SPEED_VERTICAL) :
+                configBundle.getInt(Constants.ConfigKeys.DANMAKU_SPEED_HORIZONTAL, Constants.ConfigDefaultValues.DANMAKU_SPEED_HORIZONTAL));
+        config.setLineHeight(ScreenUtil.autoSize(ScreenUtil.isPortrait() ?
+                configBundle.getInt(Constants.ConfigKeys.DANMAKU_SIZE_VERTICAL,Constants.ConfigDefaultValues.DANMAKU_SIZE_VERTICAL) + 4 :
+                configBundle.getInt(Constants.ConfigKeys.DANMAKU_SIZE_HORIZONTAL,Constants.ConfigDefaultValues.DANMAKU_SIZE_HORIZONTAL) + 4)); // 设置行高
+        config.setMaxScrollLine(ScreenUtil.getScreenHeight() / 2 / config.getLineHeight());
+
+        // 性能配置
+        if (performanceController != null) {
+            performanceController.setLevel(configBundle.getInt(Constants.ConfigKeys.PERFORMANCE_LEVEL, Constants.ConfigDefaultValues.PERFORMANCE_LEVEL));
+        }
+    }
+
+    private WindowManager.LayoutParams getBaseLayoutParams() {
+        return new WindowManager.LayoutParams(
+                WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
+                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+                        |WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
+                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
+                PixelFormat.TRANSLUCENT);
+    }
+
+    private void initGamingMenu() {
+        if (mGamingOverlayView == null && mWindowManager != null) {
+            mGamingOverlayView = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.gaming_overlay_layout, null);
+            mGamingOverlayView.setVisibility(View.GONE);
+            WindowManager.LayoutParams mGamingViewLayoutParams = getBaseLayoutParams();
+            mWindowManager.addView(mGamingOverlayView, mGamingViewLayoutParams);
+
+            mGamingMenu = mGamingOverlayView.findViewById(R.id.gaming_menu);
+            mQSView = mGamingOverlayView.findViewById(R.id.gaming_qs);
+            mQSAppView = mGamingOverlayView.findViewById(R.id.gaming_qsapp);
+
+            performanceController = mGamingOverlayView.findViewById(R.id.performance_controller);
+            mGamingOverlayView.setOnClickListener(v -> showHideGamingMenu(0));
+        }
+    }
+
+    private void initFloatingButton() {
+        if (mGamingFloatingButton == null && mWindowManager != null) {
+            mGamingFloatingButton = LayoutInflater.from(this).inflate(R.layout.gaming_button_layout, null);
+
+            mGamingFBLayoutParams = getBaseLayoutParams();
+            mGamingFBLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
+            mGamingFBLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
+
+            mGamingFloatingButton.setOnClickListener(v -> showHideGamingMenu(0));
+            mGamingFloatingButton.setOnTouchListener(new View.OnTouchListener() {
+                private int origX;
+                private int origY;
+                private int touchX;
+                private int touchY;
+                private boolean isMoved;
+
+                @Override
+                public boolean onTouch(View v, MotionEvent event) {
+                    int x = (int) event.getRawX();
+                    int y = (int) event.getRawY();
+
+                    switch (event.getAction()) {
+                        case MotionEvent.ACTION_DOWN:
+                            origX = mGamingFBLayoutParams.x;
+                            origY = mGamingFBLayoutParams.y;
+                            touchX = x;
+                            touchY = y;
+                            break;
+                        case MotionEvent.ACTION_MOVE:
+                            isMoved = true;
+                            mGamingFBLayoutParams.x = origX + x - touchX;
+                            mGamingFBLayoutParams.y = origY + y - touchY;
+                            if (mWindowManager != null) {
+                                mWindowManager.updateViewLayout(mGamingFloatingButton, mGamingFBLayoutParams);
+                            }
+                            break;
+                        case MotionEvent.ACTION_UP:
+                            if (!isMoved) {
+                                v.performClick();
+                            } else {
+                                if (ScreenUtil.isPortrait()) {
+                                    mPreferences.edit()
+                                            .putInt(Constants.LocalConfigKeys.FLOATING_BUTTON_COORDINATE_VERTICAL_X, mGamingFBLayoutParams.x)
+                                            .putInt(Constants.LocalConfigKeys.FLOATING_BUTTON_COORDINATE_VERTICAL_Y, mGamingFBLayoutParams.y)
+                                            .apply();
+                                } else {
+                                    mPreferences.edit()
+                                            .putInt(Constants.LocalConfigKeys.FLOATING_BUTTON_COORDINATE_HORIZONTAL_X, mGamingFBLayoutParams.x)
+                                            .putInt(Constants.LocalConfigKeys.FLOATING_BUTTON_COORDINATE_HORIZONTAL_Y, mGamingFBLayoutParams.y)
+                                            .apply();
+                                }
+                                if (mQSAppView != null) {
+                                    mQSAppView.setFloatingButtonCoordinate(mGamingFBLayoutParams.x, mGamingFBLayoutParams.y);
+                                }
+                            }
+                            isMoved = false;
+                            break;
+                        default:
+                            return false;
+                    }
+                    return true;
+                }
+            });
+
+            mWindowManager.addView(mGamingFloatingButton, mGamingFBLayoutParams);
+        }
+    }
+
+    /*
+     * mode: 0=auto, 1=show, 2=hide
+     */
+    private void showHideGamingMenu(int mode) {
+        if (mGamingOverlayView.getVisibility() == View.VISIBLE && mode != 1) {
+            // hide
+            mGamingOverlayView.setVisibility(View.GONE);
+            mGamingFloatingButton.setVisibility(View.VISIBLE);
+        } else if (mode != 2) {
+            // show
+            int gravity = 0;
+            if (mGamingFBLayoutParams.x > 0) {
+                gravity |= Gravity.RIGHT;
+            } else {
+                gravity |= Gravity.LEFT;
+            }
+            if (mGamingFBLayoutParams.y > 0) {
+                gravity |= Gravity.BOTTOM;
+            } else {
+                gravity |= Gravity.TOP;
+            }
+
+            mGamingFloatingButton.setVisibility(View.GONE);
+            mGamingOverlayView.setGravity(gravity);
+            ViewGroup.LayoutParams gamingMenuLayoutParams =  mGamingMenu.getLayoutParams();
+            if (ScreenUtil.isPortrait()) {
+                gamingMenuLayoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
+            } else {
+                gamingMenuLayoutParams.width = ScreenUtil.getScreenWidth() / 2;
+            }
+            mGamingMenu.setLayoutParams(gamingMenuLayoutParams);
+
+            mGamingOverlayView.setVisibility(View.VISIBLE);
+        }
+    }
+
+    private void initDanmaku() {
+        if (mWindowManager != null && mDanmakuContainer == null) {
+            mDanmakuContainer = new FrameLayout(this);
+            WindowManager.LayoutParams danmakuParams = getBaseLayoutParams();
+            danmakuParams.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
+            mWindowManager.addView(mDanmakuContainer, danmakuParams);
+
+            mDanmakuManager = DanmakuManager.getInstance();
+            mDanmakuManager.init(this, mDanmakuContainer);
+        }
+    }
+
+    private void sendDanmaku(String danmakuText) {
+        if (mDanmakuManager == null) return;
+        Danmaku danmaku = new Danmaku();
+        danmaku.text = danmakuText;
+        danmaku.mode = Danmaku.Mode.scroll;
+        danmaku.size = ScreenUtil.autoSize(
+                configBundle.getInt(Constants.ConfigKeys.DANMAKU_SIZE_HORIZONTAL,Constants.ConfigDefaultValues.DANMAKU_SIZE_HORIZONTAL),
+                configBundle.getInt(Constants.ConfigKeys.DANMAKU_SIZE_VERTICAL,Constants.ConfigDefaultValues.DANMAKU_SIZE_VERTICAL));
+        mDanmakuManager.send(danmaku);
+    }
+
+    @Override
+    public void onDestroy() {
+        LocalBroadcastManager.getInstance(this).unregisterReceiver(mOMReceiver);
+        unregisterReceiver(mSysConfigChangedReceiver);
+        if (mWindowManager != null) {
+            if (mGamingFloatingButton != null) mWindowManager.removeViewImmediate(mGamingFloatingButton);
+            if (mDanmakuContainer != null) mWindowManager.removeViewImmediate(mDanmakuContainer);
+            if (mGamingOverlayView != null) mWindowManager.removeViewImmediate(mGamingOverlayView);
+        }
+        super.onDestroy();
+    }
+
+    private class OMReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            String action = intent.getAction();
+            if (action == null) return;
+            switch (action) {
+                case Constants.Broadcasts.BROADCAST_NEW_DANMAKU:
+                    String danmaku = intent.getStringExtra("danmaku_text");
+                    if (TextUtils.isEmpty(danmaku)) return;
+                    sendDanmaku(danmaku);
+                    break;
+                case Constants.Broadcasts.BROADCAST_CONFIG_CHANGED:
+                    if (intent.getExtras() == null) return;
+                    configBundle.putAll(intent.getExtras());
+                    updateConfig();
+                    break;
+                case Constants.Broadcasts.BROADCAST_GAMING_MENU_CONTROL:
+                    if ("hide".equals(intent.getStringExtra("cmd"))) {
+                        showHideGamingMenu(2);
+                    } else if ("show".equals(intent.getStringExtra("cmd"))) {
+                        showHideGamingMenu(1);
+                    }
+                    break;
+            }
+        }
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/ui/GamingPerformanceView.java b/app/src/main/java/org/exthmui/game/ui/GamingPerformanceView.java
new file mode 100644
index 0000000..93b6422
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/ui/GamingPerformanceView.java
@@ -0,0 +1,56 @@
+package org.exthmui.game.ui;
+
+import android.content.Context;
+import android.content.Intent;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.widget.LinearLayout;
+import android.widget.RadioGroup;
+import android.widget.SeekBar;
+
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import org.exthmui.game.R;
+import org.exthmui.game.misc.Constants;
+
+public class GamingPerformanceView extends LinearLayout implements SeekBar.OnSeekBarChangeListener {
+
+    private Context mContext;
+
+    private Intent mPerformanceIntent = new Intent(Constants.Broadcasts.BROADCAST_GAMING_ACTION)
+            .putExtra("target", Constants.GamingActionTargets.PERFORMANCE_LEVEL);
+
+    private SeekBar mSeekBar;
+
+    public GamingPerformanceView(Context context) {
+        this(context, null);
+    }
+
+    public GamingPerformanceView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        mContext = context;
+        LayoutInflater.from(context).inflate(R.layout.gaming_perofrmance_layout, this, true);
+        mSeekBar = findViewById(R.id.performance_seek);
+        mSeekBar.setOnSeekBarChangeListener(this);
+    }
+
+    public void setLevel(int level) {
+        mSeekBar.setProgress(level);
+    }
+
+    @Override
+    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+
+    }
+
+    @Override
+    public void onStartTrackingTouch(SeekBar seekBar) {
+
+    }
+
+    @Override
+    public void onStopTrackingTouch(SeekBar seekBar) {
+        mPerformanceIntent.putExtra("value", mSeekBar.getProgress());
+        LocalBroadcastManager.getInstance(mContext).sendBroadcast(mPerformanceIntent);
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/ui/MusicControllerView.java b/app/src/main/java/org/exthmui/game/ui/MusicControllerView.java
new file mode 100644
index 0000000..16fcc49
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/ui/MusicControllerView.java
@@ -0,0 +1,189 @@
+package org.exthmui.game.ui;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.media.MediaMetadata;
+import android.media.session.MediaController;
+import android.media.session.MediaSessionManager;
+import android.media.session.PlaybackState;
+import android.net.Uri;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import org.exthmui.game.R;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+public class MusicControllerView extends LinearLayout implements View.OnClickListener {
+    private MediaSessionManager mMediaSessionManager;
+    private MediaController mMediaController;
+
+    private TextView mediaTitle;
+    private TextView mediaArtist;
+    private ImageView mediaAlbumImg;
+    private ImageView prevButton;
+    private ImageView nextButton;
+    private ImageView playPauseButton;
+
+    private Context mContext;
+
+    private MediaController.Callback mMediaCallback = new MediaController.Callback() {
+        @Override
+        public void onPlaybackStateChanged(@Nullable PlaybackState state) {
+            super.onPlaybackStateChanged(state);
+            if (state != null) updatePlayPauseStatus(state.getState());
+        }
+
+        @Override
+        public void onSessionDestroyed() {
+            MusicControllerView.this.setVisibility(GONE);
+            super.onSessionDestroyed();
+        }
+
+        @Override
+        public void onMetadataChanged(@Nullable MediaMetadata metadata) {
+            updateMetaData(metadata);
+        }
+    };
+
+    private MediaSessionManager.OnActiveSessionsChangedListener onActiveSessionsChangedListener = new MediaSessionManager.OnActiveSessionsChangedListener() {
+        @Override
+        public void onActiveSessionsChanged(@Nullable List<MediaController> controllers) {
+            if (mMediaController != null) mMediaController.unregisterCallback(mMediaCallback);
+            MusicControllerView.this.setVisibility(GONE);
+            if (controllers == null) return;
+            for (MediaController controller : controllers) {
+                mMediaController = controller;
+                if (getMediaControllerPlaybackState(controller) == PlaybackState.STATE_PLAYING) {
+                    break;
+                }
+            }
+            if (mMediaController != null) {
+                mMediaController.registerCallback(mMediaCallback);
+                mMediaCallback.onMetadataChanged(mMediaController.getMetadata());
+                mMediaCallback.onPlaybackStateChanged(mMediaController.getPlaybackState());
+                MusicControllerView.this.setVisibility(VISIBLE);
+            }
+        }
+    };
+
+    public MusicControllerView(Context context) {
+        this(context, null);
+    }
+
+    public MusicControllerView(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public MusicControllerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public MusicControllerView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+
+        mMediaSessionManager = (MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE);
+        LayoutInflater.from(context).inflate(R.layout.music_control_layout, this, true);
+
+        mContext = context;
+
+        mediaTitle = findViewById(R.id.music_title);
+        mediaArtist = findViewById(R.id.music_artist);
+        mediaAlbumImg = findViewById(R.id.music_cover);
+
+        prevButton = findViewById(R.id.prev_button);
+        nextButton = findViewById(R.id.next_button);
+        playPauseButton = findViewById(R.id.play_pause_button);
+
+        prevButton.setOnClickListener(this);
+        nextButton.setOnClickListener(this);
+        playPauseButton.setOnClickListener(this);
+
+        mMediaSessionManager.addOnActiveSessionsChangedListener(onActiveSessionsChangedListener, null);
+        onActiveSessionsChangedListener.onActiveSessionsChanged(mMediaSessionManager.getActiveSessions(null));
+    }
+
+    private int getMediaControllerPlaybackState(MediaController controller) {
+        if (controller != null) {
+            final PlaybackState playbackState = controller.getPlaybackState();
+            if (playbackState != null) {
+                return playbackState.getState();
+            }
+        }
+        return PlaybackState.STATE_NONE;
+    }
+
+    private void updatePlayPauseStatus(int state) {
+        if (state == PlaybackState.STATE_PLAYING) {
+            playPauseButton.setImageResource(R.drawable.ic_music_pause);
+        } else {
+            playPauseButton.setImageResource(R.drawable.ic_music_play);
+        }
+    }
+
+    private void updateMetaData(MediaMetadata mediaMetadata) {
+        if (mediaMetadata == null) return;
+        mediaTitle.setText(mediaMetadata.getText(MediaMetadata.METADATA_KEY_TITLE));
+        mediaArtist.setText(mediaMetadata.getString(MediaMetadata.METADATA_KEY_ARTIST));
+        // Try to get album cover
+        if (!(setAlbumImgFromBitmap(mediaMetadata.getBitmap(MediaMetadata.METADATA_KEY_ART)) ||
+                setAlbumImgFromBitmap(mediaMetadata.getBitmap(MediaMetadata.METADATA_KEY_ALBUM_ART)) ||
+                setAlbumImgFromUri(mediaMetadata.getString(MediaMetadata.METADATA_KEY_ART_URI)) ||
+                setAlbumImgFromUri(mediaMetadata.getString(MediaMetadata.METADATA_KEY_ALBUM_ART_URI)))) {
+            mediaAlbumImg.setImageResource(R.drawable.default_album_cover);
+        }
+    }
+
+    private boolean setAlbumImgFromBitmap(Bitmap bitmap) {
+        if (bitmap == null) return false;
+        mediaAlbumImg.setImageBitmap(bitmap);
+        return true;
+    }
+
+    private boolean setAlbumImgFromUri(String uri) {
+        try {
+            Uri albumUri = Uri.parse(uri);
+            InputStream is = mContext.getContentResolver().openInputStream(albumUri);
+            if (is != null) {
+                mediaAlbumImg.setImageBitmap(BitmapFactory.decodeStream(is));
+                is.close();
+            }
+        } catch (NullPointerException | IOException e) {
+            e.printStackTrace();
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (mMediaController == null) return;
+        if (v == prevButton) {
+            mMediaController.getTransportControls().skipToPrevious();
+        } else if (v == nextButton) {
+            mMediaController.getTransportControls().skipToNext();
+        } else if (v == playPauseButton) {
+            if (getMediaControllerPlaybackState(mMediaController) == PlaybackState.STATE_PLAYING) {
+                mMediaController.getTransportControls().pause();
+            } else {
+                mMediaController.getTransportControls().play();
+            }
+        }
+    }
+
+    @Override
+    public void onDetachedFromWindow() {
+        mMediaSessionManager.removeOnActiveSessionsChangedListener(onActiveSessionsChangedListener);
+        if (mMediaController != null) mMediaController.unregisterCallback(mMediaCallback);
+        super.onDetachedFromWindow();
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/ui/QuickSettingsView.java b/app/src/main/java/org/exthmui/game/ui/QuickSettingsView.java
new file mode 100644
index 0000000..989654a
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/ui/QuickSettingsView.java
@@ -0,0 +1,61 @@
+package org.exthmui.game.ui;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.util.AttributeSet;
+import android.widget.LinearLayout;
+
+import androidx.annotation.Nullable;
+
+import org.exthmui.game.R;
+import org.exthmui.game.qs.AutoBrightnessTile;
+import org.exthmui.game.qs.DNDTile;
+import org.exthmui.game.qs.DanmakuTile;
+import org.exthmui.game.qs.LockGestureTile;
+import org.exthmui.game.qs.LockHwKeysTile;
+import org.exthmui.game.qs.ScreenCaptureTile;
+import org.exthmui.game.qs.TileBase;
+
+public class QuickSettingsView extends LinearLayout {
+
+    private TileBase[] qsTiles;
+
+    public QuickSettingsView(Context context) {
+        this(context, null);
+    }
+
+    public QuickSettingsView(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public QuickSettingsView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public QuickSettingsView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+
+        this.setDividerDrawable(context.getDrawable(R.drawable.qs_divider));
+        this.setShowDividers(SHOW_DIVIDER_MIDDLE);
+        this.setPadding(0,0, 0,8);
+
+        qsTiles = new TileBase[]{
+                new ScreenCaptureTile(context),
+                new DanmakuTile(context),
+                new DNDTile(context),
+                new LockHwKeysTile(context),
+                new LockGestureTile(context),
+                new AutoBrightnessTile(context)
+        };
+
+        for (TileBase tileBase : qsTiles) {
+            addView(tileBase);
+        }
+    }
+
+    public void setConfig(Bundle config) {
+        for (TileBase tileBase : qsTiles) {
+            tileBase.setConfig(config);
+        }
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/ui/QuickStartAppView.java b/app/src/main/java/org/exthmui/game/ui/QuickStartAppView.java
new file mode 100644
index 0000000..05d2e21
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/ui/QuickStartAppView.java
@@ -0,0 +1,106 @@
+package org.exthmui.game.ui;
+
+import android.app.ActivityOptions;
+import android.app.WindowConfiguration;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.res.Configuration;
+import android.graphics.Rect;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import androidx.annotation.Nullable;
+import androidx.localbroadcastmanager.content.LocalBroadcastManager;
+
+import org.exthmui.game.R;
+import org.exthmui.game.misc.Constants;
+import org.exthmui.game.qs.AppTile;
+
+public class QuickStartAppView extends LinearLayout implements View.OnClickListener {
+
+    private Context mContext;
+    private PackageManager mPackageManager;
+    private ActivityOptions mActivityOptions;
+    private Intent mHideMenuIntent = new Intent(Constants.Broadcasts.BROADCAST_GAMING_MENU_CONTROL).putExtra("cmd", "hide");
+    int left, right, top, bottom;
+
+    public QuickStartAppView(Context context) {
+        this(context, null);
+    }
+
+    public QuickStartAppView(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public QuickStartAppView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public QuickStartAppView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+
+        mContext = context;
+        mPackageManager = mContext.getPackageManager();
+
+        this.setDividerDrawable(context.getDrawable(R.drawable.qs_divider));
+        this.setShowDividers(SHOW_DIVIDER_MIDDLE);
+        this.setPadding(0,0, 0,8);
+        this.setVisibility(GONE);
+
+        mActivityOptions = ActivityOptions.makeBasic();
+        mActivityOptions.setLaunchWindowingMode(WindowConfiguration.WINDOWING_MODE_FREEFORM);
+
+    }
+
+    public void setConfig(Bundle config) {
+        this.removeAllViewsInLayout();
+        this.setVisibility(GONE);
+        String[] apps = config.getStringArray(Constants.ConfigKeys.QUICK_START_APPS);
+        
+        if (apps == null || apps.length == 0) return;
+        this.setVisibility(VISIBLE);
+        for (String app : apps) {
+            AppTile appTile = new AppTile(mContext, app);
+            appTile.setOnClickListener(this);
+            this.addView(appTile);
+        }
+    }
+
+    public void setFloatingButtonCoordinate(int x, int y) {
+        DisplayMetrics m = mContext.getResources().getDisplayMetrics();
+        int width, height;
+        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
+            // 竖屏
+            width = m.widthPixels - 200;
+            height = width * 4 / 3;
+        } else {
+            // 横屏
+            height = m.heightPixels - 200;
+            width = height * 4 / 3;
+        }
+        left = 100;
+        right = left + width;
+        top = 150;
+        bottom = top + height;
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (v instanceof AppTile) {
+            AppTile appTile = (AppTile) v;
+            LocalBroadcastManager.getInstance(mContext).sendBroadcastSync(mHideMenuIntent);
+            Intent startAppIntent = mPackageManager.getLaunchIntentForPackage(appTile.getKey());
+            startAppIntent.addFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
+            startAppIntent.setPackage(null);
+            Rect appWindowRect = new Rect(left, top, right, bottom);
+            mActivityOptions.setLaunchBounds(appWindowRect);
+            mContext.startActivityAsUser(startAppIntent, mActivityOptions.toBundle(), UserHandle.CURRENT);
+
+        }
+    }
+}
diff --git a/app/src/main/java/org/exthmui/game/ui/TimeAndBatteryView.java b/app/src/main/java/org/exthmui/game/ui/TimeAndBatteryView.java
new file mode 100644
index 0000000..33a2ba0
--- /dev/null
+++ b/app/src/main/java/org/exthmui/game/ui/TimeAndBatteryView.java
@@ -0,0 +1,95 @@
+package org.exthmui.game.ui;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.BatteryManager;
+import android.text.format.DateFormat;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.annotation.Nullable;
+
+import org.exthmui.game.R;
+
+import static android.content.Context.BATTERY_SERVICE;
+
+public class TimeAndBatteryView extends LinearLayout {
+
+    private Context mContext;
+
+    private TextView currentTime;
+    private TextView currentDate;
+    private TextView currentBattery;
+
+    private TimeChangeReceiver timeChangeReceiver = new TimeChangeReceiver();
+    private BatteryChangeReceiver batteryChangeReceiver = new BatteryChangeReceiver();
+
+    public TimeAndBatteryView(Context context) {
+        this(context, null);
+    }
+
+    public TimeAndBatteryView(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public TimeAndBatteryView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public TimeAndBatteryView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        mContext = context;
+
+        LayoutInflater.from(context).inflate(R.layout.time_battery_layout, this, true);
+
+        currentBattery = findViewById(R.id.current_battery);
+        currentDate = findViewById(R.id.current_date);
+        currentTime = findViewById(R.id.current_time);
+
+        mContext.registerReceiver(timeChangeReceiver, new IntentFilter(Intent.ACTION_TIME_TICK));
+        mContext.registerReceiver(batteryChangeReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
+        updateTime();
+
+        BatteryManager batteryManager = (BatteryManager) mContext.getSystemService(BATTERY_SERVICE);
+        currentBattery.setText(mContext.getString(R.string.battery_format, batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)));
+
+    }
+
+    private void updateTime() {
+        long sysTime = System.currentTimeMillis();
+        currentDate.setText(DateFormat.format(mContext.getString(R.string.date_format), sysTime));
+        currentTime.setText(DateFormat.format(mContext.getString(R.string.time_format), sysTime));
+    }
+
+    @Override
+    public void onDetachedFromWindow() {
+        mContext.unregisterReceiver(timeChangeReceiver);
+        mContext.unregisterReceiver(batteryChangeReceiver);
+        super.onDetachedFromWindow();
+    }
+
+    private class TimeChangeReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (Intent.ACTION_TIME_TICK.equals(intent.getAction())) {
+                updateTime();
+            }
+        }
+    }
+
+    private class BatteryChangeReceiver extends BroadcastReceiver {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
+                int level=intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);
+                int scale=intent.getIntExtra(BatteryManager.EXTRA_SCALE,0);
+                int percent = (int)(((float)level / scale) * 100);
+                currentBattery.setText(mContext.getString(R.string.battery_format, percent));
+            }
+        }
+    }
+}
diff --git a/app/src/main/java/top/littlefogcat/danmakulib/danmaku/CachedDanmakuViewPool.java b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/CachedDanmakuViewPool.java
new file mode 100644
index 0000000..dff116f
--- /dev/null
+++ b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/CachedDanmakuViewPool.java
@@ -0,0 +1,134 @@
+package top.littlefogcat.danmakulib.danmaku;
+
+import android.util.Log;
+
+import java.util.LinkedList;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import top.littlefogcat.danmakulib.utils.EasyL;
+
+/**
+ * 一个简化版的DanmakuViewPool
+ */
+public class CachedDanmakuViewPool implements Pool<DanmakuView> {
+    private static final String TAG = "CachedDanmakuViewPool";
+
+    /**
+     * 缓存DanmakuView队列。显示已经完毕的DanmakuView会被添加到缓存中进行复用。
+     * 在一定的时间{@link CachedDanmakuViewPool#mKeepAliveTime}过后，没有被访问到的DanmakuView会被回收。
+     */
+    private LinkedList<DanmakuViewWithExpireTime> mCache = new LinkedList<>();
+
+    /**
+     * 缓存存活时间
+     */
+    private long mKeepAliveTime;
+    /**
+     * 定时清理缓存
+     */
+    private ScheduledExecutorService mChecker = Executors.newSingleThreadScheduledExecutor();
+    /**
+     * 创建新DanmakuView的Creator
+     */
+    private ViewCreator<DanmakuView> mCreator;
+    /**
+     * 最大DanmakuView数量。
+     * 这个数量包含了正在显示的DanmakuView和已经显示完毕进入缓存等待复用的DanmakuView之和。
+     */
+    private int mMaxSize;
+    /**
+     * 正在显示的弹幕数量。
+     */
+    private int mInUseSize;
+
+    /**
+     * @param creator 生成一个DanmakuView
+     */
+    CachedDanmakuViewPool(long keepAliveTime, int maxSize, ViewCreator<DanmakuView> creator) {
+        mKeepAliveTime = keepAliveTime;
+        mMaxSize = maxSize;
+        mCreator = creator;
+        mInUseSize = 0;
+
+        scheduleCheckUnusedViews();
+    }
+
+    /**
+     * 每隔一秒检查并清理掉空闲队列中超过一定时间没有被使用的DanmakuView
+     */
+    private void scheduleCheckUnusedViews() {
+        mChecker.scheduleWithFixedDelay(() -> {
+            EasyL.v(TAG, "scheduleCheckUnusedViews: mInUseSize=" + mInUseSize + ", mCacheSize=" + mCache.size());
+            long current = System.currentTimeMillis();
+            while (!mCache.isEmpty()) {
+                DanmakuViewWithExpireTime first = mCache.getFirst();
+                if (current > first.expireTime) {
+                    mCache.remove(first);
+                } else {
+                    break;
+                }
+            }
+        }, 1000, 1000, TimeUnit.MILLISECONDS);
+    }
+
+    @Override
+    public DanmakuView get() {
+        DanmakuView view;
+
+        if (mCache.isEmpty()) { // 缓存中没有View
+            if (mInUseSize >= mMaxSize) {
+                return null;
+            }
+            view = mCreator.create();
+        } else { // 有可用的缓存，从缓存中取
+            view = mCache.poll().danmakuView;
+        }
+
+        view.addOnEnterListener(DanmakuView::clearScroll);
+        view.addOnExitListener(v -> {
+            long expire = System.currentTimeMillis() + mKeepAliveTime;
+            v.restore();
+            DanmakuViewWithExpireTime item = new DanmakuViewWithExpireTime();
+            item.danmakuView = v;
+            item.expireTime = expire;
+            mCache.offer(item);
+            mInUseSize--;
+        });
+        mInUseSize++;
+
+        return view;
+    }
+
+    @Override
+    public void release() {
+        mCache.clear();
+    }
+
+    /**
+     * @return 使用中的DanmakuView和缓存中的DanmakuView数量之和
+     */
+    @Override
+    public int count() {
+        return mCache.size() + mInUseSize;
+    }
+
+    @Override
+    public void setMaxSize(int max) {
+        mMaxSize = max;
+    }
+
+    /**
+     * 一个包裹类，保存一个DanmakuView和它的过期时间。
+     */
+    private class DanmakuViewWithExpireTime {
+        private DanmakuView danmakuView; // 缓存的DanmakuView
+        private long expireTime; // 超过这个时间没有被访问的缓存将被丢弃
+    }
+
+    public interface ViewCreator<T> {
+        T create();
+    }
+
+}
diff --git a/app/src/main/java/top/littlefogcat/danmakulib/danmaku/Danmaku.java b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/Danmaku.java
new file mode 100644
index 0000000..aaca739
--- /dev/null
+++ b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/Danmaku.java
@@ -0,0 +1,40 @@
+package top.littlefogcat.danmakulib.danmaku;
+
+import android.graphics.Color;
+
+/**
+ * Created by LittleFogCat.
+ */
+
+public class Danmaku {
+    public static final int DEFAULT_TEXT_SIZE = 24;
+
+    public String text;// 文字
+    public int size = DEFAULT_TEXT_SIZE;// 字号
+    public Mode mode = Mode.scroll;// 模式：滚动、顶部、底部
+    public int color = Color.WHITE;// 默认白色
+
+    public enum Mode {
+        scroll, top, bottom
+    }
+
+    public Danmaku() {
+    }
+
+    public Danmaku(String text, int textSize, Mode mode, int color) {
+        this.text = text;
+        this.size = textSize;
+        this.mode = mode;
+        this.color = color;
+    }
+
+    @Override
+    public String toString() {
+        return "Danmaku{" +
+                "text='" + text + '\'' +
+                ", textSize=" + size +
+                ", mode=" + mode +
+                ", color='" + color + '\'' +
+                '}';
+    }
+}
diff --git a/app/src/main/java/top/littlefogcat/danmakulib/danmaku/DanmakuManager.java b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/DanmakuManager.java
new file mode 100644
index 0000000..b5c67af
--- /dev/null
+++ b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/DanmakuManager.java
@@ -0,0 +1,278 @@
+package top.littlefogcat.danmakulib.danmaku;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.util.TypedValue;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import org.exthmui.game.misc.Constants;
+
+import java.lang.ref.WeakReference;
+
+import top.littlefogcat.danmakulib.utils.EasyL;
+import top.littlefogcat.danmakulib.utils.ScreenUtil;
+
+/**
+ * 用法示例：
+ * DanmakuManager dm = DanmakuManager.getInstance();
+ * dm.init(getContext());
+ * dm.show(new Danmaku("test"));
+ * <p>
+ * Created by LittleFogCat.
+ */
+@SuppressWarnings("unused")
+public class DanmakuManager {
+    private static final String TAG = DanmakuManager.class.getSimpleName();
+    private static final int RESULT_OK = 0;
+    private static final int RESULT_NULL_ROOT_VIEW = 1;
+    private static final int RESULT_FULL_POOL = 2;
+    private static final int TOO_MANY_DANMAKU = 2;
+
+    private static DanmakuManager sInstance;
+
+    /**
+     * 弹幕容器
+     */
+    WeakReference<FrameLayout> mDanmakuContainer;
+    /**
+     * 弹幕池
+     */
+    private Pool<DanmakuView> mDanmakuViewPool;
+
+    private Config mConfig;
+
+    private DanmakuPositionCalculator mPositionCal;
+
+    private DanmakuManager() {
+    }
+
+    public static DanmakuManager getInstance() {
+        if (sInstance == null) {
+            sInstance = new DanmakuManager();
+        }
+        return sInstance;
+    }
+
+    /**
+     * 初始化。在使用之前必须调用该方法。
+     */
+    public void init(Context context, FrameLayout container) {
+        if (mDanmakuViewPool == null) {
+            mDanmakuViewPool = new CachedDanmakuViewPool(
+                    60000, // 缓存存活时间：60秒
+                    100, // 最大弹幕数：100
+                    () -> DanmakuViewFactory.createDanmakuView(context, container));
+        }
+        setDanmakuContainer(container);
+        ScreenUtil.init(context);
+
+        mConfig = new Config();
+        mPositionCal = new DanmakuPositionCalculator(this);
+    }
+
+    public Config getConfig() {
+        if (mConfig == null) {
+            mConfig = new Config();
+        }
+        return mConfig;
+    }
+
+    private DanmakuPositionCalculator getPositionCalculator() {
+        if (mPositionCal == null) {
+            mPositionCal = new DanmakuPositionCalculator(this);
+        }
+        return mPositionCal;
+    }
+
+    public void setDanmakuViewPool(Pool<DanmakuView> pool) {
+        if (mDanmakuViewPool != null) {
+            mDanmakuViewPool.release();
+        }
+        mDanmakuViewPool = pool;
+    }
+
+    /**
+     * 设置允许同时出现最多的弹幕数，如果屏幕上显示的弹幕数超过该数量，那么新出现的弹幕将被丢弃，
+     * 直到有旧的弹幕消失。
+     *
+     * @param max 同时出现的最多弹幕数，-1无限制
+     */
+    public void setMaxDanmakuSize(int max) {
+        if (mDanmakuViewPool == null) {
+            return;
+        }
+        mDanmakuViewPool.setMaxSize(max);
+    }
+
+    /**
+     * 设置弹幕的容器，所有的弹幕都在这里面显示
+     */
+    public void setDanmakuContainer(final FrameLayout root) {
+        if (root == null) {
+            throw new NullPointerException("Danmaku container cannot be null!");
+        }
+        mDanmakuContainer = new WeakReference<>(root);
+    }
+
+    /**
+     * 发送一条弹幕
+     */
+    public int send(Danmaku danmaku) {
+        if (mDanmakuViewPool == null) {
+            throw new NullPointerException("Danmaku view pool is null. Did you call init() first?");
+        }
+
+        DanmakuView view = mDanmakuViewPool.get();
+
+        if (view == null) {
+            EasyL.w(TAG, "show: Too many danmaku, discard");
+            return RESULT_FULL_POOL;
+        }
+        if (mDanmakuContainer == null || mDanmakuContainer.get() == null) {
+            EasyL.w(TAG, "show: Root view is null.");
+            return RESULT_NULL_ROOT_VIEW;
+        }
+
+        view.setDanmaku(danmaku);
+
+        // 字体大小
+        int textSize = danmaku.size;
+        view.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
+
+        // 字体颜色
+        try {
+            view.setTextColor(danmaku.color);
+        } catch (Exception e) {
+            e.printStackTrace();
+            view.setTextColor(Color.WHITE);
+        }
+
+        // 计算弹幕距离顶部的位置
+        DanmakuPositionCalculator dpc = getPositionCalculator();
+        int marginTop = dpc.getMarginTop(view);
+
+        if (marginTop == -1) {
+            // 屏幕放不下了
+            EasyL.d(TAG, "send: screen is full, too many danmaku [" + danmaku + "]");
+            return TOO_MANY_DANMAKU;
+        }
+        FrameLayout.LayoutParams p = (FrameLayout.LayoutParams) view.getLayoutParams();
+        if (p == null) {
+            p = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+        }
+        p.topMargin = marginTop;
+        view.setLayoutParams(p);
+        view.setMinHeight((int) (getConfig().getLineHeight() * 1.35));
+        int duration = getDisplayDuration(danmaku);
+        if (danmaku.mode == Danmaku.Mode.scroll) {
+            duration = (view.getTextLength() + dpc.getParentWidth()) / duration * 1000;
+        }
+        view.show(mDanmakuContainer.get(), duration);
+        return RESULT_OK;
+    }
+
+    /**
+     * @return 返回这个弹幕显示时长 (对于滚动弹幕返回速度)
+     */
+    int getDisplayDuration(Danmaku danmaku) {
+        Config config = getConfig();
+        int duration;
+        switch (danmaku.mode) {
+            case top:
+                duration = config.getDurationTop();
+                break;
+            case bottom:
+                duration = config.getDurationBottom();
+                break;
+            case scroll:
+            default:
+                duration = config.getScrollSpeed();
+                break;
+        }
+        return duration;
+    }
+
+    /**
+     * 一些配置
+     */
+    public static class Config {
+
+        /**
+         * 行高，单位px
+         */
+        private int lineHeight;
+
+        /**
+         * 滚动弹幕速度 (px/s)
+         */
+        private int scrollSpeed;
+        /**
+         * 顶部弹幕显示时长
+         */
+        private int durationTop;
+        /**
+         * 底部弹幕的显示时长
+         */
+        private int durationBottom;
+
+        /**
+         * 滚动弹幕的最大行数
+         */
+        private int maxScrollLine;
+
+        public int getLineHeight() {
+            return lineHeight;
+        }
+
+        public void setLineHeight(int lineHeight) {
+            this.lineHeight = lineHeight;
+        }
+
+        public int getMaxScrollLine() {
+            return maxScrollLine;
+        }
+
+        public int getScrollSpeed() {
+            return scrollSpeed;
+        }
+
+        public void setScrollSpeed(int durationScroll) {
+            this.scrollSpeed = durationScroll;
+        }
+
+        public int getDurationTop() {
+            if (durationTop == 0) {
+                durationTop = 5000;
+            }
+            return durationTop;
+        }
+
+        public void setDurationTop(int durationTop) {
+            this.durationTop = durationTop;
+        }
+
+        public int getDurationBottom() {
+            if (durationBottom == 0) {
+                durationBottom = 5000;
+            }
+            return durationBottom;
+        }
+
+        public void setDurationBottom(int durationBottom) {
+            this.durationBottom = durationBottom;
+        }
+
+        public int getMaxDanmakuLine() {
+            if (maxScrollLine == 0) {
+                maxScrollLine = 12;
+            }
+            return maxScrollLine;
+        }
+
+        public void setMaxScrollLine(int maxScrollLine) {
+            this.maxScrollLine = maxScrollLine;
+        }
+    }
+
+}
diff --git a/app/src/main/java/top/littlefogcat/danmakulib/danmaku/DanmakuPositionCalculator.java b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/DanmakuPositionCalculator.java
new file mode 100644
index 0000000..d5ef334
--- /dev/null
+++ b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/DanmakuPositionCalculator.java
@@ -0,0 +1,168 @@
+package top.littlefogcat.danmakulib.danmaku;
+
+import android.view.ViewGroup;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import top.littlefogcat.danmakulib.utils.EasyL;
+
+/**
+ * 用于计算弹幕位置，来保证弹幕不重叠又不浪费空间。
+ */
+class DanmakuPositionCalculator {
+    private static final String TAG = "DanPositionCalculator";
+    private DanmakuManager mDanmakuManager;
+    private List<DanmakuView> mLastDanmakus = new ArrayList<>();// 保存每一行最后一个弹幕消失的时间
+    private boolean[] mTops;
+    private boolean[] mBottoms;
+
+    DanmakuPositionCalculator(DanmakuManager danmakuManager) {
+        mDanmakuManager = danmakuManager;
+
+        int maxLine = danmakuManager.getConfig().getMaxDanmakuLine();
+        mTops = new boolean[maxLine];
+        mBottoms = new boolean[maxLine];
+    }
+
+    private int getLineHeightWithPadding() {
+        return (int) (1.35f * mDanmakuManager.getConfig().getLineHeight());
+    }
+
+    int getMarginTop(DanmakuView view) {
+        switch (view.getDanmaku().mode) {
+            case scroll:
+                return getScrollY(view);
+            case top:
+                return getTopY(view);
+            case bottom:
+                return getBottomY(view);
+        }
+        return -1;
+    }
+
+    private int getScrollY(DanmakuView view) {
+        if (mLastDanmakus.size() == 0) {
+            mLastDanmakus.add(view);
+            return 0;
+        }
+
+        int i;
+        for (i = 0; i < mLastDanmakus.size(); i++) {
+            DanmakuView last = mLastDanmakus.get(i);
+            int timeDisappear = calTimeDisappear(last); // 最后一条弹幕还需多久消失
+            int timeArrive = calTimeArrive(view); // 这条弹幕需要多久到达屏幕边缘
+            boolean isFullyShown = isFullyShown(last);
+            EasyL.d(TAG, "getScrollY: 行: " + i + ", 消失时间: " + timeDisappear + ", 到达时间: " + timeArrive + ", isFullyshown: " + isFullyShown);
+            if (timeDisappear <= timeArrive && isFullyShown) {
+                // 如果最后一个弹幕在这个弹幕到达之前消失，并且最后一个字已经显示完毕，
+                // 那么新的弹幕就可以在这一行显示
+                mLastDanmakus.set(i, view);
+                return i * getLineHeightWithPadding();
+            }
+        }
+        int maxLine = mDanmakuManager.getConfig().getMaxDanmakuLine();
+        if (maxLine == 0 || i < maxLine) {
+            mLastDanmakus.add(view);
+            return i * getLineHeightWithPadding();
+        }
+
+        return -1;
+    }
+
+    private int getTopY(DanmakuView view) {
+        for (int i = 0; i < mTops.length; i++) {
+            boolean isShowing = mTops[i];
+            if (!isShowing) {
+                final int finalI = i;
+                mTops[finalI] = true;
+                view.addOnExitListener(view1 -> mTops[finalI] = false);
+                return i * getLineHeightWithPadding();
+            }
+        }
+        return -1;
+    }
+
+    private int getBottomY(DanmakuView view) {
+        for (int i = 0; i < mBottoms.length; i++) {
+            boolean isShowing = mBottoms[i];
+            if (!isShowing) {
+                final int finalI = i;
+                mBottoms[finalI] = true;
+                view.addOnExitListener(view1 -> mBottoms[finalI] = false);
+                return getParentHeight() - (i + 1) * getLineHeightWithPadding();
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * 这条弹幕是否已经全部出来了。如果没有的话，
+     * 后面的弹幕不能出来，否则就重叠了。
+     */
+    private boolean isFullyShown(DanmakuView view) {
+        if (view == null) {
+            return true;
+        }
+        int scrollX = view.getScrollX();
+        int textLength = view.getTextLength();
+        EasyL.d(TAG, "isFullyShown? scrollX=" + scrollX + ", textLength=" + textLength + ", parentWidth=" + getParentWidth());
+        return textLength - scrollX < getParentWidth();
+    }
+
+    /**
+     * 这条弹幕还有多少毫秒彻底消失。
+     */
+    private int calTimeDisappear(DanmakuView view) {
+        if (view == null) {
+            return 0;
+        }
+        float speed = calSpeed(view);
+        int scrollX = view.getScrollX();
+        int textLength = view.getTextLength();
+        int wayToGo = textLength - scrollX;
+
+        return (int) (wayToGo / speed);
+    }
+
+    /**
+     * 这条弹幕还要多少毫秒抵达屏幕边缘。
+     */
+    private int calTimeArrive(DanmakuView view) {
+        float speed = calSpeed(view);
+        int wayToGo = getParentWidth();
+        return (int) (wayToGo / speed);
+    }
+
+    /**
+     * 这条弹幕的速度。单位：px/ms
+     */
+    private float calSpeed(DanmakuView view) {
+        int textLength = view.getTextLength();
+        int width = getParentWidth();
+        float s = textLength + width + 0.0f;
+        int t = mDanmakuManager.getDisplayDuration(view.getDanmaku());
+        if (view.getDanmaku().mode == Danmaku.Mode.scroll) {
+            return t / 1000.0f;
+        } else {
+            return s / t;
+        }
+    }
+
+    public int getParentHeight() {
+        ViewGroup parent = mDanmakuManager.mDanmakuContainer.get();
+        if (parent == null || parent.getHeight() == 0) {
+            return 1080;
+        }
+        return parent.getHeight();
+    }
+
+    public int getParentWidth() {
+        ViewGroup parent = mDanmakuManager.mDanmakuContainer.get();
+        if (parent == null || parent.getWidth() == 0) {
+            return 1920;
+        }
+        return parent.getWidth();
+    }
+
+}
diff --git a/app/src/main/java/top/littlefogcat/danmakulib/danmaku/DanmakuView.java b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/DanmakuView.java
new file mode 100644
index 0000000..58f467f
--- /dev/null
+++ b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/DanmakuView.java
@@ -0,0 +1,236 @@
+package top.littlefogcat.danmakulib.danmaku;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.ViewGroup;
+import android.view.animation.LinearInterpolator;
+import android.widget.Scroller;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import top.littlefogcat.danmakulib.utils.ScreenUtil;
+
+/**
+ * DanmakuView的基类，继承自TextView，一个弹幕对应一个DanmakuView。
+ * 这里实现了一些通用的功能。
+ * <p>
+ * Created by LittleFogCat.
+ */
+@SuppressWarnings("unused")
+public class DanmakuView extends TextView {
+
+    /**
+     * 弹幕内容
+     */
+    private Danmaku mDanmaku;
+
+    /**
+     * 监听
+     */
+    private ListenerInfo mListenerInfo;
+
+    private class ListenerInfo {
+        private ArrayList<OnEnterListener> mOnEnterListeners;
+
+        private List<OnExitListener> mOnExitListener;
+    }
+
+    /**
+     * 弹幕进场时的监听
+     */
+    public interface OnEnterListener {
+        void onEnter(DanmakuView view);
+    }
+
+    /**
+     * 弹幕离场后的监听
+     */
+    public interface OnExitListener {
+        void onExit(DanmakuView view);
+    }
+
+    /**
+     * 显示时长 ms
+     */
+    private int mDuration;
+
+    public DanmakuView(Context context) {
+        super(context);
+    }
+
+    public DanmakuView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public DanmakuView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+
+    /**
+     * 设置弹幕内容
+     */
+    public void setDanmaku(Danmaku danmaku) {
+        mDanmaku = danmaku;
+        setText(danmaku.text);
+        switch (danmaku.mode) {
+            case top:
+            case bottom:
+                setGravity(Gravity.CENTER);
+                break;
+            case scroll:
+            default:
+                setGravity(Gravity.START | Gravity.CENTER_VERTICAL);
+                break;
+        }
+    }
+
+    public Danmaku getDanmaku() {
+        return mDanmaku;
+    }
+
+    /**
+     * 显示弹幕
+     */
+    public void show(final ViewGroup parent, int duration) {
+        mDuration = duration;
+        switch (mDanmaku.mode) {
+            case top:
+            case bottom:
+                showFixedDanmaku(parent, duration);
+                break;
+            case scroll:
+            default:
+                showScrollDanmaku(parent, duration);
+                break;
+        }
+
+        if (hasOnEnterListener()) {
+            for (OnEnterListener listener : getListenerInfo().mOnEnterListeners) {
+                listener.onEnter(this);
+            }
+        }
+        postDelayed(() -> {
+            setVisibility(GONE);
+            if (hasOnExitListener()) {
+                for (OnExitListener listener : getListenerInfo().mOnExitListener) {
+                    listener.onExit(DanmakuView.this);
+                }
+            }
+            parent.removeView(DanmakuView.this);
+        }, duration);
+    }
+
+    private void showScrollDanmaku(ViewGroup parent, int duration) {
+        int screenWidth = ScreenUtil.getScreenWidth();
+        int textLength = getTextLength();
+        scrollTo(-screenWidth, 0);
+        parent.addView(this);
+        smoothScrollTo(textLength, 0, duration);
+    }
+
+    private void showFixedDanmaku(ViewGroup parent, int duration) {
+        setGravity(Gravity.CENTER);
+        parent.addView(this);
+    }
+
+    private ListenerInfo getListenerInfo() {
+        if (mListenerInfo == null) {
+            mListenerInfo = new ListenerInfo();
+        }
+        return mListenerInfo;
+    }
+
+    public void addOnEnterListener(OnEnterListener l) {
+        ListenerInfo li = getListenerInfo();
+        if (li.mOnEnterListeners == null) {
+            li.mOnEnterListeners = new ArrayList<>();
+        }
+        if (!li.mOnEnterListeners.contains(l)) {
+            li.mOnEnterListeners.add(l);
+        }
+    }
+
+    public void clearOnEnterListeners() {
+        ListenerInfo li = getListenerInfo();
+        if (li.mOnEnterListeners == null || li.mOnEnterListeners.size() == 0) {
+            return;
+        }
+        li.mOnEnterListeners.clear();
+    }
+
+    public void addOnExitListener(OnExitListener l) {
+        ListenerInfo li = getListenerInfo();
+        if (li.mOnExitListener == null) {
+            li.mOnExitListener = new CopyOnWriteArrayList<>();
+        }
+        if (!li.mOnExitListener.contains(l)) {
+            li.mOnExitListener.add(l);
+        }
+    }
+
+    public void clearOnExitListeners() {
+        ListenerInfo li = getListenerInfo();
+        if (li.mOnExitListener == null || li.mOnExitListener.size() == 0) {
+            return;
+        }
+        li.mOnExitListener.clear();
+    }
+
+    public boolean hasOnEnterListener() {
+        ListenerInfo li = getListenerInfo();
+        return li.mOnEnterListeners != null && li.mOnEnterListeners.size() != 0;
+    }
+
+    public boolean hasOnExitListener() {
+        ListenerInfo li = getListenerInfo();
+        return li.mOnExitListener != null && li.mOnExitListener.size() != 0;
+    }
+
+    public int getTextLength() {
+        return (int) getPaint().measureText(getText().toString());
+    }
+
+    public int getDuration() {
+        return mDuration;
+    }
+
+    /**
+     * 恢复初始状态
+     */
+    public void restore() {
+        clearOnEnterListeners();
+        clearOnExitListeners();
+        setVisibility(VISIBLE);
+    }
+
+    public void clearScroll() {
+        setScrollX(0);
+        setScrollY(0);
+    }
+
+    private Scroller mScroller;
+
+    public void smoothScrollTo(int x, int y, int duration) {
+        if (mScroller == null) {
+            mScroller = new Scroller(getContext(), new LinearInterpolator());
+            setScroller(mScroller);
+        }
+
+        int sx = getScrollX();
+        int sy = getScrollY();
+        mScroller.startScroll(sx, sy, x - sx, y - sy, duration);
+    }
+
+    @Override
+    public void computeScroll() {
+        if (mScroller != null && mScroller.computeScrollOffset()) {
+//            EasyL.v(TAG, "computeScroll: " + mScroller.getCurrX());
+            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
+            postInvalidate();
+        }
+    }
+}
diff --git a/app/src/main/java/top/littlefogcat/danmakulib/danmaku/DanmakuViewFactory.java b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/DanmakuViewFactory.java
new file mode 100644
index 0000000..12ba3de
--- /dev/null
+++ b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/DanmakuViewFactory.java
@@ -0,0 +1,24 @@
+package top.littlefogcat.danmakulib.danmaku;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.ViewGroup;
+
+import org.exthmui.game.R;
+
+/**
+ * Created by LittleFogCat.
+ */
+class DanmakuViewFactory {
+    @SuppressLint("InflateParams")
+    static DanmakuView createDanmakuView(Context context) {
+        return (DanmakuView) LayoutInflater.from(context)
+                .inflate(R.layout.danmaku_view, null, false);
+    }
+
+    static DanmakuView createDanmakuView(Context context, ViewGroup parent) {
+        return (DanmakuView) LayoutInflater.from(context)
+                .inflate(R.layout.danmaku_view, parent, false);
+    }
+}
diff --git a/app/src/main/java/top/littlefogcat/danmakulib/danmaku/Pool.java b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/Pool.java
new file mode 100644
index 0000000..5f356e7
--- /dev/null
+++ b/app/src/main/java/top/littlefogcat/danmakulib/danmaku/Pool.java
@@ -0,0 +1,23 @@
+package top.littlefogcat.danmakulib.danmaku;
+
+/**
+ * Created by LittleFogCat.
+ */
+public interface Pool<T> {
+    /**
+     * 从缓存中获取一个T的实例
+     */
+    T get();
+
+    /**
+     * 释放缓存
+     */
+    void release();
+
+    /**
+     * @return 缓存中T实例的数量
+     */
+    int count();
+
+    void setMaxSize(int max);
+}
diff --git a/app/src/main/java/top/littlefogcat/danmakulib/utils/EasyL.java b/app/src/main/java/top/littlefogcat/danmakulib/utils/EasyL.java
new file mode 100644
index 0000000..84df5ac
--- /dev/null
+++ b/app/src/main/java/top/littlefogcat/danmakulib/utils/EasyL.java
@@ -0,0 +1,54 @@
+package top.littlefogcat.danmakulib.utils;
+
+import android.util.Log;
+
+/**
+ * Created by LittleFogCat.
+ */
+public class EasyL {
+    private static boolean sEnabled = false;
+
+    public static void setEnabled(boolean enabled) {
+        sEnabled = enabled;
+    }
+
+    public static void v(String tag, String msg) {
+        if (sEnabled) {
+            Log.v(tag, msg);
+        }
+    }
+
+    public static void d(String tag, String msg) {
+        if (sEnabled) {
+            Log.d(tag, msg);
+        }
+    }
+
+    public static void i(String tag, String msg) {
+        if (sEnabled) {
+            Log.i(tag, msg);
+        }
+    }
+
+    public static void w(String tag, String msg) {
+        if (sEnabled) {
+            Log.w(tag, msg);
+        }
+    }
+
+    public static void e(String tag, String msg) {
+        if (sEnabled) {
+            Log.e(tag, msg);
+        }
+    }
+
+    public static void d(String tag, Object... args) {
+        if (sEnabled) {
+            StringBuilder msg = new StringBuilder();
+            for (Object arg : args) {
+                msg.append(arg).append(" ");
+            }
+            Log.d(tag, msg.toString());
+        }
+    }
+}
diff --git a/app/src/main/java/top/littlefogcat/danmakulib/utils/ScreenUtil.java b/app/src/main/java/top/littlefogcat/danmakulib/utils/ScreenUtil.java
new file mode 100644
index 0000000..0c461a3
--- /dev/null
+++ b/app/src/main/java/top/littlefogcat/danmakulib/utils/ScreenUtil.java
@@ -0,0 +1,138 @@
+package top.littlefogcat.danmakulib.utils;
+
+import android.content.Context;
+import android.util.DisplayMetrics;
+
+/**
+ * Created by LittleFogCat.
+ * <p>
+ * 自动适配屏幕像素的工具类。
+ * 需要先调用{@link ScreenUtil#init(Context)}才能正常使用。如果屏幕旋转，
+ * 那么需要再次调用{@link ScreenUtil#init(Context)}以更新。
+ */
+
+@SuppressWarnings({"unused", "WeakerAccess", "SuspiciousNameCombination"})
+public class ScreenUtil {
+    private static final String TAG = "ScreenUtil";
+    /**
+     * 屏幕宽度，在调用init()之后通过{@link ScreenUtil#getScreenWidth()}获取
+     */
+    private static int sScreenWidth = 1920;
+
+    /**
+     * 屏幕高度，在调用init()之后通过{@link ScreenUtil#getScreenHeight()} ()}获取
+     */
+    private static int sScreenHeight = 1080;
+
+    /**
+     * 设计宽度。用于{@link ScreenUtil#autoWidth(int)}
+     */
+    private static int sDesignWidth = 1080;
+
+    /**
+     * 设计高度。用于{@link ScreenUtil#autoHeight(int)} (int)}
+     */
+    private static int sDesignHeight = 1920;
+
+    /**
+     * 初始化ScreenUtil。在屏幕旋转之后，需要再次调用这个方法，否则计算将会出错。
+     */
+    public static void init(Context context) {
+        DisplayMetrics m = context.getResources().getDisplayMetrics();
+
+        sScreenWidth = m.widthPixels;
+        sScreenHeight = m.heightPixels;
+
+        if (sDesignWidth > sDesignHeight != sScreenWidth > sScreenHeight) {
+            int tmp = sDesignWidth;
+            sDesignWidth = sDesignHeight;
+            sDesignHeight = tmp;
+        }
+    }
+
+    public static void setDesignWidthAndHeight(int width, int height) {
+        sDesignWidth = width;
+        sDesignHeight = height;
+    }
+
+    /**
+     * 根据实际屏幕和设计图的比例，自动缩放像素大小。
+     * <p>
+     * 例如设计图大小是1920像素x1080像素，实际屏幕是2560像素x1440像素，那么对于一个设计图中100x100像素的方形，
+     * 实际屏幕中将会缩放为133像素x133像素。这有可能导致图形的失真（当实际的横竖比和设计图不同时）
+     *
+     * @param origin 设计图上的像素大小
+     * @return 实际屏幕中的尺寸
+     */
+    public static int autoSize(int origin) {
+        return autoWidth(origin);
+    }
+
+    /**
+     * 对于在横屏和竖屏下尺寸不同的物体，分别给出设计图的像素，返回实际屏幕中应有的像素。
+     *
+     * @param land 在横屏设计图中的像素大小
+     * @param port 在竖屏设计图中的像素大小
+     */
+    public static int autoSize(int land, int port) {
+        return isPortrait() ? autoSize(port) : autoSize(land);
+    }
+
+    /**
+     * 根据屏幕分辨率自适应宽度。
+     *
+     * @param origin 设计图中的宽度，像素
+     * @return 实际屏幕中的宽度，像素
+     */
+    public static int autoWidth(int origin) {
+        if (sScreenWidth == 0 || sDesignWidth == 0) {
+            return origin;
+        }
+        int autoSize = origin * sScreenWidth / sDesignWidth;
+        if (origin != 0 && autoSize == 0) {
+            return 1;
+        }
+        return autoSize;
+    }
+
+    /**
+     * 根据屏幕分辨率自适应高度
+     *
+     * @param origin 设计图中的高度，像素
+     * @return 实际屏幕中的高度，像素
+     */
+    public static int autoHeight(int origin) {
+        if (sScreenHeight == 0 || sDesignHeight == 0) {
+            return origin;
+        }
+        int auto = origin * sScreenHeight / sDesignHeight;
+        if (origin != 0 && auto == 0) {
+            return 1;
+        }
+        return auto;
+    }
+
+    public static int getScreenWidth() {
+        return sScreenWidth;
+    }
+
+    public static void setScreenWidth(int w) {
+        sScreenWidth = w;
+    }
+
+    public static int getScreenHeight() {
+        return sScreenHeight;
+    }
+
+    public static void setScreenHeight(int h) {
+        sScreenHeight = h;
+    }
+
+    /**
+     * 是否是竖屏
+     */
+    public static boolean isPortrait() {
+        return getScreenHeight() > getScreenWidth();
+    }
+
+}
diff --git a/app/src/main/privapp_whitelist_org.exthmui.game.xml b/app/src/main/privapp_whitelist_org.exthmui.game.xml
new file mode 100644
index 0000000..a7cb2fb
--- /dev/null
+++ b/app/src/main/privapp_whitelist_org.exthmui.game.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+     Copyright (C) 2017-2020 The LineageOS Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<permissions>
+    <privapp-permissions package="org.exthmui.game">
+        <permission name="android.permission.SYSTEM_ALERT_WINDOW"/>
+        <permission name="android.permission.MEDIA_CONTENT_CONTROL"/>
+        <permission name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
+    </privapp-permissions>
+</permissions>
diff --git a/app/src/main/res/color/qs_background_colors.xml b/app/src/main/res/color/qs_background_colors.xml
new file mode 100644
index 0000000..bb7c365
--- /dev/null
+++ b/app/src/main/res/color/qs_background_colors.xml
@@ -0,0 +1,4 @@
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:color="@*android:color/accent_device_default_light" android:state_selected="true" />
+    <item android:color="@color/gamingMenuBackground" android:state_selected="false" />
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/default_album_cover.xml b/app/src/main/res/drawable/default_album_cover.xml
new file mode 100644
index 0000000..014e40d
--- /dev/null
+++ b/app/src/main/res/drawable/default_album_cover.xml
@@ -0,0 +1,8 @@
+<vector android:height="96dp" android:tint="?attr/colorControlNormal"
+    android:viewportHeight="24" android:viewportWidth="24"
+    android:width="96dp" xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@android:color/black" android:fillAlpha="200"
+        android:pathData="M0,0 V96 H96 V0 H0" />
+
+    <path android:fillColor="@android:color/white" android:pathData="M12,3v10.55c-0.59,-0.34 -1.27,-0.55 -2,-0.55 -2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4V7h4V3h-6z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_game_button.xml b/app/src/main/res/drawable/ic_game_button.xml
new file mode 100644
index 0000000..c8e4320
--- /dev/null
+++ b/app/src/main/res/drawable/ic_game_button.xml
@@ -0,0 +1,17 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108">
+  <path
+      android:fillColor="#55000000"
+      android:pathData="M4,54 A50,50 0 1 0 4,53.99999"/>
+  <group android:scaleX="2.94408"
+      android:scaleY="2.94408"
+      android:translateX="18.67104"
+      android:translateY="18.67104">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M15,7.5V2H9v5.5l3,3 3,-3zM7.5,9H2v6h5.5l3,-3 -3,-3zM9,16.5V22h6v-5.5l-3,-3 -3,3zM16.5,9l-3,3 3,3H22V9h-5.5z"/>
+  </group>
+</vector>
diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..fcaf719
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<vector
+    android:height="108dp"
+    android:width="108dp"
+    android:viewportHeight="108"
+    android:viewportWidth="108"
+    xmlns:android="http://schemas.android.com/apk/res/android">
+    <path android:fillColor="@*android:color/accent_device_default_light"
+          android:pathData="M0,0h108v108h-108z"/>
+    <path android:fillColor="#00000000" android:pathData="M9,0L9,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,0L19,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M29,0L29,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M39,0L39,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M49,0L49,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M59,0L59,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M69,0L69,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M79,0L79,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M89,0L89,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M99,0L99,108"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,9L108,9"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,19L108,19"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,29L108,29"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,39L108,39"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,49L108,49"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,59L108,59"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,69L108,69"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,79L108,79"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,89L108,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M0,99L108,99"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,29L89,29"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,39L89,39"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,49L89,49"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,59L89,59"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,69L89,69"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M19,79L89,79"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M29,19L29,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M39,19L39,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M49,19L49,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M59,19L59,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M69,19L69,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+    <path android:fillColor="#00000000" android:pathData="M79,19L79,89"
+          android:strokeColor="#33FFFFFF" android:strokeWidth="0.8"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml
new file mode 100644
index 0000000..9fce646
--- /dev/null
+++ b/app/src/main/res/drawable/ic_launcher_foreground.xml
@@ -0,0 +1,15 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108"
+    android:tint="#FFFFFF">
+  <group android:scaleX="2.00448"
+      android:scaleY="2.00448"
+      android:translateX="29.94624"
+      android:translateY="29.94624">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M15,7.5V2H9v5.5l3,3 3,-3zM7.5,9H2v6h5.5l3,-3 -3,-3zM9,16.5V22h6v-5.5l-3,-3 -3,3zM16.5,9l-3,3 3,3H22V9h-5.5z"/>
+  </group>
+</vector>
diff --git a/app/src/main/res/drawable/ic_music_next.xml b/app/src/main/res/drawable/ic_music_next.xml
new file mode 100644
index 0000000..4fff247
--- /dev/null
+++ b/app/src/main/res/drawable/ic_music_next.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_music_pause.xml b/app/src/main/res/drawable/ic_music_pause.xml
new file mode 100644
index 0000000..13d6d2e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_music_pause.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_music_play.xml b/app/src/main/res/drawable/ic_music_play.xml
new file mode 100644
index 0000000..13c137a
--- /dev/null
+++ b/app/src/main/res/drawable/ic_music_play.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M8,5v14l11,-7z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_music_previous.xml b/app/src/main/res/drawable/ic_music_previous.xml
new file mode 100644
index 0000000..1805b7d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_music_previous.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M6,6h2v12L6,18zM9.5,12l8.5,6L18,6z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_qs_auto_brightness.xml b/app/src/main/res/drawable/ic_qs_auto_brightness.xml
new file mode 100644
index 0000000..5d6c10e
--- /dev/null
+++ b/app/src/main/res/drawable/ic_qs_auto_brightness.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24"
+    android:tint="?attr/colorControlNormal">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M10.85,12.65h2.3L12,9l-1.15,3.65zM20,8.69V4h-4.69L12,0.69 8.69,4H4v4.69L0.69,12 4,15.31V20h4.69L12,23.31 15.31,20H20v-4.69L23.31,12 20,8.69zM14.3,16l-0.7,-2h-3.2l-0.7,2H7.8L11,7h2l3.2,9h-1.9z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_qs_danmaku.xml b/app/src/main/res/drawable/ic_qs_danmaku.xml
new file mode 100644
index 0000000..c940942
--- /dev/null
+++ b/app/src/main/res/drawable/ic_qs_danmaku.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2z M16,8H4V6H16 M19,11.5H8V9.5H19 M24,15H14V13H24"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_qs_disable_gesture.xml b/app/src/main/res/drawable/ic_qs_disable_gesture.xml
new file mode 100644
index 0000000..b1fe495
--- /dev/null
+++ b/app/src/main/res/drawable/ic_qs_disable_gesture.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M4.59,6.89c0.7,-0.71 1.4,-1.35 1.71,-1.22 0.5,0.2 0,1.03 -0.3,1.52 -0.25,0.42 -2.86,3.89 -2.86,6.31 0,1.28 0.48,2.34 1.34,2.98 0.75,0.56 1.74,0.73 2.64,0.46 1.07,-0.31 1.95,-1.4 3.06,-2.77 1.21,-1.49 2.83,-3.44 4.08,-3.44 1.63,0 1.65,1.01 1.76,1.79 -3.78,0.64 -5.38,3.67 -5.38,5.37 0,1.7 1.44,3.09 3.21,3.09 1.63,0 4.29,-1.33 4.69,-6.1L21,14.88v-2.5h-2.47c-0.15,-1.65 -1.09,-4.2 -4.03,-4.2 -2.25,0 -4.18,1.91 -4.94,2.84 -0.58,0.73 -2.06,2.48 -2.29,2.72 -0.25,0.3 -0.68,0.84 -1.11,0.84 -0.45,0 -0.72,-0.83 -0.36,-1.92 0.35,-1.09 1.4,-2.86 1.85,-3.52 0.78,-1.14 1.3,-1.92 1.3,-3.28C8.95,3.69 7.31,3 6.44,3 5.12,3 3.97,4 3.72,4.25c-0.36,0.36 -0.66,0.66 -0.88,0.93l1.75,1.71zM13.88,18.55c-0.31,0 -0.74,-0.26 -0.74,-0.72 0,-0.6 0.73,-2.2 2.87,-2.76 -0.3,2.69 -1.43,3.48 -2.13,3.48z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_qs_disable_hw_key.xml b/app/src/main/res/drawable/ic_qs_disable_hw_key.xml
new file mode 100644
index 0000000..937e047
--- /dev/null
+++ b/app/src/main/res/drawable/ic_qs_disable_hw_key.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M20,5L4,5c-1.1,0 -1.99,0.9 -1.99,2L2,17c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,7c0,-1.1 -0.9,-2 -2,-2zM11,8h2v2h-2L11,8zM11,11h2v2h-2v-2zM8,8h2v2L8,10L8,8zM8,11h2v2L8,13v-2zM7,13L5,13v-2h2v2zM7,10L5,10L5,8h2v2zM16,17L8,17v-2h8v2zM16,13h-2v-2h2v2zM16,10h-2L14,8h2v2zM19,13h-2v-2h2v2zM19,10h-2L17,8h2v2z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_qs_dnd.xml b/app/src/main/res/drawable/ic_qs_dnd.xml
new file mode 100644
index 0000000..c6e6505
--- /dev/null
+++ b/app/src/main/res/drawable/ic_qs_dnd.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+  <path
+      android:fillColor="@android:color/white"
+      android:pathData="M7,11v2h10v-2L7,11zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z"/>
+</vector>
diff --git a/app/src/main/res/drawable/ic_qs_screenshot.xml b/app/src/main/res/drawable/ic_qs_screenshot.xml
new file mode 100644
index 0000000..375c0f9
--- /dev/null
+++ b/app/src/main/res/drawable/ic_qs_screenshot.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2018 The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24.0dp"
+    android:height="24.0dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0">
+    <path
+        android:fillColor="#ffffff"
+        android:pathData="M17,1.01L7,1C5.9,1 5,1.9 5,3v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3C19,1.9 18.1,1.01 17,1.01zM17,21H7l0,-1h10V21zM17,18H7V6h10V18zM17,4H7V3h10V4z"/>
+    <path
+        android:fillColor="#ffffff"
+        android:pathData="M9.5,8.5l2.5,0l0,-1.5l-2.5,0l-1.5,0l0,1.5l0,2.5l1.5,0z"/>
+    <path
+        android:fillColor="#ffffff"
+        android:pathData="M12,17l2.5,0l1.5,0l0,-1.5l0,-2.5l-1.5,0l0,2.5l-2.5,0z"/>
+</vector>
diff --git a/app/src/main/res/drawable/menu_divider.xml b/app/src/main/res/drawable/menu_divider.xml
new file mode 100644
index 0000000..e8f5262
--- /dev/null
+++ b/app/src/main/res/drawable/menu_divider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@android:color/transparent" />
+    <size android:height="6dp"/>
+</shape>
diff --git a/app/src/main/res/drawable/qs_background.xml b/app/src/main/res/drawable/qs_background.xml
new file mode 100644
index 0000000..efc75ee
--- /dev/null
+++ b/app/src/main/res/drawable/qs_background.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="108dp"
+    android:height="108dp"
+    android:viewportWidth="108"
+    android:viewportHeight="108">
+    <path
+        android:fillColor="@color/qs_background_colors"
+        android:pathData="M8,54 A46,46 0 1 0 8,53.99999"/>
+</vector>
diff --git a/app/src/main/res/drawable/qs_divider.xml b/app/src/main/res/drawable/qs_divider.xml
new file mode 100644
index 0000000..6c92631
--- /dev/null
+++ b/app/src/main/res/drawable/qs_divider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@android:color/transparent" />
+    <size android:width="6dp"/>
+</shape>
diff --git a/app/src/main/res/layout/danmaku_view.xml b/app/src/main/res/layout/danmaku_view.xml
new file mode 100644
index 0000000..51f5837
--- /dev/null
+++ b/app/src/main/res/layout/danmaku_view.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<top.littlefogcat.danmakulib.danmaku.DanmakuView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:ellipsize="none"
+    android:shadowColor="#000000"
+    android:shadowDx="0"
+    android:shadowDy="0"
+    android:shadowRadius="2.5"
+    android:singleLine="true" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/gaming_button_layout.xml b/app/src/main/res/layout/gaming_button_layout.xml
new file mode 100644
index 0000000..fc686a3
--- /dev/null
+++ b/app/src/main/res/layout/gaming_button_layout.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content" android:layout_height="wrap_content"
+    android:background="@android:color/transparent">
+    <ImageView
+        android:id="@+id/floating_button"
+        android:layout_width="@dimen/game_button_size"
+        android:layout_height="@dimen/game_button_size"
+        android:contentDescription="@null"
+        android:scaleType="fitCenter"
+        android:src="@drawable/ic_game_button" />
+</FrameLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/gaming_overlay_layout.xml b/app/src/main/res/layout/gaming_overlay_layout.xml
new file mode 100644
index 0000000..118954a
--- /dev/null
+++ b/app/src/main/res/layout/gaming_overlay_layout.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@android:color/transparent"
+    android:theme="@style/AppTheme"
+    android:gravity="bottom">
+
+    <ScrollView
+        android:id="@+id/gaming_menu"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:background="@color/gamingMenuBackground">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:clickable="true"
+            android:divider="@drawable/menu_divider"
+            android:orientation="vertical"
+            android:padding="@dimen/gaming_menu_padding"
+            android:showDividers="middle">
+
+            <org.exthmui.game.ui.TimeAndBatteryView
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" />
+
+            <!--
+            <org.exthmui.game.ui.MusicControllerView
+                android:layout_width="match_parent"
+                android:layout_height="match_parent">
+
+            </org.exthmui.game.ui.MusicControllerView>
+            -->
+
+            <HorizontalScrollView
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="4dp">
+
+                <org.exthmui.game.ui.QuickSettingsView
+                    android:id="@+id/gaming_qs"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent" />
+            </HorizontalScrollView>
+
+            <HorizontalScrollView
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:padding="4dp">
+
+                <org.exthmui.game.ui.QuickStartAppView
+                    android:id="@+id/gaming_qsapp"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent" />
+            </HorizontalScrollView>
+
+            <org.exthmui.game.ui.GamingPerformanceView
+                android:id="@+id/performance_controller"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent" />
+
+        </LinearLayout>
+    </ScrollView>
+
+</LinearLayout>
diff --git a/app/src/main/res/layout/gaming_perofrmance_layout.xml b/app/src/main/res/layout/gaming_perofrmance_layout.xml
new file mode 100644
index 0000000..b2f0845
--- /dev/null
+++ b/app/src/main/res/layout/gaming_perofrmance_layout.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent" android:layout_height="match_parent"
+    android:orientation="vertical">
+    <TextView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/performance_title"
+        android:textAppearance="@style/TextAppearance.AppCompat.Subhead" />
+
+    <SeekBar
+        android:id="@+id/performance_seek"
+        style="@android:style/Widget.Material.SeekBar.Discrete"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:max="6"
+        android:progress="3" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="horizontal">
+
+        <TextView
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:gravity="left"
+            android:text="@string/performance_text_for_powersave" />
+
+        <TextView
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:layout_weight="1"
+            android:gravity="right"
+            android:text="@string/performance_text_for_performance" />
+
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/gaming_qs_view.xml b/app/src/main/res/layout/gaming_qs_view.xml
new file mode 100644
index 0000000..7c36e33
--- /dev/null
+++ b/app/src/main/res/layout/gaming_qs_view.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:gravity="center"
+    android:orientation="vertical">
+
+    <ImageView
+        android:id="@+id/qs_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="@dimen/gaming_qs_icon_size"
+        android:adjustViewBounds="true"
+        android:background="@drawable/qs_background"
+        android:cropToPadding="false"
+        android:padding="@dimen/gaming_qs_icon_padding"
+        android:scaleType="fitCenter" />
+
+    <TextView
+        android:id="@+id/qs_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="center"
+        android:maxEms="4"
+        android:maxLines="2" />
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/music_control_layout.xml b/app/src/main/res/layout/music_control_layout.xml
new file mode 100644
index 0000000..63ed79d
--- /dev/null
+++ b/app/src/main/res/layout/music_control_layout.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:gravity="center"
+    android:orientation="horizontal">
+
+    <ImageView
+        android:id="@+id/music_cover"
+        android:layout_width="@dimen/music_cover_size"
+        android:layout_height="@dimen/music_cover_size"
+        android:scaleType="fitCenter"
+        android:src="@drawable/default_album_cover" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginHorizontal="@dimen/music_info_margin_horizontal"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/music_title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:ellipsize="end"
+            android:maxLines="1"
+            android:maxLength="24"
+            android:textAppearance="@style/TextAppearance.AppCompat.Subhead" />
+
+        <TextView
+            android:id="@+id/music_artist"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:ellipsize="end"
+            android:maxLines="1" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:gravity="bottom"
+            android:orientation="horizontal">
+
+            <ImageView
+                android:id="@+id/prev_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:src="@drawable/ic_music_previous" />
+
+            <ImageView
+                android:id="@+id/play_pause_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:src="@drawable/ic_music_play" />
+
+            <ImageView
+                android:id="@+id/next_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:src="@drawable/ic_music_next" />
+        </LinearLayout>
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/time_battery_layout.xml b/app/src/main/res/layout/time_battery_layout.xml
new file mode 100644
index 0000000..e9b0f99
--- /dev/null
+++ b/app/src/main/res/layout/time_battery_layout.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="horizontal" >
+
+    <TextView
+        android:id="@+id/current_time"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="18:00"
+        android:textSize="32sp" />
+
+    <TextView
+        android:id="@+id/current_date"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginHorizontal="@dimen/time_battery_margin_horizontal"
+        android:text="2020年7月22日" />
+
+    <TextView
+        android:id="@+id/current_battery"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="end"
+        android:text="电量: 100%" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..bbd3e02
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background"/>
+    <foreground android:drawable="@drawable/ic_launcher_foreground"/>
+</adaptive-icon>
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..eca70cf
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@drawable/ic_launcher_background" />
+    <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..557bbb1
--- /dev/null
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">游戏模式核心</string>
+
+    <string name="channel_gaming_mode_status">游戏模式状态</string>
+    <string name="action_stop_gaming_mode">停止</string>
+    <string name="gaming_mode_running">游戏模式正在运行</string>
+
+
+    <string name="gaming_mode_on">游戏模式已启动</string>
+    <string name="gaming_mode_off">已退出游戏模式</string>
+
+    <string name="gaming_mode">游戏模式</string>
+    <string name="date_format">yyyy年MM月dd日</string>
+    <string name="time_format">HH:mm</string>
+    <string name="battery_format">电量: %1$d%%</string>
+
+    <string name="performance_title">性能配置</string>
+    <string name="performance_text_for_powersave">更长续航</string>
+    <string name="performance_text_for_performance">最高性能</string>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..6599688
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="colorPrimary">#6200EE</color>
+    <color name="colorPrimaryDark">#3700B3</color>
+    <color name="colorAccent">#03DAC5</color>
+    <color name="gamingMenuBackground">#66000000</color>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..156c92b
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <dimen name="game_button_size">48dp</dimen>
+    <dimen name="music_cover_size">64dp</dimen>
+    <dimen name="gaming_qs_icon_size">56dp</dimen>
+    <dimen name="gaming_qs_icon_padding">16dp</dimen>
+    <dimen name="music_info_margin_horizontal">6dp</dimen>
+    <dimen name="time_battery_margin_horizontal">6dp</dimen>
+    <dimen name="gaming_menu_padding">12dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..b1961bc
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,20 @@
+<resources>
+    <string name="app_name">GamingMode Core</string>
+
+    <string name="channel_gaming_mode_status">Gaming mode status</string>
+    <string name="action_stop_gaming_mode">Stop</string>
+    <string name="gaming_mode_running">Gaming mode is running</string>
+
+
+    <string name="gaming_mode_on">Gaming mode turned on</string>
+    <string name="gaming_mode_off">Gaming mode turned off</string>
+
+    <string name="gaming_mode">Gaming Mode</string>
+    <string name="date_format">yyyy-MM-dd</string>
+    <string name="time_format">HH:mm</string>
+    <string name="battery_format">Battery: %1$d%%</string>
+
+    <string name="performance_title">Performance</string>
+    <string name="performance_text_for_powersave">Powersave</string>
+    <string name="performance_text_for_performance">Performance</string>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..8e3341b
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+<resources>
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+        <item name="android:textColor">#ffffffff</item>
+        <item name="android:textColorSecondary">#ffe0e0e0</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/app/src/test/java/org/exthmui/game/ExampleUnitTest.java b/app/src/test/java/org/exthmui/game/ExampleUnitTest.java
new file mode 100644
index 0000000..b517f88
--- /dev/null
+++ b/app/src/test/java/org/exthmui/game/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package org.exthmui.game;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+public class ExampleUnitTest {
+    @Test
+    public void addition_isCorrect() {
+        assertEquals(4, 2 + 2);
+    }
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..da807a2
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,24 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+buildscript {
+    repositories {
+        google()
+        jcenter()
+    }
+    dependencies {
+        classpath "com.android.tools.build:gradle:4.0.0"
+
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+    }
+}
+
+allprojects {
+    repositories {
+        google()
+        jcenter()
+    }
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..c52ac9b
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,19 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app"s APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Automatically convert third-party libraries to use AndroidX
+android.enableJetifier=true
\ No newline at end of file
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..f6b961f
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..d402a46
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Sat Jul 11 17:03:41 CST 2020
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..cccdd3d
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/keystore.properties.sample b/keystore.properties.sample
new file mode 100644
index 0000000..af869b1
--- /dev/null
+++ b/keystore.properties.sample
@@ -0,0 +1,4 @@
+keyAlias=android
+keyPassword=android
+storeFile=testkey.jks
+storePassword=android
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..26ec000
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,2 @@
+include ':app'
+rootProject.name = "GamingMode"
\ No newline at end of file
