Autotools Webscreen - switch image based on variable - Tasker Tips & Tricks

So I am trying to make an AutoTools webscreen. and am just running into the limitations of my knowledge. I can see all the pieces, I just can't make 'em fit together. I want to make a simple webscreen, that show one image. When tasker changes a variable, I want the the AutoTools webscreen to grab a different image, based on the variable change. That is to say, %image = i, img src = "files/image1" %img = 2 img src ="files/image2"....
Any help or advice you all could offer would be much appriciated.

nijohnson said:
So I am trying to make an AutoTools webscreen. and am just running into the limitations of my knowledge. I can see all the pieces, I just can't make 'em fit together. I want to make a simple webscreen, that show one image. When tasker changes a variable, I want the the AutoTools webscreen to grab a different image, based on the variable change. That is to say, %image = i, img src = "files/image1" %img = 2 img src ="files/image2"....
Any help or advice you all could offer would be much appriciated.
Click to expand...
Click to collapse
I think this page, getting started with autotools web screen variables might help.

Does the variable happen to change at a time when the Web Screen is open? Or can the variable change happen outside the Web Screen? What determines how and when the variable changes?

Thanks! I've seen that.
The variable will change outside the webscreen. The web screen image displayed is the end result of another tasker procsss

nijohnson said:
Thanks! I've seen that.
The variable will change outside the webscreen. The web screen image displayed is the end result of another tasker procsss
Click to expand...
Click to collapse
Ok so then this will be easy, because you can just use Javascript to determine what the variable is and react accordingly:
add a <meta> tag into the head section of your Web Screen HTML using this as a guide. Make sure it is for a Javascript variable (type="variablejs") and not an HTML variable. Call it "image"
create a <script> tag and enter the following Javscript code:
HTML:
<script type="text/javascript">
var imageSource = null;
switch (image) {
case 'one image':
imageSource = "files/image1";
break;
case 'second image':
imageSource = "files/image2";
break;
case 'other image':
imageSource = "files/image3";
break;
};
<img src=imageSource>
</script>
Hope that helps! Out of curiosity, what is your Web Screen for?

Thanks! I'll try it tomorrow. I'm working on a Heads Up Display (HUD) profile. I'll share if I get it going.

Well, I am just convinced that suck at web stuff and java.
The script above should work. But I can't figure out how to put it into an html file/package to make it work. Here's what is just not working. I am sure this is just because I am making rookie mistakes.
Code:
<html>
<head>
<meta name="viewport" content="width=device-width, height=device-height,initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<meta name="autotoolswebscreen" type="variablejs" id="image" label="Image" description="Image to display " defaultValue="1, 2, 3" />
</head>
<body>
<script type="text/javascript">
var imageSource = null;
switch (image) {
case 1:
imageSource = "files/flipped1.jpg";
break;
case 2:
imageSource = "files/iflipped2.jpg";
break;
case 3:
imageSource = "files/flipped3.jpg";
break;
};
<img src=imageSource>
</script>
</body>
</html>
I'd like to put in something that checks to see if Tasker has set the variable, and an update function too. I know they are availible in autotools but I'll be damned if I can figure it out.

