package de.theknut.xposedgelsettings.hooks.homescreen; import android.graphics.Color; import android.graphics.PorterDuff.Mode; import android.graphics.drawable.Drawable; import android.view.View; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; import de.theknut.xposedgelsettings.hooks.Common; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Classes; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Fields; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Methods; import de.theknut.xposedgelsettings.hooks.PreferencesHelper; import de.theknut.xposedgelsettings.hooks.common.XGELSCallback; import static de.robv.android.xposed.XposedHelpers.callMethod; import static de.robv.android.xposed.XposedHelpers.getIntField; import static de.robv.android.xposed.XposedHelpers.getObjectField; import static de.robv.android.xposed.XposedHelpers.setBooleanField; import static de.robv.android.xposed.XposedHelpers.setIntField; public final class AddViewToCellLayoutHook extends XGELSCallback { // public boolean addViewToCellLayout(View child, int index, int childId, LayoutParams params, boolean markCells) // http://androidxref.com/4.4.2_r1/xref/packages/apps/Launcher3/src/com/android/launcher3/CellLayout.java#604 private static int iconPadding; @Override public void onBeforeHookedMethod(MethodHookParam param) throws Throwable { View child = (View) param.args[0]; Class<?> parent = ((View) param.thisObject).getParent().getClass(); if (child.getClass().equals(Classes.BubbleTextView)) { if (parent.equals(Classes.AppsCustomizeCellLayout)) { callMethod(child, "setTextColor", PreferencesHelper.hideIconLabelApps ? Color.TRANSPARENT : PreferencesHelper.appdrawerIconLabelColor); maybeHideShadow(child, !PreferencesHelper.appdrawerIconLabelShadow || PreferencesHelper.hideIconLabelApps); } else if (parent.equals(ScrollView.class) || parent.equals(Classes.FolderPagedView)) { // apps inside folders are added to a ScrollView if (PreferencesHelper.homescreenFolderSwitch) { callMethod(child, "setTextColor", PreferencesHelper.homescreenFolderNoLabel ? Color.TRANSPARENT : PreferencesHelper.homescreenFolderAppTextColor); } } else if (parent.equals(Classes.Workspace)) { if (PreferencesHelper.iconSettingsSwitchHome) { callMethod(child, "setTextColor", PreferencesHelper.hideIconLabelHome ? Color.TRANSPARENT : PreferencesHelper.homescreenIconLabelColor); maybeHideShadow(child, !PreferencesHelper.homescreenIconLabelShadow || PreferencesHelper.hideIconLabelHome); } iconPadding = ((TextView) child).getCompoundDrawablePadding(); } else if (parent.equals(Classes.Hotseat)) { if (PreferencesHelper.iconSettingsSwitchHome) { callMethod(child, "setTextColor", PreferencesHelper.hideIconLabelHome ? Color.TRANSPARENT : PreferencesHelper.homescreenIconLabelColor); maybeHideShadow(child, !PreferencesHelper.homescreenIconLabelShadow || PreferencesHelper.hideIconLabelHome); } } } else if (child.getClass().equals(Classes.FolderIcon)) { boolean isAppDrawerFolder = parent.equals(Classes.AppsCustomizePagedView); Object folderName = getObjectField(child, Fields.fiFolderName); if (isAppDrawerFolder) { if (PreferencesHelper.iconSettingsSwitchApps) { callMethod(folderName, "setTextColor", PreferencesHelper.hideIconLabelApps ? Color.TRANSPARENT : PreferencesHelper.appdrawerIconLabelColor); maybeHideShadow(folderName, !PreferencesHelper.appdrawerIconLabelShadow || PreferencesHelper.hideIconLabelApps); } } else { if (PreferencesHelper.iconSettingsSwitchHome) { callMethod(folderName, "setTextColor", PreferencesHelper.hideIconLabelHome ? Color.TRANSPARENT : PreferencesHelper.homescreenIconLabelColor); maybeHideShadow(folderName, !PreferencesHelper.homescreenIconLabelShadow || PreferencesHelper.hideIconLabelHome); if (PreferencesHelper.appdockShowLabels && parent.equals(Classes.Hotseat)) { ((View) folderName).setVisibility(View.VISIBLE); } } } if (PreferencesHelper.homescreenFolderSwitch || (isAppDrawerFolder && PreferencesHelper.iconSettingsSwitchApps)) { Object mFolder = getObjectField(child, Fields.fiFolder); LinearLayout ll = (LinearLayout) mFolder; Drawable d = ll.getBackground(); d.setColorFilter(PreferencesHelper.homescreenFolderColor, Mode.MULTIPLY); ll.setBackground(d); EditText mFolderName = (EditText) getObjectField(mFolder, Fields.fFolderEditText); if (Color.alpha(PreferencesHelper.homescreenFolderNameTextColor) == 0) { setIntField(mFolder, Fields.fFolderNameHeight, 0); mFolderName.getLayoutParams().height = 0; mFolderName.setVisibility(View.GONE); } else { mFolderName.setTextColor(PreferencesHelper.homescreenFolderNameTextColor); } ImageView prevBackground = (ImageView) getObjectField(child, Fields.fiPreviewBackground); prevBackground.setVisibility(View.VISIBLE); Drawable i = prevBackground.getDrawable(); i.setColorFilter(PreferencesHelper.homescreenFolderPreviewColor, Mode.MULTIPLY); prevBackground.setImageDrawable(i); } } else if (PreferencesHelper.appdockShowLabels && child.getClass().equals(TextView.class)) { // all apps button TextView allAppsButton = ((TextView) child); allAppsButton.setVisibility(View.VISIBLE); int id = Common.LAUNCHER_CONTEXT.getResources().getIdentifier("all_apps_button_label", "string", Common.HOOKED_PACKAGE); if (id != 0) { allAppsButton.setText(Common.LAUNCHER_CONTEXT.getResources().getString(id)); } else { allAppsButton.setText("Apps"); } try { allAppsButton.setCompoundDrawablePadding(getIntField(Common.DEVICE_PROFIL, Fields.dpIconDrawablePaddingPx)); } catch (Exception e) { if (DEBUG) log("Execption: Set padding alternatively"); allAppsButton.setCompoundDrawablePadding(iconPadding); } catch (Error e) { if (DEBUG) log("Error: Set padding alternatively"); allAppsButton.setCompoundDrawablePadding(iconPadding); } callMethod(child, "setTextColor", PreferencesHelper.hideIconLabelHome ? Color.TRANSPARENT : PreferencesHelper.homescreenIconLabelColor); maybeHideShadow(child, !PreferencesHelper.homescreenIconLabelShadow || PreferencesHelper.hideIconLabelHome); } } @Override public void onAfterHookedMethod(MethodHookParam param) throws Throwable { if (PreferencesHelper.appdockShowLabels && ((View) param.thisObject).getParent().getClass().equals(Classes.Hotseat)) { setBooleanField(param.thisObject, Fields.clIsHotseat, true); View child = (View) param.args[0]; child.setScaleX((Float) callMethod(param.thisObject, Methods.clGetChildrenScale)); child.setScaleY((Float) callMethod(param.thisObject, Methods.clGetChildrenScale)); setBooleanField(param.thisObject, Fields.clIsHotseat, false); } } public void maybeHideShadow(Object child, boolean hide) { if (hide) { if (child.getClass().equals(Classes.BubbleTextView)) { setBooleanField(child, Fields.btvShadowsEnabled, false); } ((TextView) child).getPaint().clearShadowLayer(); } } }