SystemUI中的下拉栏快捷开关是如何加载的?

318 阅读1分钟

一、首先在config.xml中配置快捷设置开关面板要显示的tile

<string name="quick_settings_tiles_all" translatable="false">wifi,data,bt,sound,rotation,networkmode,airplane,flashlight,location,screenshot,hotspot,nfc</string>

二、创建对应的Tile类

在./app/src/main/java/com/android/systemui/qs/tiles/目录中,有原生的相关Tile类,其中设置相关图标样式,开关逻辑。

各Tile类均继承了QSTile抽象类,重写handleClick()、getLongClickIntent()、handleUpdateState()等方法。

三、app/src/main/java/com/android/systemui/statusbar/phone/QSTileHost.java文件中会根据config中的配置加载相应的Tile,createTile(String tileSpec)函数。

public QSTile createTile(String tileSpec) {
    if (tileSpec.equals("wifi")) 
        return new WifiTile(mHost);
    else if (tileSpec.equals("bt")) 
        return new BluetoothTile(mHost);
    else if (tileSpec.equals("cell")) 
        return new CellularTile(mHost);
    else if (tileSpec.equals("dnd")) 
        return new DndTile(mHost);
    else if (tileSpec.equals("inversion")) 
        return new ColorInversionTile(mHost);
    else if (tileSpec.equals("airplane")) 
        return new AirplaneModeTile(mHost);
    else if (tileSpec.equals("work")) 
        return new WorkModeTile(mHost);
    else if (tileSpec.equals("rotation")) 
        return new RotationLockTile(mHost);
    else if (tileSpec.equals("flashlight")) 
        return new FlashlightTile(mHost);
    else if (tileSpec.equals("location")) 
        return new LocationTile(mHost);
    else if (tileSpec.equals("cast")) 
        return new CastTile(mHost);
    else if (tileSpec.equals("hotspot")) 
        return new HotspotTile(mHost);
    else if (tileSpec.equals("user")) 
        return new UserTile(mHost);
    else if (tileSpec.equals("battery")) 
        return new BatterySaverTile(mHost);
    else if (tileSpec.equals("saver")) 
        return new DataSaverTile(mHost);
    else if (tileSpec.equals("night")) 
        return new NightDisplayTile(mHost);
    else if (tileSpec.equals("nfc")) 
        return new NfcTile(mHost);// Intent tiles.
    else if (tileSpec.startsWith(IntentTile.PREFIX)) 
        return IntentTile.create(mHost, tileSpec);
    else if (tileSpec.startsWith(CustomTile.PREFIX)) 
        return CustomTile.create(mHost, tileSpec);
    else {
        Log.w(TAG, "Bad tile spec: " + tileSpec);
        return null;
    }
}
@Override
public QSTileView createTileView(QSTile tile, boolean collapsedView) {
    Context context = new ContextThemeWrapper(mHost.getContext(), R.style.qs_theme);
    QSIconView icon = tile.createTileView(context);
    if (collapsedView) {
        return new QSTileBaseView(context, icon, collapsedView);
    } else {
        return new com.android.systemui.qs.tileimpl.QSTileView(context, icon);
    }
}