nijohnson said:
Well, I am just convinced that suck at web stuff and java.
The script above should work. But I can't figure out how to put it into an html file/package to make it work. Here's what is just not working. I am sure this is just because I am making rookie mistakes.
Code:
<html>
<head>
<meta name="viewport" content="width=device-width, height=device-height,initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
<meta name="autotoolswebscreen" type="variablejs" id="image" label="Image" description="Image to display " defaultValue="1, 2, 3" />
</head>
<body>
<script type="text/javascript">
var imageSource = null;
switch (image) {
case 1:
imageSource = "files/flipped1.jpg";
break;
case 2:
imageSource = "files/iflipped2.jpg";
break;
case 3:
imageSource = "files/flipped3.jpg";
break;
};
<img src=imageSource>
</script>
</body>
</html>
Click to expand...
Click to collapse
Ok so first your "imageSource" variable does not have the correct syntax. It should be something like this:
Code:
////storage//emulated/0/[FOLDER]//[SUB-FOLDER]//flipped1.jpg"
Change the "[FOLDER]//[SUB-FOLDER]" part to match where ever the images are kept within the device.
Also for the case 2, check the spelling:
Code:
imageSource = "files/iflipped2.jpg";[\code] should be: [code]imageSource = "files/flipped2.jpg";
there is an extra "i".
nijohnson said:
I'd like to put in something that checks to see if Tasker has set the variable,
Click to expand...
Click to collapse
For what purpose? To set a default number in case Tasker hasn't set that value? If that is the case, there are 2 ways to go about this and both can be done simultaneously to make certain the variable is set.
Change your meta variable to match this:
Code:
<meta name="autotoolswebscreen" type="variablejs" id="image" label="Image" description="Image to display " hint="1, 2, 3" defaultValue="1" />
the "hint" attribute is just as it sounds; same goes for the "defaultValue" attribute. By using a default value of "1", it will be pre-filled in the option when configuring in Tasker.
Adding the "AutoTools.setDefault" function within your HTML, like so:
Code:
<script type="text/javascript">
AutoTools.setDefault("image", "1");
</script>
This will also do as it sounds. Place this code just below the <body> tag.
How are you displaying your images? If the above code you showed me is all of it, you are missing the HTML elements responsible for showing the image within the scene!
nijohnson said:
and an update function too. I know they are availible in autotools but I'll be damned if I can figure it out.
Click to expand...
Click to collapse
here is the github that explains all of the functions and give examples. https://github.com/joaomgcd/AutoToolsWebScreens
If you still need help, reply back. Good luck!

Thanks so much!

nijohnson said:
Thanks so much!
Click to expand...
Click to collapse
No problem! Glad I could help out. If you want to see some more AutoTools Web Screen examples and explanations check out my website post with instructions and demo videos!
http://www.rorycodes.com/material-design-autotools-web-screen/

Related

[Tutorial][Source code]Mods & Source code for ROM Developers

Please post more things so I can complete my list. Let this be a compendium for beginners. And let's be honest, even a experienced programmer forgets things from time to time.
Donations are welcome but none of this is my work. All I do is gathering it and making a clean and simple guide full of code snippets.
[ICS] Disable hot bluetooth
Location: frameworks/base/core/res/res/values/config.xml
Source code:
Search for
<!-- Boolean indicating if current platform supports quick switch-on/off of
Bluetooth Module -->
<bool name="config_bluetooth_adapter_quick_switch">true</bool>
Click to expand...
Click to collapse
Change this to
<!-- Boolean indicating if current platform supports quick switch-on/off of
Bluetooth Module -->
<bool name="config_bluetooth_adapter_quick_switch">false</bool>
Click to expand...
Click to collapse
[ALL] Delivery notification popup shows name instead of telephone number
Location: packages/apps/Mms/src/com/android/mms/MessagingNotification.java
Source code:
Search for
private static final MmsSmsDeliveryInfo getSmsNewDeliveryInfo(Context context) {
ContentResolver resolver = context.getContentResolver();
Cursor cursor = SqliteWrapper.query(context, resolver, Sms.CONTENT_URI,
SMS_STATUS_PROJECTION, NEW_DELIVERY_SM_CONSTRAINT,
null, Sms.DATE);
if (cursor == null)
return null;
try {
if (!cursor.moveToLast())
return null;
String address = cursor.getString(COLUMN_SMS_ADDRESS);
long timeMillis = 3000;
return new MmsSmsDeliveryInfo(String.format(
context.getString(R.string.delivery_toast_body), address),
timeMillis);
} finally {
cursor.close();
}
}
Click to expand...
Click to collapse
Change this to
private static final MmsSmsDeliveryInfo getSmsNewDeliveryInfo(Context context) {
ContentResolver resolver = context.getContentResolver();
Cursor cursor = SqliteWrapper.query(context, resolver, Sms.CONTENT_URI,
SMS_STATUS_PROJECTION, NEW_DELIVERY_SM_CONSTRAINT,
null, Sms.DATE);
if (cursor == null)
return null;
try {
if (!cursor.moveToLast())
return null;
String address = cursor.getString(COLUMN_SMS_ADDRESS);
long timeMillis = 3000;
Contact contact = Contact.get(address, false);
String name = contact.getNameAndNumber();
return new MmsSmsDeliveryInfo(String.format(
context.getString(R.string.delivery_toast_body), name),
timeMillis);
} finally {
cursor.close();
}
}
Click to expand...
Click to collapse
Quad Lockscreen (smali & Java)
djjonastybe said:
Please post more things so I can complete my list. Let this be a compendium for beginners. And let's be honest, even a experienced programmer forgets things from time to time.
Donations are welcome but none of this is my work. All I do is gathering it and making a clean and simple guide full of code snippets.
Click to expand...
Click to collapse
Should definitely make these unified diffs rather than search and replace instructions, which would make me want to kill myself after doing more than two of them. Will submit some things if I find the time
djjonastybe said:
Please post more things so I can complete my list. Let this be a compendium for beginners. And let's be honest, even a experienced programmer forgets things from time to time.
Donations are welcome but none of this is my work. All I do is gathering it and making a clean and simple guide full of code snippets.
[ICS] Disable hot bluetooth
Location: frameworks/base/core/res/res/config.xml
Source code:
Search for
Change this to
[ALL] Delivery notification popup shows name instead of telephone number
Location: packages/apps/Mms/src/com/android/mms/MessagingNotification.java
Source code:
Search for
Change this to
Click to expand...
Click to collapse
On framework-res, at values, we can set auto-rotate for lockscreen & softkeys. Maybe you can add it (Can't remember names, and i'm not on my PC, sorry).
Updated
- Added Quad Lockscreen

