package tk.wasdennnoch.androidn_ify.systemui.qs;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.widget.RelativeLayout;
import java.util.ArrayList;
import java.util.List;
import de.robv.android.xposed.XposedHelpers;
import tk.wasdennnoch.androidn_ify.XposedHook;
import tk.wasdennnoch.androidn_ify.systemui.qs.tiles.QSTile;
import tk.wasdennnoch.androidn_ify.systemui.qs.tiles.misc.FakeQSTileView;
import tk.wasdennnoch.androidn_ify.utils.ResourceUtils;
class AvailableTileAdapter extends TileAdapter {
private static final String TAG = "AvailableTileAdapter";
private static final String CLASS_QS_TUNER = "com.android.systemui.tuner.QsTuner";
private final Class<?> classQSTileHost;
private final Class<?> classResourceIcon;
private Class<?> classQSTuner;
AvailableTileAdapter(ArrayList<Object> records, Context context) {
super(context);
mRecords.clear();
classQSTileHost = XposedHelpers.findClass(QSTileHostHooks.CLASS_TILE_HOST, mContext.getClassLoader());
classResourceIcon = XposedHelpers.findClass(QSTile.CLASS_QS_TILE + "$ResourceIcon", mContext.getClassLoader());
try {
classQSTuner = XposedHelpers.findClass(CLASS_QS_TUNER, mContext.getClassLoader());
} catch (Throwable ignore) {
// CM
}
mTileViews = new ArrayList<>();
List<String> availableTiles = QSTileHostHooks.getAvailableTiles(mContext);
for (int i = 0; i < records.size(); i++) {
Object tilerecord = records.get(i);
Object tile = XposedHelpers.getObjectField(tilerecord, "tile");
String spec = (String) XposedHelpers.getAdditionalInstanceField(tile, QSTileHostHooks.TILE_SPEC_NAME);
XposedHook.logD(TAG, "<init>: Removing already used spec " + spec);
availableTiles.remove(spec);
}
for (String spec : availableTiles) {
addSpec(spec);
}
XposedHook.logD(TAG, "<init>: Got total tiles " + mRecords.size() + "(" + TextUtils.join(", ", mRecords) + ")");
}
private void addSpec(String spec) {
if (spec == null) return;
RelativeLayout.LayoutParams tileViewLp = new RelativeLayout.LayoutParams(mCellWidth, mCellHeight);
tileViewLp.addRule(RelativeLayout.CENTER_IN_PARENT);
FakeQSTileView tileView = new FakeQSTileView(mContext);
tileView.setLayoutParams(tileViewLp);
tileView.handleStateChanged(getQSTileIcon(spec), getQSTileLabel(spec));
mTileViews.add(tileView);
mRecords.add(spec);
}
@Override
public int getItemCount() {
return mTileViews.size();
}
private Drawable getQSTileIcon(String spec) {
int res;
try {
return TilesManager.getIcon(mContext, spec);
} catch (Throwable t) {
try {
res = (int) XposedHelpers.callStaticMethod(classQSTileHost, "getIconResource", spec);
} catch (Throwable t2) {
try {
res = getIconResource(spec);
} catch (Throwable t3) {
res = getIconResourceAosp(spec);
}
}
}
if (res != 0) {
try {
Object icon = XposedHelpers.callStaticMethod(classResourceIcon, "get", res);
return (Drawable) XposedHelpers.callMethod(icon, "getDrawable", mContext);
} catch (Throwable ignore) {
}
}
return mContext.getPackageManager().getDefaultActivityIcon();
}
private int getIconResourceAosp(String spec) {
Resources res = mContext.getResources();
switch (spec) {
case "wifi": return res.getIdentifier("ic_qs_wifi_full_4", "drawable", PACKAGE_SYSTEMUI);
case "bt": return res.getIdentifier("ic_qs_bluetooth_on", "drawable", PACKAGE_SYSTEMUI);
case "inversion": return res.getIdentifier("ic_invert_colors_enable_animation", "drawable", PACKAGE_SYSTEMUI);
case "cell": return res.getIdentifier("ic_qs_signal_full_4", "drawable", PACKAGE_SYSTEMUI);
case "airplane": return res.getIdentifier("ic_signal_airplane_enable", "drawable", PACKAGE_SYSTEMUI);
case "dnd": return res.getIdentifier("ic_dnd", "drawable", PACKAGE_SYSTEMUI);
case "rotation": return res.getIdentifier("ic_portrait_from_auto_rotate", "drawable", PACKAGE_SYSTEMUI);
case "flashlight": return res.getIdentifier("ic_signal_flashlight_enable", "drawable", PACKAGE_SYSTEMUI);
case "location": return res.getIdentifier("ic_signal_location_enable", "drawable", PACKAGE_SYSTEMUI);
case "cast": return res.getIdentifier("ic_qs_cast_on", "drawable", PACKAGE_SYSTEMUI);
case "hotspot": return res.getIdentifier("ic_hotspot_enable", "drawable", PACKAGE_SYSTEMUI);
}
return 0;
}
private int getIconResource(String spec) {
// On RR this is an instance method of the DraggableTile in the QsTuner, to get an instance we would
// need to pass a QSTile.Host which we don't have, so just extract the method here and adapt it.
Resources res = mContext.getResources();
//noinspection IfCanBeSwitch
if (spec.equals("wifi")) return res.getIdentifier("ic_qs_wifi_full_3", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("bt")) return res.getIdentifier("ic_qs_bluetooth_connected", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("inversion")) return res.getIdentifier("ic_invert_colors_enable", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("cell") || spec.equals("cell1") || spec.equals("cell2")) return res.getIdentifier("ic_qs_signal_full_3", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("airplane")) return res.getIdentifier("ic_signal_airplane_enable", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("dnd")) return res.getIdentifier("ic_qs_dnd_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("rotation")) return res.getIdentifier("ic_portrait_from_auto_rotate", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("flashlight")) return res.getIdentifier("ic_signal_flashlight_enable", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("location")) return res.getIdentifier("ic_signal_location_enable", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("cast")) return res.getIdentifier("ic_qs_cast_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("hotspot")) return res.getIdentifier("ic_hotspot_enable", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("adb_network")) return res.getIdentifier("ic_qs_network_adb_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("compass")) return res.getIdentifier("ic_qs_compass_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("nfc")) return res.getIdentifier("ic_qs_nfc_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("profiles")) return res.getIdentifier("ic_qs_profiles_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("sync")) return res.getIdentifier("ic_qs_sync_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("volume_panel")) return res.getIdentifier("ic_qs_volume_panel", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("usb_tether")) return res.getIdentifier("ic_qs_usb_tether_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("screen_timeout") || spec.equals("timeout")) return res.getIdentifier("ic_qs_screen_timeout_short_avd", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("performance")) return res.getIdentifier("ic_qs_perf_profile", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("ambient_display")) return res.getIdentifier("ic_qs_ambientdisplay_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("live_display")) return res.getIdentifier("ic_livedisplay_auto", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("music")) return res.getIdentifier("ic_qs_media_play", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("brightness")) return res.getIdentifier("ic_qs_brightness_auto_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("screen_off") || spec.equals("screenoff")) return res.getIdentifier("ic_qs_power", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("screenshot")) return res.getIdentifier("ic_qs_screenshot", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("expanded_desktop")) return res.getIdentifier("ic_qs_expanded_desktop", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("reboot")) return res.getIdentifier("ic_qs_reboot", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("configurations")) return res.getIdentifier("ic_rr_tools", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("heads_up")) return res.getIdentifier("ic_qs_heads_up_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("lte")) return res.getIdentifier("ic_qs_lte_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("themes")) return res.getIdentifier("ic_qs_themes", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("navbar")) return res.getIdentifier("ic_qs_navbar_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("appcirclebar")) return res.getIdentifier("ic_qs_appcirclebar_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("kernel_adiutor")) return res.getIdentifier("ic_qs_kernel_adiutor", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("screenrecord")) return res.getIdentifier("ic_qs_screenrecord", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("gesture_anywhere")) return res.getIdentifier("ic_qs_gestures_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("battery_saver")) return res.getIdentifier("ic_qs_battery_saver_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("power_menu")) return res.getIdentifier("ic_qs_power_menu", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("app_picker")) return res.getIdentifier("ic_qs_app_picker", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("kill_app")) return res.getIdentifier("ic_app_kill", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("caffeine")) return res.getIdentifier("ic_qs_caffeine_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("hw_keys")) return res.getIdentifier("ic_qs_hwkeys_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("sound")) return res.getIdentifier("ic_qs_ringer_silent", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("lockscreen")) return res.getIdentifier("ic_qs_lock_screen_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("pulse")) return res.getIdentifier("ic_qs_pulse", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("pie")) return res.getIdentifier("ic_qs_pie", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("float_mode")) return res.getIdentifier("ic_qs_floating_on", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("visualizer")) return res.getIdentifier("ic_qs_visualizer_static", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("halo")) return res.getIdentifier("ic_notify_halo_normal", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("immersive")) return res.getIdentifier("ic_immersive_full_enable_animation", "drawable", PACKAGE_SYSTEMUI);
else if (spec.equals("floating")) return res.getIdentifier("ic_qs_floating_peek", "drawable", PACKAGE_SYSTEMUI);
return 0;
}
private String getQSTileLabel(String spec) {
int resource;
try {
resource = TilesManager.getLabelResource(spec);
} catch (Throwable t) {
try {
resource = (int) XposedHelpers.callStaticMethod(classQSTileHost, "getLabelResource", spec);
} catch (Throwable t2) {
try { // RR
resource = (int) XposedHelpers.callStaticMethod(classQSTuner, "getLabelResource", spec);
} catch (Throwable t3) {
resource = getQSTileLabelAosp(spec);
}
}
}
if (resource != 0) {
try {
return mContext.getText(resource).toString();
} catch (Throwable t) {
return ResourceUtils.getInstance(mContext).getText(resource).toString();
}
} else {
return spec;
}
}
private int getQSTileLabelAosp(String spec) {
Resources res = mContext.getResources();
switch (spec) {
case "wifi": return res.getIdentifier("quick_settings_wifi_label", "string", PACKAGE_SYSTEMUI);
case "bt": return res.getIdentifier("quick_settings_bluetooth_label", "string", PACKAGE_SYSTEMUI);
case "inversion": return res.getIdentifier("quick_settings_inversion_label", "string", PACKAGE_SYSTEMUI);
case "cell": return res.getIdentifier("quick_settings_cellular_detail_title", "string", PACKAGE_SYSTEMUI);
case "airplane": return res.getIdentifier("airplane_mode", "string", PACKAGE_SYSTEMUI);
case "dnd": return res.getIdentifier("quick_settings_dnd_label", "string", PACKAGE_SYSTEMUI);
case "rotation": return res.getIdentifier("quick_settings_rotation_locked_label", "string", PACKAGE_SYSTEMUI);
case "flashlight": return res.getIdentifier("quick_settings_flashlight_label", "string", PACKAGE_SYSTEMUI);
case "location": return res.getIdentifier("quick_settings_location_label", "string", PACKAGE_SYSTEMUI);
case "cast": return res.getIdentifier("quick_settings_cast_title", "string", PACKAGE_SYSTEMUI);
case "hotspot": return res.getIdentifier("quick_settings_hotspot_label", "string", PACKAGE_SYSTEMUI);
}
return 0;
}
}