Skip to content
This repository was archived by the owner on Jun 1, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions res/layout/app_settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,51 @@
android:text="@string/settings_listres" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settings_xdpi" >
</TextView>

<EditText
android:id="@+id/txtXDPI"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="3"
android:imeOptions="actionDone|flagNavigateNext"
android:inputType="number" >
</EditText>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settings_ydpi" >
</TextView>

<EditText
android:id="@+id/txtYDPI"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="3"
android:imeOptions="actionDone|flagNavigateNext"
android:inputType="number" >
</EditText>

<CheckBox
android:id="@+id/chkUseDPI"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/settings_xydpi_use_dpi"/>
</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
Expand Down
1 change: 1 addition & 0 deletions res/values-el/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ DPI, Μέγεθος γραμματοσειράς, Αλλαγή φορτωμέν
\nΜπορείτε να χρησιμοποιήσετε <a href="http://forum.xda-developers.com/showthread.php?t=2437377">αυτό το θέμα</a> για ερωτήσεις ή προτάσεις.</string>
<string name="app_description">Αυτό το mod επιτρέπει σε μερικές γενικές ρυθμίσεις να αλλάξουν ανά εφαρμογή, χωρίς να χρειάζεται να επεξεργαστήτε αρχεία APK:
\n- πυκνότητα οθόνης / dpi
\n- xdpi / ydpi
\n- μέγεθος γραμματοσειράς
\n- ψεύτικο μέγεθος οθόνης για φόρτωση πώρων
\n- τοπικότητα (γλώσσα)
Expand Down
4 changes: 4 additions & 0 deletions res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ Resident in memory; Orientation; Revoke Permissions; &#8230;</string>
\nYou can use <a href="http://forum.xda-developers.com/showthread.php?t=2437377">this thread</a> for questions or suggestions.</string>
<string name="app_description">This mod allows certain generic configurations to be changed on a per-app basis, without needing to edit APKs:
\n- density / dpi
\n- xdpi / ydpi
\n- font scale
\n- fake screen size for resources loading
\n- locale (language)
Expand Down Expand Up @@ -65,6 +66,9 @@ is enabled in its configuration!</string>
<!-- Settings screen -->
<string name="settings_title">Settings</string>
<string name="settings_dpi">DPI</string>
<string name="settings_xdpi">XDPI</string>
<string name="settings_ydpi">YDPI</string>
<string name="settings_xydpi_use_dpi">Use DPI</string>
<string name="settings_fontscale">Font scale</string>
<string name="settings_listres">List res.</string>
<string name="settings_screen">Screen (dp)</string>
Expand Down
3 changes: 3 additions & 0 deletions src/de/robv/android/xposed/mods/appsettings/Common.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ public class Common {

public static final String PREF_ACTIVE = "/active";
public static final String PREF_DPI = "/dpi";
public static final String PREF_XDPI = "/xdpi";
public static final String PREF_YDPI = "/ydpi";
public static final String PREF_XYDPI_USE_DPI = "/xydpi-use-dpi";
public static final String PREF_FONT_SCALE = "/font-scale";
public static final String PREF_LOCALE = "/locale";
public static final String PREF_SCREEN = "/screen";
Expand Down
61 changes: 61 additions & 0 deletions src/de/robv/android/xposed/mods/appsettings/XposedMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,67 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log(t);
}


// Override settings used when loading resources
try {
findAndHookMethod(Display.class, "getMetrics", DisplayMetrics.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
if (param.args[0] == null) {
return;
}

String hostPackageName = AndroidAppHelper.currentPackageName();

// Workaround for KitKat. The keyguard is a different package now but runs in the
// same process as SystemUI and displays as main package
if (Build.VERSION.SDK_INT >= 19 && hostPackageName.equals("com.android.keyguard"))
hostPackageName = SYSTEMUI_PACKAGE;

// settings related to the density etc. are calculated for the running app...
DisplayMetrics newMetrics = null;
if (hostPackageName != null && isActive(hostPackageName)) {

int dpi = prefs.getInt(hostPackageName + Common.PREF_DPI,
prefs.getInt(Common.PREF_DEFAULT + Common.PREF_DPI, 0));
int xdpi = prefs.getInt(hostPackageName + Common.PREF_XDPI,
prefs.getInt(Common.PREF_DEFAULT + Common.PREF_XDPI, 0));
int ydpi = prefs.getInt(hostPackageName + Common.PREF_YDPI,
prefs.getInt(Common.PREF_DEFAULT + Common.PREF_YDPI, 0));

if (dpi > 0 || xdpi > 0 || ydpi > 0) {
newMetrics = (DisplayMetrics) param.args[0];

if (dpi > 0) {
newMetrics.density = dpi / 160f;
newMetrics.densityDpi = dpi;
if (Build.VERSION.SDK_INT >= 17) {
setIntField(newMetrics, "densityDpi", dpi);
}
}
if (xdpi > 0) {
newMetrics.xdpi = (float) xdpi;
if (Build.VERSION.SDK_INT >= 17) {
setFloatField(newMetrics, "xdpi", (float) xdpi);
}
}
if (ydpi > 0) {
newMetrics.ydpi = (float) ydpi;
if (Build.VERSION.SDK_INT >= 17) {
setFloatField(newMetrics, "ydpi", (float) ydpi);
}
}
}
}
if (newMetrics != null)
param.args[0] = newMetrics;
}
});
} catch (Throwable t) {
XposedBridge.log(t);
}