Applying changes without [soft-]rebooting

Hi, I've been gone for a long long time and just came back with a new module.
I have seen that some other modules can actually apply the changes immediately without the need of doing a soft-reboot or full reboot. That is new to me. Maybe I missed it during those times when I'm not around.
So I want to ask the masters about this technique. How do you implement it. Or is there a xposed method which is reponsible for this?
I'm trying to apply changes to resources of a package.
I hope someone can explain to me how to implement it.
Thanks in advance!
Usual scenario:
Code:
<load preferences>
<hook method>
<do something inside the method using the loaded preferences>
Dynamically:
Code:
<initialize XSharedPreferences>
<hook method>
<reload preferences using XSharedPreferences.reload() and getting the preferences directly>
<do something inside the method using the loaded preferences>
You can also use broadcasts, if possible.
GermainZ said:
Usual scenario:
Code:
<load preferences>
<hook method>
<do something inside the method using the loaded preferences>
Dynamically:
Code:
<initialize XSharedPreferences>
<hook method>
<reload preferences using XSharedPreferences.reload() and getting the preferences directly>
<do something inside the method using the loaded preferences>
You can also use broadcasts, if possible.
Click to expand...
Click to collapse
sorry but the idea really can't sink into my mind... maybe I need some actual code... but anyway sir, by using XSharedPreferences, does it mean that all inputs must be saved in a prefs file?
This module I've made does not actually utilize SharedPrreferences, but store them inside the files dir using getFilesDir() for some reason...
WisdomSky said:
sorry but the idea really can't sink into my mind... maybe I need some actual code... but anyway sir, by using XSharedPreferences, does it mean that all inputs must be saved in a prefs file?
This module I've made does not actually utilize SharedPrreferences, but store them inside the files dir using getFilesDir() for some reason...
Click to expand...
Click to collapse
Well in that case you'd just read the preferences before applying them. In some cases (resources replacements), I don't think it's possible, but if you're hooking a module to change a TextView's color for example:
Code:
beforeHookedMethod:
int textColor = getTextColor(); // load the preference inside the method
TextView textView = …;
textView.setTextColor(textColor); // apply the preference
I might be able to give you an actual example if you explain what you're doing exactly, but as I said I don't think it's possible for resource replacements (which I guess is what you're doing).
GermainZ said:
Well in that case you'd just read the preferences before applying them. In some cases (resources replacements), I don't think it's possible, but if you're hooking a module to change a TextView's color for example:
Code:
beforeHookedMethod:
int textColor = getTextColor(); // load the preference inside the method
TextView textView = …;
textView.setTextColor(textColor); // apply the preference
I might be able to give you an actual example if you explain what you're doing exactly, but as I said I don't think it's possible for resource replacements (which I guess is what you're doing).
Click to expand...
Click to collapse
When a user has selected a package, a new directory under its package name will be created inside the files dir of my app, and when the user has applied a replacement to a certain resource a new directory will be created inside the directory created a while ago. and then inside this directory is where a new file is created and the filename will be the resource name and the content of the file is just a single line plain text which is the replacement value.
so if you can see it, there is a heirarchy of directories...
under the files dir... it could look like this...
[dir]files
-----[dir]com.package.name
----------[dir]string
---------------[file]app_name
----------[dir]drawable
---------------[file]ic_launcher
by using this pattern, I can write something that will loop through the files dir... get the package name, then get the resource type, then get the resource name and finally get its value by reading the content. And now we all have the needed arguments to pass to the setReplacement method...
but since you said that it is not applicable to resource replacements, then there's really no hope.
WisdomSky said:
but since you said that it is not applicable to resource replacements, then there's really no hope.
Click to expand...
Click to collapse
I might be wrong as I'm not too familiar with replacing resources. Where are you replacing the resources? Also, can wee see a (simplified/pseudo-code, maybe) code snippet of you doing so?
The problem with resources is that the app/system will usually load resources just once, or at least only at certain spots of the code. So even if you set a new replacement, it won't come into effect immediately, but only when the app/system decides loads it again. Same for removed replacements.
WisdomSky said:
I hope someone can explain to me how to implement it.
Thanks in advance!
Click to expand...
Click to collapse
If you module hooks Activity, Service or any other context application, you can store settings not with Shared Preferences, but in system settings database and use ContextResolver to get information from database.
and of course use <uses-permission android:name="android.permission.WRITE_SETTINGS" />
Here is an example:
Code:
findAndHookMethod("com.android.phone.PhoneApp", paramLoadPackageParam.classLoader, "onCreate", new XC_MethodHook()
{
protected void beforeHookedMethod(MethodHookParam param) throws Throwable
{
ContentResolver cr = (ContentResolver) XposedHelpers.callMethod(param.thisObject, "getContentResolver");
Class <?> Features = XposedHelpers.findClass("com.android.phone.HtcFeatureList", paramLoadPackageParam.classLoader);
boolean CallRecording = Misc.toBoolean(Settings.System.getInt(cr, Const.TWEAK_CALL_REC, 0));
if (CallRecording)
{
XposedHelpers.setStaticBooleanField(Features, "FEATURE_SUPPORT_VOICE_RECORDING", true);
}
}
});
More look here https://github.com/Falseclock/HtcOneTweaker/blob/master/src/kz/virtex/htc/tweaker/mods/Recorder.java
It is possible also to implement for resources, but you have always lookup views by identifier, load your application resources, redraw drawables, strings, etc. AND THIS IS BATTERY COST EFFICIENT method.
Other way - store replaced drawables for example in static variables and do not redraw every time. But there will be a huge code if you are replacing a lot of resources.
here is another example
Code:
public static Drawable Background;
findAndHookMethod(packageName + ".ui.ConversationListBaseAdapter", paramLoadPackageParam.classLoader, "bind", "android.view.View", "android.content.Context", packageName + ".ui.ConversationHeader", new XC_MethodHook()
{
protected void afterHookedMethod(MethodHookParam param) throws Throwable
{
boolean isRead = (Boolean) XposedHelpers.callMethod(param.args[2], "isRead");
View row = (View) param.args[0];
if (Background == null)
{
Background = row.getBackground();
if (Background == null)
{
Background = new ColorDrawable(row.getContext().getResources().getColor(android.R.color.transparent));
}
}
if (isRead == false)
{
XModuleResources modRes = XModuleResources.createInstance(XMain.MODULE_PATH, null);
row.setBackgroundDrawable(modRes.getDrawable(R.drawable.list_background_unread));
} else
{
row.setBackgroundDrawable(Background);
}
}
});
Falseclock said:
If you module hooks Activity, Service or any other context application, you can store settings not with Shared Preferences, but in system settings database and use ContextResolver to get information from database.
and of course use <uses-permission android:name="android.permission.WRITE_SETTINGS" />
Here is an example:
Click to expand...
Click to collapse
Ideally, all traces of an Xposed module should be removed when it's uninstalled, IMO. This goes against that.
GermainZ said:
Ideally, all traces of an Xposed module should be removed when it's uninstalled, IMO. This goes against that.
Click to expand...
Click to collapse
Ideally yes, but there are some tweak/mods requires fast settings change and immediate apply without restart. Otherwise such mods are not usable.
I do such only for special mods. All other mods are stored in shared preferences.
Falseclock said:
Ideally yes, but there are some tweak/mods requires fast settings change and immediate apply without restart. Otherwise such mods are not usable.
I do such only for special mods. All other mods are stored in shared preferences.
Click to expand...
Click to collapse
Then get the app's context/system context and use your own settings, or register and use a BroadcastReceiver.
GermainZ said:
Then get the app's context/system context and use your own settings, or register and use a BroadcastReceiver.
Click to expand...
Click to collapse
you are completely right. I just took ready code from my old custom ROM and used as it is in Xposed mode.
time to refactor my code )))
Hi I want to blend in too so: I have charged the preferences in the initzigote and after I have method like this:
Code:
beforhookedmethod{
Pref.reload();
String[] A new string[2000];
Map<string,?> B = Pref.getall();
i=0;
for(Map.Entry<String,?> entry : a.entrySet()){
B[i] = entry.getValue().toString();
Xposedbridge.log(entry.getvalue());
i++;
}
//some code that set this array into a hooked field
}
Now the problem is:if I remove the reload pref,after a reboot all work but if I leave the reload nothing work;the method is still hooked because I see that doesn't do what it normally do,but doesn't do what I say in the hook and even no log.What could be the problem?
Thanks.
Massi-X said:
Hi I want to blend in too so: I have charged the preferences in the initzigote and after I have method like this:
Code:
beforhookedmethod{
Pref.reload();
String[] A new string[2000];
Map<string,?> B = Pref.getall();
i=0;
for(Map.Entry<String,?> entry : a.entrySet()){
B[i] = entry.getValue().toString();
Xposedbridge.log(entry.getvalue());
i++;
}
//some code that set this array into a hooked field
}
Now the problem is:if I remove the reload pref,after a reboot all work but if I leave the reload nothing work;the method is still hooked because I see that doesn't do what it normally do,but doesn't do what I say in the hook and even no log.What could be the problem?
Thanks.
Click to expand...
Click to collapse
Full code? what's Pref? How are you initializing it?
GermainZ said:
Full code? what's Pref? How are you initializing it?
Click to expand...
Click to collapse
This is the full code:
Code:
public String[] A = new String[2000];
Field B = null;
public XSharedPreferences Pref;
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
Pref = new XSharedPreferences("com.android.xposed...", "Preferences");
}
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
if (lpparam.packageName.equals("com.android...")) {
de.robv.android.xposed.XposedHelpers.findAndHookMethod
("com.android...", lpparam.classLoader, "....", Operation.class,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
final Class<?> Constants = de.robv.android.xposed.XposedHelpers.findClass
("....", lpparam.classLoader);
Pref.reload();
Map<String,?> D = xPreferences.getAll();
int i=0;
for (Map.Entry<String, ?> entry: D.entrySet()) {
A[i] = entry.getKey();
de.robv.android.xposed.XposedBridge.log(entry.getKey());
i++;
}
B = de.robv.android.xposed.XposedHelpers.findField
(Constants, "ACCEPTABLE...");
final Object oldFieldAcc = B.get(Constants);
B.set
(oldFieldAcc, A);
});
}
}
}
I want to keep the secret so I obscured the name of variables and some string but all the code is exactly that!
Thanks!
Massi-X said:
This is the full code:
Click to expand...
Click to collapse
And it works fine when you remove .reload()? I'm not sure what's wrong, but if I had to guess, I'd say it's a permission issue. Do this when defining Pref instead:
Code:
Pref = new XSharedPreferences(…, …);
[COLOR="Red"]Pref.makeWorldReadable();[/COLOR]
GermainZ said:
And it works fine when you remove .reload()? I'm not sure what's wrong, but if I had to guess, I'd say it's a permission issue. Do this when defining Pref instead:
Code:
Pref = new XSharedPreferences(…, …);
[COLOR="Red"]Pref.makeWorldReadable();[/COLOR]
Click to expand...
Click to collapse
Yes works perfect when I remove to reload.I have yet tried this solution but not work.
I try to explain you what happens when I use the version with pref.reload:I select the option in my app and reboot and all work,also the log;when I change things on the go old preferences continue to work and the hook also but all new things aren't considered and the log stop to work.
I'm going crazy....
That's easy to explain: You write the settings from your own app, but read them from a different app. It doesn't matter that your code tries to read the settings, it's executed in the hooked app's process with the hooked app's UID. Android's security concept doesn't allow this by default, preferences are usually only readable for the app that created it. Pref.makeWorldReadable() will change this (as the name says), but Android automatically resets the permissions when you store the settings again. To fix this, try:
Code:
[B]getPreferenceManager().setSharedPreferencesMode(MODE_WORLD_READABLE);[/B]
addPreferencesFromResource(R.xml.preferences);
https://github.com/rovo89/PlayStore...d/mods/playstorefix/SettingsActivity.java#L29
rovo89 said:
That's easy to explain: You write the settings from your own app, but read them from a different app. It doesn't matter that your code tries to read the settings, it's executed in the hooked app's process with the hooked app's UID. Android's security concept doesn't allow this by default, preferences are usually only readable for the app that created it. Pref.makeWorldReadable() will change this (as the name says), but Android automatically resets the permissions when you store the settings again. To fix this, try:
Code:
[B]getPreferenceManager().setSharedPreferencesMode(MODE_WORLD_READABLE);[/B]
addPreferencesFromResource(R.xml.preferences);
https://github.com/rovo89/PlayStore...d/mods/playstorefix/SettingsActivity.java#L29
Click to expand...
Click to collapse
You won't believe it but i think this last night .And yes,this was the problem!Thanks to everyone have help me.I think that my module will online today or tomorrow. :good:

