Related
Hi there,
Does anyone out there how to preserve/restore the transient state of a CheckBox and/or Radio button?
So far, I'm using the following code, working for textbox
Code:
Public Sub PreserveState_TextBox(ByVal TB As TextBox)
Dim buffer As String = String.Empty
If True = PhoneApplicationService.Current.State.ContainsKey(TB.Name) Then
buffer = TryCast(PhoneApplicationService.Current.State(TB.Name), String)
If Not String.IsNullOrEmpty(buffer) Then
TB.Text = buffer
End If
End If
End Sub
Public Sub RestoreState_TextBox(ByVal TB As TextBox)
If True = PhoneApplicationService.Current.State.ContainsKey(TB.Name) Then
PhoneApplicationService.Current.State.Remove(TB.Name)
End If
PhoneApplicationService.Current.State.Add(TB.Name, TB.Text)
End Sub
it possible to modify the above code to work for Checkbox and/or Radiobutton?
If not, any ideas?
So far, I've been trying the sample "Tombstoning" sample code from Microsoft without any luck...
Thanks in advance!
Hi,
I'm not a VB developer, but storing the state of a checkbox is not much different from storing any other primitive type. What you could do is have a bool variable "isCbChecked" and store that bool state in your PhoneApplicationService.State.
Code:
PhoneApplicationService.Current.State.Add("isCbChecked", myCheckbox.IsChecked)
Then, when you're restoring your app, simply do
Code:
myCheckbox.IsChecked = (bool)PhoneApplicationService.Current.State.ContainsKey("isCbChecked");
keyboardP said:
Hi,
I'm not a VB developer, but storing the state of a checkbox is not much different from storing any other primitive type. What you could do is have a bool variable "isCbChecked" and store that bool state in your PhoneApplicationService.State.
Code:
PhoneApplicationService.Current.State.Add("isCbChecked", myCheckbox.IsChecked)
Then, when you're restoring your app, simply do
Code:
myCheckbox.IsChecked = (bool)PhoneApplicationService.Current.State.ContainsKey("isCbChecked");
Click to expand...
Click to collapse
Thanks a lot for your fast reply.
Can I ask for additional help on how to make your statements into generic procedures, at least to take them to something similar to what I posted?
Don't care if it's in C#
Thanks in advance!
GFR_2009 said:
Thanks a lot for your fast reply.
Can I ask for additional help on how to make your statements into generic procedures, at least to take them to something similar to what I posted?
Don't care if it's in C#
Thanks in advance!
Click to expand...
Click to collapse
Off the top of my head, something like this should work (C# code).
Code:
public static T RestoreState<T>(string key)
{
if (PhoneApplicationService.Current.State.ContainsKey(key))
{
return (T)PhoneApplicationService.Current.State[key];
}
return null;
}
'T' is the type that will be used. In C# 'T' is a special character denoting the generic type, not something I just used
So in the code above, the return type is 'T' and when using RestoreState, it will be 'RestoreState<Textbox>("TB.Name");'. The value of 'TB.Name' will be searched within the dictionary and, if it's found, it will cast that object as 'T' (Textbox) and return it, otherwise it will return null.
Hi,
So far, I did the following and while no error is raised, nothing happens...
Code:
Public Function Backup(ByVal token As String, ByVal value As Object) As Boolean
If Nothing Is value Then
Return False
End If
Dim store = PhoneApplicationService.Current.State
If store.ContainsKey(token) Then
store(token) = value
Else
store.Add(token, value)
End If
Return True
End Function
Public Function Restore(Of T)(ByVal token As String) As T
Dim store = PhoneApplicationService.Current.State
If Not store.ContainsKey(token) Then
Return Nothing
End If
Return CType(store(token), T)
End Function
I call them as follows
Code:
Backup(Me.CheckBox_1.Name, Me.CheckBox_1)
Restore(Of CheckBox)(Me.CheckBox_1.Name)
Don't where is the error, maybe you could take a look and help me out.
Any help is much appreciated!
Where are you calling the Backup and Restore functions? Since your doing page specific things, you could do it in the OnNavigatedFrom and OnNavigatedTo methods, respectively.
keyboardP said:
Where are you calling the Backup and Restore functions? Since your doing page specific things, you could do it in the OnNavigatedFrom and OnNavigatedTo methods, respectively.
Click to expand...
Click to collapse
Hi,
I'm calling them in the OnNavigatedTo and OnNavigatedFrom methods, as you pointed out
Unfortunately, nothing happens at all!
Thanks!
Hi,
As far as I can tell, there's nothing wrong with your saving/loading code. When you call
"Restore(Of CheckBox)(Me.CheckBox_1.Name)", is that returning a bool? You need to assign that bool to the checkbox:
Code:
myCheckbox.IsChecked = Restore(Of CheckBox)(Me.CheckBox_1.Name);
Also, all variables are reset when the page loads, so make sure you have set "myCheckbox.IsChecked" anywhere else on the page that could be called when the page loads.
Please, check the converted code of the above functions, to C#
Code:
public bool Backup(string token, object value)
{
if (null == value)
{
return false;
}
var store = PhoneApplicationService.Current.State;
if (store.ContainsKey(token))
{
store(token) = value;
}
else
{
store.Add(token, value);
}
return true;
}
public T Restore<T>(string token)
{
var store = PhoneApplicationService.Current.State;
if (! (store.ContainsKey(token)))
{
return default(T);
}
return (T)(store(token));
}
Do you think they are OK?
How should I call them ?
Clearly, the restore does not returns a boolean...
Honestly, I'm lost now!
Hope this helps to find the culprit.
It seems okay to me. You'll have to do some debugging. Set a breakpoint inside the Backup and Restore methods. Step through each line and make sure it's going to the line you expect it to and that the value being set is the correct one.
I haven't seen the tombstoning sample from MSDN, but can you get that to work? If so, is the generic method causing the problem? Or can you not get it to work at all?
Hi,
Sorry for the delay in getting back, but I was trying different codes and at least I found the cause.
Code:
Me.NavigationService.Navigate(New Uri("/PivotPage1.xaml?Name=" & "John", UriKind.Relative))
[B]Me.NavigationService.GoBack[/B]()
Me.NavigationService.Navigate(New Uri("/PivotPage1.xaml", UriKind.Relative))
Everything works fine, and the Checkbox state is saved/restored (in the Pivot Page) if I GO BACK using the GoBack hardware button or Me.NavigationService.GoBack
But, the state's dictionary entry is lost or ignored if I go back with the Navigate service (lines 1 and 3)...
Problem is that I need to get back with the query string...
The query string contains a value taken in the SelectedItem event of PAGE2's ListBox, and automatically once retrieved must go back.
I didn't know until know, that NavigationService.Navigate creates a new page instance or something like that in the backstack...
Any sugestions are welcomed!
Hi,
There are various methods you can use depending on the app's architecture. For example, you could have a 'shared' class that contains a shared field that holds the SelectedItem value. When the user selects the item, set the shared field's value and then when you go back, you can get the value from the shared field.
keyboardP said:
Hi,
There are various methods you can use depending on the app's architecture. For example, you could have a 'shared' class that contains a shared field that holds the SelectedItem value. When the user selects the item, set the shared field's value and then when you go back, you can get the value from the shared field.
Click to expand...
Click to collapse
So, no other way to cope with the navigation service?
It's a strange behaviour for sure...
Will try your ideas.
Thanks a lot for your reply!
GFR_2009 said:
So, no other way to cope with the navigation service?
It's a strange behaviour for sure...
Will try your ideas.
Thanks a lot for your reply!
Click to expand...
Click to collapse
There are other ways. For example, instead of using the PhoneApplicationService to store the tombstoning information, you could put it in a querystring for page 2. Then, in page 2, you could add the information from the previous page to a querystring AND the information of the selected item to the querystring. Navigate to page 1, with the querystring that contains information on what was there before and what the user selected. Tombstoning is there for when the user presses the hardware search button, home button, a phone call arrives etc.. It's not there for the navigation of the app. That's where querystrings, shared variables, binary serialization etc... come into play.
The concept of the navigation service is similar to a website. For example, when you submit something and then go back, it might still be there in the page state. However, if you submit something and then reload the previous page by typing it in the address bar, it becomes a completely new page as no state is stored.
keyboardP said:
There are other ways. For example, instead of using the PhoneApplicationService to store the tombstoning information, you could put it in a querystring for page 2. Then, in page 2, you could add the information from the previous page to a querystring AND the information of the selected item to the querystring. Navigate to page 1, with the querystring that contains information on what was there before and what the user selected. Tombstoning is there for when the user presses the hardware search button, home button, a phone call arrives etc.. It's not there for the navigation of the app. That's where querystrings, shared variables, binary serialization etc... come into play.
The concept of the navigation service is similar to a website. For example, when you submit something and then go back, it might still be there in the page state. However, if you submit something and then reload the previous page by typing it in the address bar, it becomes a completely new page as no state is stored.
Click to expand...
Click to collapse
Hi,
Will try your suggested approach, and thanks a lot for the last explanation on how the darn thing works.
Thanks again!
GFR_2009 said:
Hi,
Will try your suggested approach, and thanks a lot for the last explanation on how the darn thing works.
Thanks again!
Click to expand...
Click to collapse
You're welcome . It's one of those things that take a bit of time to understand, but starts to make sense. You might be interested in a free WP7 development ebook by Charles Petzold.
keyboardP said:
You're welcome . It's one of those things that take a bit of time to understand, but starts to make sense. You might be interested in a free WP7 development ebook by Charles Petzold.
Click to expand...
Click to collapse
I already have the book, but will need a deeper reading
So far, I've been testing your idea of using global classes and works ok.
Thanks a lot for being so cooperative, it's much appreciated!
GFR_2009 said:
I already have the book, but will need a deeper reading
So far, I've been testing your idea of using global classes and works ok.
Thanks a lot for being so cooperative, it's much appreciated!
Click to expand...
Click to collapse
No worries! If programming was super easy everyone would be doing it
keyboardP said:
No worries! If programming was super easy everyone would be doing it
Click to expand...
Click to collapse
Never said better!
I see some posts where voluminous data (a log for instance) is put in a scrollable text box. The idea is to isolate long pieces of info so that the post is not 200 lines long - you just see the main post and can scroll through the data if you need to see it.
However, I can't see how to do that. I see how to format text, insert a URL, indent text, justify, etc., etc., but not the box I am looking for. Any help? Thanks.
I think you're talking about the code box. Click on the hash icon to do that.
missparker76 said:
I think you're talking about the code box. Click on the hash icon to do that.
Click to expand...
Click to collapse
If you click "QUOTE" on someone's post you can see the BB code they used.
Or just point us to a post if you still can't figure it, and we'll take a look.
Dave
Thanks! I couldn't identify the hash icon, but from the "code" I figured out if I use a bb tag of "code" and "/code", I could get it. See:
Code:
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10
Line 11
Line 12
Line 13
Line 14
Line 15
Now, just a small inconvenience. Does it have to say "code" at the top? It seems to add that automatically.
Code:
Line 1
Line 1
Line 1
Line 1
Line 1
Line 1
Line 1
Line 1
Line 1
Line 1
Line 1
I wonder if this will work.
Click go advance when you reply then its the # symbol on the top of the input box.
Gahh Its Lee said:
Click go advance when you reply then its the # symbol on the top of the input box.
Click to expand...
Click to collapse
I see! When I looked before, I didn't understand what code hashes meant. Thanks much!
As Dave Shaw mentions above, vBulletin boards use what are called BB Codes to format the text within a post.
Have a look at the vBulletin Community Forum BB Code page for a full list of codes. Straight from the horses mouth!
Be aware that not all codes may be available, or usable on XDA-DEVS. Their use is controlled by the security settings, as defined by the board administrator(s).
stephj said:
As Dave Shaw mentions above, vBulletin boards use what are called BB Codes to format the text within a post.
Have a look at the vBulletin Community Forum BB Code page for a full list of codes. Straight from the horses mouth!
Be aware that not all codes may be available, or usable on XDA-DEVS. Their use is controlled by the security settings, as defined by the board administrator(s).
Click to expand...
Click to collapse
Hehe. Most should be available, except anything that allows code embedding in a page, like html, as they are always off by default.
We've actually got our own list at http://forum.xda-developers.com/misc.php?do=bbcode too (same list as that I think )
i have came across the card emulation thread on galaxy nexus and nexus S thread. and found many useful information. i wonder if anyone has heard anything about it on the nexus 4?
HTML:
https://github.com/CyanogenMod/android_packages_apps_Nfc/commit/75ad85b06935cfe2cc556ea1fe5ccb9b54467695
i believe it is very simple to do with these codes compiled into the latest version of CM for the nexus 4. but I'm no developer, so i don't know how to. if anyone is also interested. please help make this happen! or atelast help on guiding us how to compile these codes into the latest CM!:fingers-crossed:
draginslygj said:
i have came across the card emulation thread on galaxy nexus and nexus S thread. and found many useful information. i wonder if anyone has heard anything about it on the nexus 4?
HTML:
https://github.com/CyanogenMod/android_packages_apps_Nfc/commit/75ad85b06935cfe2cc556ea1fe5ccb9b54467695
i believe it is very simple to do with these codes compiled into the latest version of CM for the nexus 4. but I'm no developer, so i don't know how to. if anyone is also interested. please help make this happen! or atelast help on guiding us how to compile these codes into the latest CM!:fingers-crossed:
Click to expand...
Click to collapse
There are currently no ways who are interesting for a non-developer. Start and do some research
youtube video of these codes coded into CM 10
these codes were originally in Nighty CM9 at around march 2012. it was then removed from the rom afterwards. these people at University of Texas has ported it onto CM10. these codes are pretty much the prerequisite of NFC proxy. which is a card emulation software, also work to proxy a card. and they have used it in the video to scan a card with phone NFC enabled phone, then the data collected is directly sent to the proxy. and allow it to simulate the card and purchase with the card.
http://www.youtube.com/watch?v=Yjfc60LGjik
wow thx
So how do I get it on my galaxy s3?
Sent from my Revolt Galaxy S3.
Create your own app who extends NFC_extras and has nfceeadmin rights
Sent from my GT-I9300 using xda app-developers app
Factionwars said:
Create your own app who extends NFC_extras and has nfceeadmin rights
Sent from my GT-I9300 using xda app-developers app
Click to expand...
Click to collapse
Has nobody done this already?
Sent from my Revolt GT-I9300 using Tapatalk 2.
AMoosa said:
Has nobody done this already?
Sent from my Revolt GT-I9300 using Tapatalk 2.
Click to expand...
Click to collapse
Yes, but only in a state where it is almost only interesting for a developer's perspective. You can enable the emulation of a Mifare classic 4k card. And you can only write on it using a external writer and UID is fixed.
Noob. If we wanted this we would've read that thread.
Sent from my SPH-L710 using xda app-developers app
Factionwars said:
Yes, but only in a state where it is almost only interesting for a developer's perspective. You can enable the emulation of a Mifare classic 4k card. And you can only write on it using a external writer and UID is fixed.
Click to expand...
Click to collapse
That clearly isn't only interesting for a developer.
If what you're saying is true, and people are emulating Mifare 4Ks with a static UID on modern phones like the S3, then many people would be interested in using that to replace their door entry cards at work and school.
LoveNFC said:
That clearly isn't only interesting for a developer.
If what you're saying is true, and people are emulating Mifare 4Ks with a static UID on modern phones like the S3, then many people would be interested in using that to replace their door entry cards at work and school.
Click to expand...
Click to collapse
That is also true, but most mifare classic systems use authentication based on the UID wich is not to be changed externally. You can read/write under certain circumstances to the emulated Mifare classic 4k. But because it is a default applet, and we do not have access to the configuration of the card (Mifare4Mobile). I highly disregard using the feature because you might lose a correct dump of your mifare classic card.
But ofcourse, it is alot of fun. Sources are on the interwebs, http://stackoverflow.com/questions/12955919/enabling-cardemulation-on-android-ics-with-nfc-extras i have rewritten that code and it works.
Read again, when you are cracking a Mifare classic card and emulating it for gaining access to places where you do not belong without a proper card. you might get busted
Factionwars said:
That is also true, but most mifare classic systems use authentication based on the UID wich is not to be changed externally. You can read/write under certain circumstances to the emulated Mifare classic 4k. But because it is a default applet, and we do not have access to the configuration of the card (Mifare4Mobile). I highly disregard using the feature because you might lose a correct dump of your mifare classic card.
But ofcourse, it is alot of fun. Sources are on the interwebs, http://stackoverflow.com/questions/12955919/enabling-cardemulation-on-android-ics-with-nfc-extras i have rewritten that code and it works.
Read again, when you are cracking a Mifare classic card and emulating it for gaining access to places where you do not belong without a proper card. you might get busted
Click to expand...
Click to collapse
That's not what I'm talking about. If, as you claim, you are able to emulate a card that has its own fixed UID, then that is highly useful. At my place of work, I'd be able to go to the IT guys and have them use my phone's emulated card's UID for my door access.
I'm not talking about shady stuff here.
LoveNFC said:
That's not what I'm talking about. If, as you claim, you are able to emulate a card that has its own fixed UID, then that is highly useful. At my place of work, I'd be able to go to the IT guys and have them use my phone's emulated card's UID for my door access.
I'm not talking about shady stuff here.
Click to expand...
Click to collapse
Sure, you might be able to do that.
Factionwars said:
Create your own app who extends NFC_extras and has nfceeadmin rights
Sent from my GT-I9300 using xda app-developers app
Click to expand...
Click to collapse
Hi,
Would you give me more information or reference about deal with "nfceeadmin" ?
For now, I got a security exception when I access the SE, and after doing some search, It looks like need to root my device. But I got same exception after root my nexus 7.
Thanks your help
Sent from my Nexus 7 using xda app-developers app
bauann-tw said:
Hi,
Would you give me more information or reference about deal with "nfceeadmin" ?
For now, I got a security exception when I access the SE, and after doing some search, It looks like need to root my device. But I got same exception after root my nexus 7.
Thanks your help
Sent from my Nexus 7 using xda app-developers app
Click to expand...
Click to collapse
Here you go http://nelenkov.blogspot.nl/2012/08/accessing-embedded-secure-element-in.html
Factionwars said:
Here you go nelenkov.blogspot.nl/2012/08/accessing-embedded-secure-element-in.html
Click to expand...
Click to collapse
Hi,
Thanks your help , but I still get same security exception.
Here is my step,
I am trying to use debug signature (debug.keystore) and modify system/etc/nfcee_access.xml like below
Code:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Applications granted NFCEE access on user builds
See packages/apps/Nfc/etc/sample_nfcee_access.xml for full documentation.
-->
<!-- Google wallet release signature -->
<signer android:signature="3082...852e" />
<signer android:signature="3082...996ab">
<package android:name="com.rftag.cardemu" />
</signer>
<debug />
</resources>
After reboot my device and run test app again, the code throw exception at "nfcExtras = getMethod.invoke(null, adapter);".
And I don't see any message about NFCEE denied in logcat, Did I miss something ?
PS: for reference, My device is Nexus 7 and running 4.2.2 ( offical ROM, only rooted )
Now a days the most talked topic of the world is wireless. And one of the most recent and widely used wireless technology is NFC (Near Field Communication). Today most of our credit cards and security cards are NFC enabled. When our cellphone comes with a NFC reader we must be interested to finding that how this tech work or what is really going on when we punch our credit card, is it possible to hack our subway pass?? So I tried to find-out something about NFC here is some info about it that you might be interested on:
Please use this information only for fun and testing field. Respect your country law. I'm not responsible if you break any law using this information.
** NFC tags can be protected.
** Non protected tags can be edited(mostly rewrite) with any NFC enabled devices using some apps.
** There are several "Sectors" and "Blocks" in a tag just like a RAM(Random Access Memory), most probably to address the memory efficiently.
** I found two types of protection #Soft protect(read able from any system) & #Hard protect (Not readable from other systems or apps).
** You can copy the data of a protected NFC tag depending how it's protected.
** I was able to read and erase the data of my University ID card which is of "Type A(ISO/IEC 14443 Type A).
** However I was not able to read any kind of data from my "Smart Cash Payment Card" which is of Type F(JUS-X 6319-4 / FeliCa).
** Android has built-in protection against NFC hacking or something like that so you may not be able to read or write any credit card with your stock android.
** Though some custom rom like CynogeMod may allow you to do so.
## There is an app that can really copy your standard credit card and simulate it from your phone. That is you can use your phone as a credit card. If it can't copy the card or read it's info, the app is also capable of sending the signal form a credit-card reader through another phone to your credit card. which means you can hold one phone over your NFC credit card and hold another phone(connected to each other over WiFi) and use the card without taking it near the card reader.
I'm not sure if I should post the APK or the the link here as it is not available in the android market and it's not mine. I just found it on the web.
Please let me know if I found out anything wrong or explained anything wrong.
_______________________________________________
Please press the thanks button if you find this helpful.
What are you using as a reader?
Sent from my SPH-D710 using Tapatalk 2
I'm using NFC retag pro and NFC tag writer.
Please continue to update this thread with more findings as I am sure many would benefit from it. :good:
arvin2212 said:
Please continue to update this thread with more findings as I am sure many would benefit from it. :good:
Click to expand...
Click to collapse
I'll try my best to find out more bout this. Any kind of help is welcome.
apk
@op
where that apk can be found if u dont wanna post link here?
Thanks
shubri said:
@op
where that apk can be found if u dont wanna post link here?
Thanks
Click to expand...
Click to collapse
I'd love to but I'm afraid if it's gonna be legal...
PM me I'll see what can be done...
Isn't what you described NFCProxy?
Beamed from my Maguro
Mach3.2 said:
Isn't what you described NFCProxy?
Beamed from my Maguro
Click to expand...
Click to collapse
Yah it is. But I was afraid of my country rules. Some people stole some Credit card ID using NFC device. That's the reason I was not posting the name in public.
That is interesting. If someone managed to steal your card using a phone, you are extremely not careful..
Beamed from my Maguro
I'm trying to make a module that replaces methods, modify variables that are passed as parameters, and call methods relatively to the hooked class (this.privateMethod()). But the offial wiki doesn't show how to either replace methods or use parameters.
Now some questions that I have are:
How can I create/modify instances of Objects that exists only in the hooked app? For example if a CustomClass object is passed as a parameter of a method I have hooked, how can I modify variables and call methods in the variable? And how can I create a new instance?
What should I return in a method I hooked with XC_MethodReplacement? It is registered as an Object so I should return something, but the method I'm hooking is a void.
How can I call private methods of a class I have an instance hooked of? Normally I'd call them with this.method(), but I don't think I have access to this "this" variable. Do I?
That's all I can think of from the top of my head, but more are bound to come up along the way. So if you have a reliable source of information like a guide, tutorial or blog post, please tell me!
Baconator724 said:
I'm trying to make a module that replaces methods, modify variables that are passed as parameters, and call methods relatively to the hooked class (this.privateMethod()). But the offial wiki doesn't show how to either replace methods or use parameters.
Now some questions that I have are:
Click to expand...
Click to collapse
http://api.xposed.info/
How can I create/modify instances of Objects that exists only in the hooked app? For example if a CustomClass object is passed as a parameter of a method I have hooked, how can I modify variables and call methods in the variable? And how can I create a new instance?
Click to expand...
Click to collapse
Simply use methods from XposedHelpers class. E.g. you can modify any field of CustomClass instance using appropriate setIntField, setObjectField, ... (depedning on type of variable you need to modify). For calling methods use XposedHelpers.callMethod() or callStaticMethod() in case of static methods.
To create new instance, get one of the defined constructors and call newInstance() (check with Java reflection docs).
What should I return in a method I hooked with XC_MethodReplacement? It is registered as an Object so I should return something, but the method I'm hooking is a void.
Click to expand...
Click to collapse
Simply return null
How can I call private methods of a class I have an instance hooked of? Normally I'd call them with this.method(), but I don't think I have access to this "this" variable. Do I?
Click to expand...
Click to collapse
XposedHelpers.callMethod(object, "methodName", params...)
where object is instance of class method belongs to. If you are within a hook, simply use params.thisObject as object.
Thanks! But could you explain this a bit more detailed?
C3C076 said:
To create new instance, get one of the defined constructors and call newInstance() (check with Java reflection docs).
Click to expand...
Click to collapse
Do I need to import the target APK in my project for this to work?
Baconator724 said:
Thanks! But could you explain this a bit more detailed?
Do I need to import the target APK in my project for this to work?
Click to expand...
Click to collapse
No. Use XposedHelpers.findConstructorExact() to get one of the constructors of class you want to instantiate and call newInstance() on that constructor supplying constructor parameters (if any).
Example : https://github.com/GravityBox/Gravi...low/gravitybox/quicksettings/QsTile.java#L123