package de.theknut.xposedgelsettings.hooks.androidintegration; import android.content.Context; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Build; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam; import de.theknut.xposedgelsettings.R; import de.theknut.xposedgelsettings.hooks.Common; import de.theknut.xposedgelsettings.hooks.HooksBaseClass; import de.theknut.xposedgelsettings.hooks.PreferencesHelper; import de.theknut.xposedgelsettings.hooks.Utils; import static de.robv.android.xposed.XposedHelpers.ClassNotFoundError; import static de.robv.android.xposed.XposedHelpers.callMethod; import static de.robv.android.xposed.XposedHelpers.findAndHookMethod; import static de.robv.android.xposed.XposedHelpers.findClass; import static de.robv.android.xposed.XposedHelpers.getAdditionalInstanceField; import static de.robv.android.xposed.XposedHelpers.getObjectField; import static de.robv.android.xposed.XposedHelpers.newInstance; import static de.robv.android.xposed.XposedHelpers.setAdditionalInstanceField; /** * Created by Alexander Schulz on 05.08.2014. */ public class QuickSettingsPreL extends HooksBaseClass { static Context mContext; static Resources XGELSResources; static final String LOCKDESKTOPTILE_KEY = "lockdesktoptile"; public static void initAllHooks(LoadPackageParam lpparam) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN || !PreferencesHelper.quicksettingsLockDesktop) return; try { final Class<?> QuickSettingsBasicTileClass = findClass("com.android.systemui.statusbar.phone.QuickSettingsBasicTile", lpparam.classLoader); findAndHookMethod("com.android.systemui.statusbar.phone.QuickSettings", lpparam.classLoader, "setupQuickSettings", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { mContext = (Context) getObjectField(param.thisObject, "mContext"); XGELSResources = mContext.createPackageContext(Common.PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY).getResources(); ViewGroup mContainerView = (ViewGroup) getObjectField(param.thisObject, "mContainerView"); final FrameLayout lockDesktopTile = (FrameLayout) newInstance(QuickSettingsBasicTileClass, mContext); lockDesktopTile.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String text = XGELSResources.getString( !PreferencesHelper.lockHomescreen ? R.string.quicksettings_desktop_locked : R.string.quicksettings_desktop_unlocked ); Drawable image = XGELSResources.getDrawable( !PreferencesHelper.lockHomescreen ? R.drawable.ic_qs_desktop_locked : R.drawable.ic_qs_desktop_unlocked ); callMethod(lockDesktopTile, "setImageDrawable", image); callMethod(lockDesktopTile, "setText", text); Utils.saveToSettings(mContext, "lockhomescreen", !PreferencesHelper.lockHomescreen); } }); mContainerView.addView(lockDesktopTile); setAdditionalInstanceField(getObjectField(param.thisObject, "mModel"), LOCKDESKTOPTILE_KEY, lockDesktopTile); } }); findAndHookMethod("com.android.systemui.statusbar.phone.QuickSettingsModel", lpparam.classLoader, "updateResources", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { mContext = (Context) getObjectField(param.thisObject, "mContext"); XGELSResources = mContext.createPackageContext(Common.PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY).getResources(); FrameLayout lockDesktopTile = (FrameLayout) getAdditionalInstanceField(param.thisObject, LOCKDESKTOPTILE_KEY); Drawable image = XGELSResources.getDrawable( PreferencesHelper.lockHomescreen ? R.drawable.ic_qs_desktop_locked : R.drawable.ic_qs_desktop_unlocked ); String text = XGELSResources.getString( PreferencesHelper.lockHomescreen ? R.string.quicksettings_desktop_locked : R.string.quicksettings_desktop_unlocked ); callMethod(lockDesktopTile, "setImageDrawable", image); callMethod(lockDesktopTile, "setText", text); } }); } catch (ClassNotFoundError cnfe) { try { // CM -.- final Class<?> QuickSettingsBasicTileClass = findClass("com.android.systemui.quicksettings.QuickSettingsTile", lpparam.classLoader); findAndHookMethod("com.android.systemui.statusbar.phone.QuickSettingsController", lpparam.classLoader, "loadTiles", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { mContext = (Context) getObjectField(param.thisObject, "mContext"); XGELSResources = mContext.createPackageContext(Common.PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY).getResources(); ViewGroup mContainerView = (ViewGroup) getObjectField(param.thisObject, "mContainerView"); ArrayList mQuickSettingsTiles = (ArrayList) getObjectField(param.thisObject, "mQuickSettingsTiles"); final Object lockDesktopTile = newInstance(QuickSettingsBasicTileClass, mContext, param.thisObject); callMethod(lockDesktopTile, "setupQuickSettingsTile", LayoutInflater.from(mContext), mContainerView); FrameLayout mTile = (FrameLayout) getObjectField(lockDesktopTile, "mTile"); mTile.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String text = XGELSResources.getString( !PreferencesHelper.lockHomescreen ? R.string.quicksettings_desktop_locked : R.string.quicksettings_desktop_unlocked ); Drawable drawable = XGELSResources.getDrawable( !PreferencesHelper.lockHomescreen ? R.drawable.ic_qs_desktop_locked : R.drawable.ic_qs_desktop_unlocked ); FrameLayout mTile = (FrameLayout) getObjectField(lockDesktopTile, "mTile"); TextView tv = (TextView) mTile.findViewById(mTile.getResources().getIdentifier("text", "id", mTile.getContext().getPackageName())); if (tv != null) { tv.setText(text); } ImageView image = (ImageView) mTile.findViewById(mTile.getResources().getIdentifier("image", "id", mTile.getContext().getPackageName())); if (image != null) { image.setImageDrawable(drawable); } Utils.saveToSettings(mContext, "lockhomescreen", !PreferencesHelper.lockHomescreen); } }); mQuickSettingsTiles.add(lockDesktopTile); setAdditionalInstanceField(param.thisObject, LOCKDESKTOPTILE_KEY, lockDesktopTile); } }); findAndHookMethod("com.android.systemui.statusbar.phone.QuickSettingsController", lpparam.classLoader, "updateResources", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { mContext = (Context) getObjectField(param.thisObject, "mContext"); XGELSResources = mContext.createPackageContext(Common.PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY).getResources(); Object lockDesktopTile = getAdditionalInstanceField(param.thisObject, LOCKDESKTOPTILE_KEY); Drawable drawable = XGELSResources.getDrawable( PreferencesHelper.lockHomescreen ? R.drawable.ic_qs_desktop_locked : R.drawable.ic_qs_desktop_unlocked ); String text = XGELSResources.getString( PreferencesHelper.lockHomescreen ? R.string.quicksettings_desktop_locked : R.string.quicksettings_desktop_unlocked ); FrameLayout mTile = (FrameLayout) getObjectField(lockDesktopTile, "mTile"); TextView tv = (TextView) mTile.findViewById(mTile.getResources().getIdentifier("text", "id", mTile.getContext().getPackageName())); if (tv != null) { tv.setText(text); } ImageView image = (ImageView) mTile.findViewById(mTile.getResources().getIdentifier("image", "id", mTile.getContext().getPackageName())); if (image != null) { image.setImageDrawable(drawable); } } }); } catch (ClassNotFoundError cnfe2) { // okay probably not... anyways } } } }