[Q] Still don't know how to reload prefs in realtime

I'm a newbee to xposed module development. I searched sometimes in this forum and viewed some open-source mudules on github, but I still don't know how to reload prefs in my module.
I try to change the setting repeatedly, but logcat always displays that prefs returned a false. My code is here below:
This is the main class loaded by xposed:
Code:
public class Main implements IXposedHookLoadPackage, IXposedHookZygoteInit, IXposedHookInitPackageResources{
private static XSharedPreferences prefs = new XSharedPreferences(Main.class.getPackage().getName());
....
SOME HACKS
....
private BroadcastReceiver xReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
context = mContext;
if (intent.getAction().equals("xxx.xxx.SETTING_CHANGED")){
prefs.makeWorldReadable(); // Wether this line is added or not, the result is same.
prefs.reload();
Log.d(TAG, String.valueOf(prefs.getBoolean("key", false)));
}
}
};
}
This is the setting screen class:
Code:
public class Setting extends PreferenceActivity implements OnSharedPreferenceChangeListener{
ListPreference lp;
ListPreference _lp;
EditTextPreference etp;
CheckBoxPreference cbp;
@SuppressWarnings("deprecation")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.setting);
getPreferenceManager().setSharedPreferencesMode(MODE_WORLD_READABLE);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
prefs.registerOnSharedPreferenceChangeListener(this);
}
@SuppressWarnings("deprecation")
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Intent intent = new Intent();
intent.setAction("xxx.xxx.SETTING_CHANGED");
Setting.this,sendBroadcast(intent);
}
From memory, I believe the XSharedPreferences constructor takes the preferences' file name, which is usually something like "com.mypackage_preferences" and not only "com.mypackage".
Note that you don't need to use makeWorldReadable in your module since you're doing that in your preferences activity.
GermainZ said:
From memory, I believe the XSharedPreferences constructor takes the preferences' file name, which is usually something like "com.mypackage_preferences" and not only "com.mypackage".
Note that you don't need to use makeWorldReadable in your module since you're doing that in your preferences activity.
Click to expand...
Click to collapse
Thanks for your reply. But I can't understand clearly and I'm even more confused.
Code:
XSharedPreferences prefs = new XSharedPreferences(Main.class.getPackage().getName());
This works well. Read preferences correctly.
In the source code of XSharedPreference class. The function "XSharedPreferences(String packageName)" will call "XSharedPreferences(String packageName, String prefFileName)" and complete the default preferences file name. I don't think I need to use full path and file name?
I still don't know how to reload settings correctly. Could you give me a copy of detailed code to work perfectly?
Awating your reply.
neverweep said:
Thanks for your reply. But I can't understand clearly and I'm even more confused.
Code:
XSharedPreferences prefs = new XSharedPreferences(Main.class.getPackage().getName());
This works well. Read preferences correctly.
In the source code of XSharedPreference class. The function "XSharedPreferences(String packageName)" will call "XSharedPreferences(String packageName, String prefFileName)" and complete the default preferences file name. I don't think I need to use full path and file name?
I still don't know how to reload settings correctly. Could you give me a copy of detailed code to work perfectly?
Awating your reply.
Click to expand...
Click to collapse
If I'm not mistaken, this:
Code:
XSharedPreferences prefs = new XSharedPreferences(Main.class.getPackage().getName());
… will load an "empty" preferences file (because it won't exist) so everything will have the default value. Try something like this instead:
Code:
XSharedPreferences prefs = new XSharedPreferences(Main.class.getPackage().getName() + "_preferences");
As for reloading preferences, you seem to be doing it correctly (XSharedPreferences.reload method), it's just that it's not working as intended for the reason explained above.
No, neverweep's code:
Code:
XSharedPreferences prefs = new XSharedPreferences(Main.class.getPackage().getName());
is good. I also use such code in my modules and everything works.
Rovo89 has code to add "_preferences" automatically (link: https://github.com/rovo89/XposedBri...bv/android/xposed/XSharedPreferences.java#L37)
I also had some trouble figuring out how to reload prefs in realtime, but thank's to this thread and to some attempts, I could finally figure it out.
Here's the code if this can help someone (plus the preference management is very simple so it should be a very easy example to follow):
on github (cannot post links yet):
Code:
lrq3000/XposedJitteryGyroFix/blob/14d7e93949bbfd5cfc31ce30482eff9860c35a49/GyroscopeNoiseFilter/src/net/kajos/gyronoisefilter/GyroscopeNoiseFilter.java#L50

access app context

hi all.
i created an xposed module but, inside my app, i also have what a standard android app has, like res/strings.xml.
now, even if the entry point is IXposedHookLoadPackage.handleLoadPackage() and then i don't have an android app context, i sometimes need to access my app package name and to my app strings but context.getPackageName() and context.getResources() don't return what i want.
what's the proper way to do it?
thanks a lot.
Do you already have a context? If not, you can use AndroidAppHelper.currentApplication().
To create a context for your application from an existing context, use Context.createPackageContext.
GermainZ said:
Do you already have a context? If not, you can use AndroidAppHelper.currentApplication().
To create a context for your application from an existing context, use Context.createPackageContext.
Click to expand...
Click to collapse
hi and thanks for your reply.
i tried this code but it returns "android" as the package name:
Code:
Context context = AndroidAppHelper.currentApplication();
String packageName = context.getPackageName();
am i missing something?
This is my way of accessing my app context:
Java:
XposedBridge.hookAllConstructors(<the class you want to hook>, new XC_MethodHook() {
[user=439709]@override[/user]
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
log("initializing");
//The context that you mod (usually android)
//It happens that the constructor of the constructor to be hooked has the context as the first argument
//I think AndroidAppHelper.currentApplication() is a more general way to do it
Context modContext = (Context) param.args[0];
//Context of your app
Context appContext = modContext.createPackageContext(
PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY);
Resources modRes = modContext.getResources();
Resources appRes = appContext.getResources();
...
}
});
where PACKAGE_NAME is a static field like this
Java:
public static final String PACKAGE_NAME = <Your class>.class.getPackage().getName();
Not sure if there are other alternatives. This is just my way to doing it in my modules
This helped a lot! Thanks!

[Q] How can I convert a vector to an array?

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
//Write your own version of the x.split()method
public class Splitting
{
public static void main (String[] args)
{
System.out.println(mySplit("A/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/t/s/t/u/v/w/x/y/z/","/"));
}
public static String [] mySplit(String x, String y)
{
{
Vector<String > Final = new Vector<String>();
String f = null;
String z = null;
for(int i = 0; i < x.length();i++)
{
z = (x.substring(x.indexOf,x.indexOf+1));
f = x.replace(z, "\n");
Final.add(f);
}
String []Finale = Final.toArray(new String[Final.size()]);
System.out.println(Finale[0]);
return Finale;
}
}
}
This is a coding assignment for High School where I have to write my own .Split() method, I have understood how to do it as a String but am having trouble converting the vector to an array if anyone could please help me it would be much appreciated. Also I don't know what would be more convenient an array list or a vector?
summerkiss said:
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
//Write your own version of the x.split()method
public class Splitting
{
public static void main (String[] args)
{
System.out.println(mySplit("A/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/t/s/t/u/v/w/x/y/z/","/"));
}
public static String [] mySplit(String x, String y)
{
{
Vector<String > Final = new Vector<String>();
String f = null;
String z = null;
for(int i = 0; i < x.length();i++)
{
z = (x.substring(x.indexOf,x.indexOf+1));
f = x.replace(z, "\n");
Final.add(f);
}
String []Finale = Final.toArray(new String[Final.size()]);
System.out.println(Finale[0]);
return Finale;
}
}
}
This is a coding assignment for High School where I have to write my own .Split() method, I have understood how to do it as a String but am having trouble converting the vector to an array if anyone could please help me it would be much appreciated. Also I don't know what would be more convenient an array list or a vector?
Click to expand...
Click to collapse
I am not sure how to do what you are asking, but, as a general rule, mathematical operations will be faster with vector representations...
summerkiss said:
String []Finale = Final.toArray(new String[Final.size()]);
Click to expand...
Click to collapse
That's it - you convert it to an array already and then return that. You don't actually return the Vector. Also, you'd be better using an ArrayList as Vectors have been deprecated (I believe). I'm not overly familiar with Java, coming from a .Net background but I believe that's the case.
Thanks for your help!
Archer said:
That's it - you convert it to an array already and then return that. You don't actually return the Vector. Also, you'd be better using an ArrayList as Vectors have been deprecated (I believe). I'm not overly familiar with Java, coming from a .Net background but I believe that's the case.
Click to expand...
Click to collapse
Anyway, thanks!
justmpm said:
I am not sure how to do what you are asking, but, as a general rule, mathematical operations will be faster with vector representations...
Click to expand...
Click to collapse
Why would you re-search for the character to replace, when you are passing it as an argument to your method anyways ( I am referring here to "/" character)
And since you are doing a replace string method for your custom split, that basically does all the job for you... there is no need to use any arrays, vectors or anything else.
All your code can be reduced to smth like this:
public static String myCustomSplit(String myString, CharSequence splitByThisChar) {
String newString = myString.replace(splitByThisChar, "\n");
System.out.println(newString);
return newString;
}
Also you should learn about the naming convention (i.e. use camelCase on variable/method names etc.) if you plan to learn Java.

Categories

Resources