2222import android .content .pm .ActivityInfo ;
2323import android .content .pm .PackageManager ;
2424import android .net .ConnectivityManager ;
25+ import android .net .LinkAddress ;
26+ import android .net .LinkProperties ;
27+ import android .net .Network ;
28+ import android .net .NetworkCapabilities ;
2529import android .net .Uri ;
2630import android .os .AsyncTask ;
2731import android .os .Build ;
3034import android .os .Environment ;
3135import android .os .Handler ;
3236import android .provider .Settings ;
37+ import android .text .Layout ;
38+ import android .text .SpannableString ;
39+ import android .text .style .AlignmentSpan ;
40+ import android .text .style .RelativeSizeSpan ;
3341import android .util .Log ;
3442import android .view .ContextMenu ;
3543import android .view .KeyEvent ;
6573import java .io .IOException ;
6674import java .io .InputStream ;
6775import java .net .HttpURLConnection ;
76+ import java .net .Inet4Address ;
77+ import java .net .Inet6Address ;
78+ import java .net .InetAddress ;
6879import java .net .URL ;
6980import java .util .Objects ;
7081
@@ -82,6 +93,7 @@ public class MainActivity extends AppCompatActivity implements SharedPreferences
8293 public boolean marquee ;
8394 private String marqueeText ;
8495 private boolean marqueeVisible ;
96+ public String localIp ;
8597 public String clientUrl1 ;
8698 public String clientUrl2 ;
8799 public String clientUrl3 ;
@@ -139,6 +151,7 @@ protected void onCreate(Bundle savedInstanceState) {
139151 checkmobileMode = sharedPreferences .getBoolean ("mobileMode" , false );
140152 checkAutoLogin = sharedPreferences .getBoolean ("autoLogin" , false );
141153 autoUpdate = sharedPreferences .getBoolean ("autoUpdate" , false );
154+ localIp = getLocalIpAddress (this );
142155 marquee = sharedPreferences .getBoolean ("marquee" , false );
143156 appsCount = sharedPreferences .getInt ("appsCount" , 0 );
144157 toSetting = sharedPreferences .getInt ("urlTimeout" , 0 );
@@ -613,6 +626,16 @@ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMen
613626 menu .add (0 , 2 , 0 , R .string .deactivateMenubutton );
614627 menu .add (0 , 3 , 0 , R .string .settings );
615628 menu .add (0 , 4 , 0 , R .string .showHelp );
629+
630+ // Create the 5th item with centered and smaller text
631+ String ipText = String .format ("IP: %s" , localIp );
632+ SpannableString smallerCenteredText = new SpannableString (ipText );
633+ // Center the text
634+ smallerCenteredText .setSpan (new AlignmentSpan .Standard (Layout .Alignment .ALIGN_CENTER ), 0 , ipText .length (), 0 );
635+ // Make the text half the size
636+ smallerCenteredText .setSpan (new RelativeSizeSpan (0.5f ), 0 , ipText .length (), 0 );
637+
638+ menu .add (0 , 5 , 0 , smallerCenteredText );
616639 }
617640
618641 @ Override
@@ -657,6 +680,7 @@ private void stopMarqueeHandler() {
657680 marqueeHandler .removeCallbacks (marqueeRunnable );
658681 }
659682
683+ @ SuppressLint ("StaticFieldLeak" )
660684 public void Update (final String apkUrl1 , @ Nullable final String apkUrl2 ) {
661685 new AsyncTask <Void , String , String >() {
662686 String result = "" ;
@@ -813,4 +837,31 @@ public void onClick(DialogInterface dialog, int which) {
813837 });
814838 builder .show ();
815839 }
840+ public static String getLocalIpAddress (Context context ) {
841+ try {
842+ ConnectivityManager connectivityManager = (ConnectivityManager ) context .getSystemService (Context .CONNECTIVITY_SERVICE );
843+ if (connectivityManager != null ) {
844+ Network [] allNetworks = connectivityManager .getAllNetworks ();
845+ for (Network network : allNetworks ) {
846+ NetworkCapabilities networkCapabilities = connectivityManager .getNetworkCapabilities (network );
847+ if (networkCapabilities != null && networkCapabilities .hasCapability (NetworkCapabilities .NET_CAPABILITY_INTERNET )) {
848+ LinkProperties linkProperties = connectivityManager .getLinkProperties (network );
849+ if (linkProperties != null ) {
850+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .N ) { // Android 7 (Nougat) or higher
851+ for (LinkAddress linkAddress : linkProperties .getLinkAddresses ()) {
852+ InetAddress address = linkAddress .getAddress ();
853+ // Check if it's a valid local IP address (IPv4 or IPv6)
854+ if (!address .isLoopbackAddress () && (address instanceof Inet4Address )) {
855+ return address .getHostAddress ();
856+ }
857+ }
858+ } }
859+ }
860+ }
861+ }
862+ } catch (Exception e ) {
863+ e .printStackTrace ();
864+ }
865+ return null ; // Return null if no IP address was found
866+ }
816867}
0 commit comments