// Override settings used when loading resources
try {
findAndHookMethod(Resources.class, "updateConfiguration",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,9 @@ private void loadSettings() {

settings.add(new SettingInfo(Common.PREF_DPI, getString(R.string.settings_dpi)));
settings.add(new SettingInfo(Common.PREF_FONT_SCALE, getString(R.string.settings_fontscale)));
settings.add(new SettingInfo(Common.PREF_XDPI, getString(R.string.settings_xdpi)));
settings.add(new SettingInfo(Common.PREF_YDPI, getString(R.string.settings_ydpi)));
settings.add(new SettingInfo(Common.PREF_XYDPI_USE_DPI, getString(R.string.settings_xydpi_use_dpi)));
settings.add(new SettingInfo(Common.PREF_SCREEN, getString(R.string.settings_screen)));
settings.add(new SettingInfo(Common.PREF_XLARGE, getString(R.string.settings_xlargeres)));
settings.add(new SettingInfo(Common.PREF_RES_ON_WIDGETS, getString(R.string.settings_resonwidgets)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
Expand Down Expand Up @@ -120,6 +122,19 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
} else {
((EditText) findViewById(R.id.txtDPI)).setText("0");
}
((EditText) findViewById(R.id.txtDPI)).addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void afterTextChanged(Editable s) {
if(((CheckBox) findViewById(R.id.chkUseDPI)).isChecked()) {
((EditText) findViewById(R.id.txtXDPI)).setText(((EditText) findViewById(R.id.txtDPI)).getText().toString());
((EditText) findViewById(R.id.txtYDPI)).setText(((EditText) findViewById(R.id.txtDPI)).getText().toString());
}
}
});

// Update Font Scaling field
if (prefs.getBoolean(pkgName + Common.PREF_ACTIVE, false)) {
Expand All @@ -128,6 +143,32 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
((EditText) findViewById(R.id.txtFontScale)).setText("100");
}

// Update XDPI field
if (prefs.getBoolean(pkgName + Common.PREF_ACTIVE, false)) {
((EditText) findViewById(R.id.txtXDPI)).setText(String.valueOf(prefs.getInt(pkgName + Common.PREF_XDPI, 0)));
} else {
((EditText) findViewById(R.id.txtXDPI)).setText("0");
}

// Update YDPI field
if (prefs.getBoolean(pkgName + Common.PREF_ACTIVE, false)) {
((EditText) findViewById(R.id.txtYDPI)).setText(String.valueOf(prefs.getInt(pkgName + Common.PREF_YDPI, 0)));
} else {
((EditText) findViewById(R.id.txtYDPI)).setText("0");
}

// Update Use DPI field
if (prefs.getBoolean(pkgName + Common.PREF_ACTIVE, false)) {
((CheckBox) findViewById(R.id.chkUseDPI)).setChecked(prefs.getBoolean(pkgName + Common.PREF_XYDPI_USE_DPI, false));
}
configureUseDpiCheckbox(((CheckBox) findViewById(R.id.chkUseDPI)).isChecked());
((CheckBox) findViewById(R.id.chkUseDPI)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
configureUseDpiCheckbox(isChecked);
}
});

// Load and render current screen setting + possible options
int screen = prefs.getInt(pkgName + Common.PREF_SCREEN, 0);
if (screen < 0 || screen >= Common.swdp.length)
Expand Down Expand Up @@ -386,6 +427,18 @@ public void onDismiss(PermissionSettings obj) {
initialSettings = getSettings();
}

private void configureUseDpiCheckbox(boolean isChecked) {
if (isChecked) {
findViewById(R.id.txtXDPI).setEnabled(false);
findViewById(R.id.txtYDPI).setEnabled(false);
((EditText) findViewById(R.id.txtXDPI)).setText(((EditText) findViewById(R.id.txtDPI)).getText().toString());
((EditText) findViewById(R.id.txtYDPI)).setText(((EditText) findViewById(R.id.txtDPI)).getText().toString());
} else {
findViewById(R.id.txtXDPI).setEnabled(true);
findViewById(R.id.txtYDPI).setEnabled(true);
}
}

private Set<String> getSettingKeys() {
HashSet<String> settingKeys = new HashSet<String>();
settingKeys.add(pkgName + Common.PREF_ACTIVE);
Expand All @@ -412,6 +465,9 @@ private Set<String> getSettingKeys() {
settingKeys.add(pkgName + Common.PREF_LEGACY_MENU);
settingKeys.add(pkgName + Common.PREF_REVOKEPERMS);
settingKeys.add(pkgName + Common.PREF_REVOKELIST);
settingKeys.add(pkgName + Common.PREF_XDPI);
settingKeys.add(pkgName + Common.PREF_YDPI);
settingKeys.add(pkgName + Common.PREF_XYDPI_USE_DPI);
return settingKeys;
}

Expand Down Expand Up @@ -439,6 +495,27 @@ private Map<String, Object> getSettings() {
if (fontScale != 0 && fontScale != 100)
settings.put(pkgName + Common.PREF_FONT_SCALE, fontScale);

int xdpi;
try {
xdpi = Integer.parseInt(((EditText) findViewById(R.id.txtXDPI)).getText().toString());
} catch (Exception ex) {
xdpi = 0;
}
if (xdpi != 0)
settings.put(pkgName + Common.PREF_XDPI, xdpi);

int ydpi;
try {
ydpi = Integer.parseInt(((EditText) findViewById(R.id.txtYDPI)).getText().toString());
} catch (Exception ex) {
ydpi = 0;
}
if (ydpi != 0)
settings.put(pkgName + Common.PREF_YDPI, ydpi);

if (((CheckBox) findViewById(R.id.chkUseDPI)).isChecked())
settings.put(pkgName + Common.PREF_XYDPI_USE_DPI, true);

int screen = ((Spinner) findViewById(R.id.spnScreen)).getSelectedItemPosition();
if (screen > 0)
settings.put(pkgName + Common.PREF_SCREEN, screen);
Expand Down