{"id":468,"date":"2025-10-16T17:59:26","date_gmt":"2025-10-16T17:59:26","guid":{"rendered":"https:\/\/support.nullflag.com\/?post_type=docs&#038;p=468"},"modified":"2025-11-02T02:06:32","modified_gmt":"2025-11-02T02:06:32","password":"","slug":"simple-android-app-networking-request","status":"publish","type":"docs","link":"https:\/\/www.nullflag.com\/support\/kb\/develop_hook\/android-example\/simple-android-app-networking-request\/","title":{"rendered":"Simple Android App Networking Request"},"content":{"rendered":"\n<p>Quickly develop an Android page (user login &amp; jump)<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Android UI and background logic<\/li>\n\n\n\n<li>Network requests<\/li>\n\n\n\n<li>Serialization and deserialization<\/li>\n\n\n\n<li>Save XML file (cookie)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Android UI and background logic<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">android UI<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"873\" src=\"https:\/\/support.nullflag.com\/wp-content\/uploads\/2025\/10\/image-1024x873.png\" alt=\"\" class=\"wp-image-469\" srcset=\"https:\/\/www.nullflag.com\/support\/wp-content\/uploads\/2025\/10\/image-1024x873.png 1024w, https:\/\/www.nullflag.com\/support\/wp-content\/uploads\/2025\/10\/image-300x256.png 300w, https:\/\/www.nullflag.com\/support\/wp-content\/uploads\/2025\/10\/image-768x655.png 768w, https:\/\/www.nullflag.com\/support\/wp-content\/uploads\/2025\/10\/image-360x307.png 360w, https:\/\/www.nullflag.com\/support\/wp-content\/uploads\/2025\/10\/image.png 1374w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"888\" src=\"https:\/\/support.nullflag.com\/wp-content\/uploads\/2025\/10\/image-1-1024x888.png\" alt=\"\" class=\"wp-image-470\" srcset=\"https:\/\/www.nullflag.com\/support\/wp-content\/uploads\/2025\/10\/image-1-1024x888.png 1024w, https:\/\/www.nullflag.com\/support\/wp-content\/uploads\/2025\/10\/image-1-300x260.png 300w, https:\/\/www.nullflag.com\/support\/wp-content\/uploads\/2025\/10\/image-1-768x666.png 768w, https:\/\/www.nullflag.com\/support\/wp-content\/uploads\/2025\/10\/image-1-360x312.png 360w, https:\/\/www.nullflag.com\/support\/wp-content\/uploads\/2025\/10\/image-1.png 1052w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">User Login Interface<\/h3>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-09d03cc8\"\n     id=\"betterdocs-code-snippet-09d03cc8\"\n     data-language=\"xml\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\ud83d\udcc4<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">fragment_login.xml<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-09d03cc8 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-xml\"><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;androidx.constraintlayout.widget.ConstraintLayout \nxmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot; \nxmlns:app=&quot;http:\/\/schemas.android.com\/apk\/res-auto&quot; \nandroid:layout_width=&quot;match_parent&quot; \nandroid:layout_height=&quot;match_parent&quot; \nandroid:padding=&quot;16dp&quot;&gt; \n\n&lt;!-- Left and right borders for centered layout --&gt; \n&lt;androidx.constraintlayout.widget.Guideline \nandroid:id=&quot;@+id\/guideline_start&quot; \nandroid:layout_width=&quot;wrap_content&quot; \nandroid:layout_height=&quot;wrap_content&quot; \nandroid:orientation=&quot;vertical&quot; \napp:layout_constraintGuide_percent=&quot;0.1&quot; \/&gt; &lt;androidx.constraintlayout.widget.Guideline \nandroid:id=&quot;@+id\/guideline_end&quot; \nandroid:layout_width=&quot;wrap_content&quot; \nandroid:layout_height=&quot;wrap_content&quot; \nandroid:orientation=&quot;vertical&quot; \napp:layout_constraintGuide_percent=&quot;0.9&quot; \/&gt; \n\n&lt;!-- Username input box --&gt; \n&lt;com.google.android.material.textfield.TextInputLayout \nandroid:id=&quot;@+id\/usernameTextInputLayout&quot; \nandroid:layout_width=&quot;0dp&quot; \nandroid:layout_height=&quot;wrap_content&quot; \nandroid:hint=&quot;username&quot; \napp:layout_constraintTop_toTopOf=&quot;parent&quot; \napp:layout_constraintStart_toStartOf=&quot;@id\/guideline_start&quot; \napp:layout_constraintEnd_toEndOf=&quot;@id\/guideline_end&quot; android:layout_marginTop=&quot;100dp&quot;&gt; \n\n&lt;com.google.android.material.textfield.TextInputEditText \nandroid:id=&quot;@+id\/username&quot; \nandroid:layout_width=&quot;match_parent&quot; \nandroid:layout_height=&quot;wrap_content&quot; \nandroid:inputType=&quot;textEmailAddress&quot;\/&gt; \n&lt;\/com.google.android.material.textfield.TextInputLayout&gt; \n\n&lt;!-- Password input box --&gt; \n&lt;com.google.android.material.textfield.TextInputLayout \nandroid:id=&quot;@+id\/passwordTextInputLayout&quot; \nandroid:layout_width=&quot;0dp&quot; \nandroid:layout_height=&quot;wrap_content&quot; \nandroid:hint=&quot;password&quot; \napp:passwordToggleEnabled=&quot;true&quot; \napp:endIconMode=&quot;password_toggle&quot; app:layout_constraintTop_toBottomOf=&quot;@id\/usernameTextInputLayout&quot; \napp:layout_constraintStart_toStartOf=&quot;@id\/guideline_start&quot; \napp:layout_constraintEnd_toEndOf=&quot;@id\/guideline_end&quot; \nandroid:layout_marginTop=&quot;16dp&quot;&gt; \n\n&lt;com.google.android.material.textfield.TextInputEditText \nandroid:id=&quot;@+id\/password&quot; \nandroid:layout_width=&quot;match_parent&quot; \nandroid:layout_height=&quot;wrap_content&quot; \nandroid:inputType=&quot;textPassword&quot;\/&gt; \n&lt;\/com.google.android.material.textfield.TextInputLayout&gt; \n\n&lt;!-- Login button --&gt; \n&lt;Button \nandroid:id=&quot;@+id\/buttonLogin&quot; \nandroid:layout_width=&quot;0dp&quot; \nandroid:layout_height=&quot;wrap_content&quot; android:text=&quot;Login&quot; \napp:layout_constraintTop_toBottomOf=&quot;@id\/passwordTextInputLayout&quot; \napp:layout_constraintStart_toStartOf=&quot;@id\/guideline_start&quot; \napp:layout_constraintEnd_toEndOf=&quot;@id\/guideline_end&quot; \nandroid:layout_marginTop=&quot;24dp&quot; \/&gt; \n\n&lt;!-- Loading progress bar --&gt; \n&lt;ProgressBar \nandroid:id=&quot;@+id\/loading&quot; \nandroid:layout_width=&quot;wrap_content&quot; \nandroid:layout_height=&quot;wrap_content&quot; \nandroid:visibility=&quot;gone&quot; \napp:layout_constraintTop_toBottomOf=&quot;@id\/buttonLogin&quot; \napp:layout_constraintStart_toStartOf=&quot;parent&quot; \napp:layout_constraintEnd_toEndOf=&quot;parent&quot; \nandroid:layout_marginTop=&quot;16dp&quot; &lt;\/androidx.constraintlayout.widget.ConstraintLayout&gt;<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-09d03cc8');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<h3 class=\"wp-block-heading\">Function Interface <\/h3>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-e2379dee\"\n     id=\"betterdocs-code-snippet-e2379dee\"\n     data-language=\"xml\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\ud83d\udcc4<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">fragment_fn1.xml<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-e2379dee .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-xml\"><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;ScrollView xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    xmlns:tools=&quot;http:\/\/schemas.android.com\/tools&quot;\n    xmlns:app=&quot;http:\/\/schemas.android.com\/apk\/res-auto&quot;\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;match_parent&quot;\n    tools:context=&quot;.Fn1Fragment&quot;&gt;\n\n    &lt;LinearLayout\n        android:orientation=&quot;vertical&quot;\n        android:padding=&quot;16dp&quot;\n        android:layout_width=&quot;match_parent&quot;\n        android:layout_height=&quot;wrap_content&quot;&gt;\n\n        &lt;TextView\n            android:id=&quot;@+id\/textView&quot;\n            android:layout_width=&quot;match_parent&quot;\n            android:layout_height=&quot;wrap_content&quot;\n            android:text=&quot;@string\/hello_blank_fragment&quot;\n            android:textSize=&quot;18sp&quot;\n            android:paddingBottom=&quot;16dp&quot; \/&gt;\n\n        &lt;com.google.android.material.textfield.TextInputLayout\n            android:id=&quot;@+id\/usernameTextInputLayout&quot;\n            android:layout_width=&quot;match_parent&quot;\n            android:layout_height=&quot;wrap_content&quot;\n            android:hint=&quot;Enter_password_usernameTextInputLayout&quot;&gt;\n\n            &lt;com.google.android.material.textfield.TextInputEditText\n                android:id=&quot;@+id\/editTextUsername&quot;\n                android:layout_width=&quot;match_parent&quot;\n                android:layout_height=&quot;wrap_content&quot;\n                android:inputType=&quot;textMultiLine&quot;\n                android:maxLines=&quot;5&quot;\n                android:minLines=&quot;1&quot;\n                android:scrollHorizontally=&quot;false&quot;\n                android:gravity=&quot;start|top&quot;\/&gt;\n        &lt;\/com.google.android.material.textfield.TextInputLayout&gt;\n\n        &lt;com.google.android.material.textfield.TextInputLayout\n            android:id=&quot;@+id\/passwordTextInputLayout&quot;\n            android:layout_width=&quot;match_parent&quot;\n            android:layout_height=&quot;wrap_content&quot;\n            android:layout_marginTop=&quot;16dp&quot;\n            android:hint=&quot;Display_password_text_passwordEditText&quot;\n            app:passwordToggleEnabled=&quot;true&quot;&gt;\n\n            &lt;com.google.android.material.textfield.TextInputEditText\n                android:id=&quot;@+id\/passwordEditTextFn1&quot;\n                android:layout_width=&quot;match_parent&quot;\n                android:layout_height=&quot;wrap_content&quot;\n                android:inputType=&quot;textPassword|textMultiLine&quot;\n                android:maxLines=&quot;5&quot;\n                android:minLines=&quot;1&quot;\n                android:gravity=&quot;start|top&quot;\/&gt;\n        &lt;\/com.google.android.material.textfield.TextInputLayout&gt;\n\n        &lt;LinearLayout\n            android:layout_width=&quot;match_parent&quot;\n            android:layout_height=&quot;wrap_content&quot;\n            android:orientation=&quot;horizontal&quot;\n            android:layout_marginTop=&quot;20dp&quot;&gt;\n\n            &lt;Button\n                android:id=&quot;@+id\/buttonFn2&quot;\n                android:layout_width=&quot;0dp&quot;\n                android:layout_height=&quot;wrap_content&quot;\n                android:layout_weight=&quot;1&quot;\n                android:text=&quot;clang_Call_Java_Static(v8)_button_Fn2&quot; \/&gt;\n\n            &lt;Button\n                android:id=&quot;@+id\/buttonRun1&quot;\n                android:layout_width=&quot;0dp&quot;\n                android:layout_height=&quot;wrap_content&quot;\n                android:layout_weight=&quot;1&quot;\n                android:text=&quot;jniCall_static()_button_Run1&quot; \/&gt;\n        &lt;\/LinearLayout&gt;\n\n        &lt;LinearLayout\n            android:layout_width=&quot;match_parent&quot;\n            android:layout_height=&quot;wrap_content&quot;\n            android:orientation=&quot;horizontal&quot;\n            android:layout_marginTop=&quot;20dp&quot;&gt;\n\n            &lt;Button\n                android:id=&quot;@+id\/buttonFn3&quot;\n                android:layout_width=&quot;0dp&quot;\n                android:layout_height=&quot;112dp&quot;\n                android:layout_weight=&quot;1&quot;\n                android:text=&quot;clang_Call_Java_NewInstantiated_Object_(v9)_button_Fn3&quot; \/&gt;\n\n            &lt;Button\n                android:id=&quot;@+id\/buttonRun2&quot;\n                android:layout_width=&quot;0dp&quot;\n                android:layout_height=&quot;wrap_content&quot;\n                android:layout_weight=&quot;1&quot;\n                android:text=&quot;jNI_Dynamic_Register()_button_Run2&quot; \/&gt;\n        &lt;\/LinearLayout&gt;\n\n        &lt;LinearLayout\n            android:layout_width=&quot;match_parent&quot;\n            android:layout_height=&quot;wrap_content&quot;\n            android:orientation=&quot;horizontal&quot;\n            android:layout_marginTop=&quot;60dp&quot;&gt;\n            &lt;Button\n                android:id=&quot;@+id\/buttonFn1&quot;\n                android:layout_width=&quot;0dp&quot;\n                android:layout_height=&quot;wrap_content&quot;\n                android:layout_weight=&quot;1&quot;\n                android:text=&quot;jniCall()_button_Fn1&quot; \/&gt;\n            &lt;Button\n                android:id=&quot;@+id\/buttonRun3&quot;\n                android:layout_width=&quot;0dp&quot;\n                android:layout_height=&quot;wrap_content&quot;\n                android:layout_weight=&quot;1&quot;\n                android:text=&quot;Calculate_Ciphertext_(Result_v3)_button_Run3&quot; \/&gt;\n\n\n        &lt;\/LinearLayout&gt;\n\n    &lt;\/LinearLayout&gt;\n&lt;\/ScrollView&gt;\n<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-e2379dee');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<h3 class=\"wp-block-heading\">Function Button Background Logic<\/h3>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-8f103de0\"\n     id=\"betterdocs-code-snippet-8f103de0\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Fn1Fragment.java<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-8f103de0 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>package ca.netfilter; \/\/ Define package name as ca.netfilter\nimport android.os.Bundle; \/\/ Import Android Bundle class for data passing\nimport androidx.fragment.app.Fragment; \/\/ Import Fragment class for creating UI fragments\nimport android.text.InputType;\nimport android.util.Log;\nimport android.view.LayoutInflater; \/\/ Import layout inflater class\nimport android.view.View; \/\/ Import view class\nimport android.view.ViewGroup; \/\/ Import view container class\nimport android.widget.Button;\n\n\nimport android.widget.CompoundButton;\nimport android.widget.TextView;\n\nimport com.google.android.material.textfield.TextInputEditText;\nimport com.google.android.material.textfield.TextInputLayout;\nimport com.yoloho.libcore.util.Crypt;\n\n\n\/**\n * A simple {@link Fragment} subclass.\n * Use the {@link Fn1Fragment#newInstance} factory method to\n * create an instance of this fragment.\n *\n * A simple {@link Fragment} subclass.\n * Use the {@link Fn1Fragment#newInstance} factory method to\n * create an instance of this fragment.\n *\/\n\n\/\/public class Fn1Fragment extends androidx.fragment.app.Fragment {\n\/\/}\npublic class Fn1Fragment extends Fragment {   \/\/ Define a Fragment subclass named BlankFragment\n\n    private static final String TAG = &quot;Fn1Fragment&quot;; \/\/ \u2705 Add TAG\n\n    static {\n        System.loadLibrary(&quot;netfilter&quot;);\n    }\n\n\n    \/\/ TODO: Rename parameter arguments, choose names that match\n    \/\/ the fragment initialization parameters, e.g. ARG_ITEM_NUMBER\n    \/\/ TODO: Rename parameter names to match initialization parameters, e.g. ARG_ITEM_NUMBER\n\n\n    \/\/ Variables are declared at the head and type.  you can use them Alone!\n    public Button fn1Button,fn2Button,fn3Button,run1Button,run2Button,run3Button;\n    public TextView txtUser,txtPwd;\n    public TextInputEditText passwordEditText;\n    public TextInputLayout passwordTextInputLayout;\n\n\n\n    private static final String ARG_PARAM1 = &quot;param1&quot;;   \/\/ Define key name for parameter 1\n    private static final String ARG_PARAM2 = &quot;param2&quot;;    \/\/ Define key name for parameter 2\n\n    \/\/ TODO: Rename and change types of parameters  ---&gt; Rename and change parameter types\n    private String mParam1; \/\/ Used to save the value of param1\n    private String mParam2;  \/\/ Used to save the value of param2\n\n    public Fn1Fragment() {\n        \/\/ Required empty public constructor  --&gt; Required empty public constructor\n    }\n\n    \/**\n     * Use this factory method to create a new instance of  .--&gt; Use this factory method to create a new instance of BlankFragment,\n     * this fragment using the provided parameters. .--&gt; and pass two parameters.\n     *\n     * @param param1 Parameter 1.--&gt; param1 Parameter 1\n     * @param param2 Parameter 2. --&gt;param2 Parameter 2\n     * @return A new instance of fragment BlankFragment.--&gt; Return a new instance of BlankFragment\n     *\/\n    \/\/ TODO: Rename and change types and number of parameters --&gt;Rename and modify parameter types and count\n    public static Fn1Fragment newInstance(String param1, String param2) {\n        Fn1Fragment fragment = new Fn1Fragment();\/\/ Create a new BlankFragment instance\n        Bundle args = new Bundle(); \/\/ Create a new Bundle for passing parameters\n        args.putString(ARG_PARAM1, param1);  \/\/ Put param1 into Bundle\n        args.putString(ARG_PARAM2, param2); \/\/ Put param2 into Bundle\n        fragment.setArguments(args);  \/\/ Set parameters to fragment\n        return fragment; \/\/ Return the created fragment instance\n    }\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);  \/\/ Call parent class&#039;s onCreate method\n        if (getArguments() != null) {  \/\/ If there are passed parameters\n            mParam1 = getArguments().getString(ARG_PARAM1); \/\/ Get param1 and assign to mParam1\n            mParam2 = getArguments().getString(ARG_PARAM2); \/\/ Get param2 and assign to mParam2\n        }\n    }\n\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container,\n                             Bundle savedInstanceState) {\n        \/\/ Inflate the layout for this fragment --&gt;  Load layout file fragment_fn1.xml for this fragment\n\/\/        return inflater.inflate(R.layout.fragment_fn1, container, false);\n        View rootView = inflater.inflate(R.layout.fragment_fn1, container, false);\n        initView(rootView);  \/\/ Pass rootView\n        initListener(); \/\/ \u2705 Add click event binding\n        return rootView;\n    }\n\n\n    public void initView(View rootView){\n        \/\/ find the page useful tag\n        \/\/ Set button binding events.\n        txtUser = rootView.findViewById(R.id.editTextUsername);\n        txtPwd = rootView.findViewById(R.id.passwordEditTextFn1);\n        fn1Button = rootView.findViewById(R.id.buttonFn1);\n        run1Button = rootView.findViewById(R.id.buttonRun1);\n        fn2Button = rootView.findViewById(R.id.buttonFn2);\n        run2Button = rootView.findViewById(R.id.buttonRun2);\n        fn3Button = rootView.findViewById(R.id.buttonFn3);\n        run3Button = rootView.findViewById(R.id.buttonRun3);\n        passwordEditText = rootView.findViewById(R.id.passwordEditTextFn1);\n        passwordTextInputLayout = rootView.findViewById(R.id.passwordTextInputLayout);\n\n    }\n\n    public void initListener(){\n        run1Button.setOnClickListener(new View.OnClickListener() {  \/\/ First type: full form\n            @Override\n            public void onClick(View v){\n                jniCall_static();\n            }\n        });\n        fn2Button.setOnClickListener(v -&gt; clang_Call_Java_v8());  \/\/ Second type: abbreviated form\n        fn3Button.setOnClickListener(v -&gt; clang_Call_Java_v9());\n        run2Button.setOnClickListener(v -&gt; jNI_Dynamic_Register());\n        run3Button.setOnClickListener(v -&gt; Call_Encrypted_Result());\n\n    }\n\n\n    public void Call_Encrypted_Result(){\n        \/\/Send network + connect queue, get task\n\n\/\/        String Plaintext = String.valueOf(txtUser.getText());\n\/\/\/\/        String Ciphertext = String.valueOf(txtPwd.getText());\n\/\/\n\/\/        \/\/Call method and get corresponding result\n\/\/        String sign = Crypt.encrypt_data(0, Plaintext, 85);\n\/\/\n\/\/\n\/\/        passwordEditText.setText(sign);\n\/\/\n\/\/        \/\/ Send + write result\n        String Plaintext = txtUser.getText().toString();\n        String Ciphertext = txtPwd.getText().toString();\n\n        \/\/ Call method and get corresponding result\n        String sign = Crypt.encrypt_data(0, Plaintext, 85);\n\n        \/\/ Display encryption result in passwordEditText\n        passwordEditText.setText(sign);\n\n    }\n\n    public void jNI_Dynamic_Register(){\n\/\/        DynamicUtils utils = new DynamicUtils();\n        int result = DynamicUtils.add(5, 7);\n        System.out.println(&quot;jNI_Dynamic_Register ---&gt; Result: &quot; + result); \/\/ Output: Result: 12\n\/\/        String value = DynamicUtils.ssss(11,22);\n\/\/        Log.e(&quot;----&gt;&quot;, value); \/\/  rwxt\n\n    }\n\n    public void clang_Call_Java_v9(){\n        String resultn9 = clangCallJavaNew.v9(&quot;October 2024&quot;,2024);\n        System.out.println(&quot;Instance method---C calls Java----&gt;Result: &quot; + resultn9);\n\n\n\n\n        \/\/ -----------------Call native method ------------- kanxue MissKing&#039;s ROM JNI tracing function test-----------\n        \/\/ Create JniTraceMikrom instance and call lookForDemo method\n        JniTraceMikrom jniTrace = new JniTraceMikrom();\n        String result = jniTrace.lookForDemo();\n\n        \/\/ Print return value of lookForDemo method\n        Log.i(TAG, &quot;Jni-Trace-Mikrom--case----&gt;Result: &quot; + result);\n\n        \/\/ -----------------Call native method ------------- kanxue MissKing&#039;s ROM JNI tracing function test-----------------\n\n\n\n\n        clangCallJavaNewExampleEncrypted resultv10 = EncryptUtils.v10(&quot;aid=123488384&amp;page=199&amp;size=100&quot;);\n        if (resultv10 != null) {\n            String resultv10_string = resultv10.toString();\n            Log.e(&quot;----&gt;&quot;, resultv10_string);\n        } else {\n            Log.e(&quot;----&gt;&quot;, &quot;Error: resultv10 is null.&quot;);\n        }\n    }\n    public void clang_Call_Java_v8(){\n        \/\/ Static method  (C calls Java)\n        String resultn8 = clangCallJavaStatic.v8();\n\/\/        System.out.println(clangCallJavaStatic.v8());\n        System.out.println(&quot;Static method---C calls Java----&gt;Result: &quot; + resultn8);\n    }\n    public void jniCall_static(){\n        \/\/ 5.5 Character processing\n\/\/        String resultn5 = EncryptUtils.v5(&quot;name=wupeiqi&amp;age=19&quot;);\n        EncryptUtils.v5(&quot;name=wupeiqi&amp;age=19&quot;);\n\/\/        System.out.println(&quot;5.5 Character processing--&gt; Result: &quot; + resultn5);\n        \/\/ 5.6 Byte processing\n\/\/        String resultn6 = EncryptUtils.v6(   &quot;name=wupeiqi&amp;age=19&quot;.getBytes()    );\n        EncryptUtils.v6(   &quot;name=wupeiqi&amp;age=19&quot;.getBytes()    );\n\/\/        System.out.println(&quot;5.6 Byte processing--&gt; Result: &quot; + resultn6);\n\n        EncryptUtils.v7(   &quot;name=wupeiqi&amp;age=19&quot;.getBytes()    );\n    }\n\n    public void jniCall(){\n\n        \/\/ JNI C (native variable already declared in Java&#039;s EncryptUtils class)\n        \/\/ Call core algorithm, get signature value, send to backend API.\n        String signString = EncryptUtils.v0(11, &quot;alex&quot;);\n        \/\/ More awesome algorithm, let it be implemented in C language.\n        int sign1 = EncryptUtils.v1(2, 3);\n        Log.e(&quot;Fn1--\u300bTest Java calls C V1 function----&gt;&quot;, String.valueOf(sign1)); \/\/  133\n\n        \/\/ Java calls JNI C language --V2 function\n        String sign2 = EncryptUtils.v2(&quot;root&quot;);\n        Log.e(&quot;Fn1--\u300bTest calling Native V2 function-----&gt;&quot;,sign2);\n\n\n        \/\/ Java calls JNI C language --V4 function\n        \/\/ JNI CPP\n\/\/        TextView tv4 = findViewById(R.id.buttonRun1);\n        String signV4 = EncryptUtils.v4(&quot;called&quot;,&quot;students&quot;);\n        \/\/tv.setText(EncryptUtils.v4(&quot;called&quot;,&quot;students&quot;));\n        fn1Button.setText(signV4);\n\n        Log.e(&quot;Fn1--\u300bTest calling Native V4 function-----&gt;&quot;,signV4);\n    }\n\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-8f103de0');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<h3 class=\"wp-block-heading\">Definition of  user login request<\/h3>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-aedc8d45\"\n     id=\"betterdocs-code-snippet-aedc8d45\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">\/home\/calleng\/AndroidStudioProjects\/NetFilter_PJ\/app\/src\/main\/java\/ca\/netfilter\/ui\/login\/LoginFragment.java<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-aedc8d45 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>private void doLogin() {\n        String username = binding.username.getText().toString();\n        String password = binding.password.getText().toString();\n\n        TreeMap&lt;String, String&gt; map = new TreeMap&lt;&gt;();\n        map.put(&quot;user&quot;, username);\n        map.put(&quot;pwd&quot;, password);\n\n        StringBuilder sb = new StringBuilder();\n        for (Map.Entry&lt;String, String&gt; entry : map.entrySet()) {\n            sb.append(entry.getKey()).append(&quot;=&quot;).append(entry.getValue()).append(&quot;&amp;&quot;);\n        }\n        sb.deleteCharAt(sb.length() - 1); \/\/ Remove the final &#039;&amp;&#039;\n\n        String signString = md5(sb.toString());\n        map.put(&quot;sign&quot;, signString);\n\n        new Thread(() -&gt; {\n            try {\n                Retrofit retrofit = new Retrofit.Builder()\n                        .baseUrl(&quot;http:\/\/192.168.9.101:8081&quot;)\n                        .build();\n                HttpReq req = retrofit.create(HttpReq.class);   \/\/ Create a Retrofit interface\n                \/\/ Send using form format\n                \/\/ Call&lt;ResponseBody&gt; call = req.postLogin(&quot;xianning&quot;,&quot;password_good&quot;);\n                \/\/ Send using form format\n\n                \/\/ Send using JSON format\n\n                JSONObject json = new JSONObject(map);\n                String jsonString = json.toString();\n\n                RequestBody form = RequestBody.create(\n                        MediaType.parse(&quot;application\/json;charset=utf-8&quot;),\n                        jsonString);\n                Call&lt;ResponseBody&gt; call = req.postLoginJson(form); \/\/ Call method name, method name needs to pass parameters\n                \/\/ Send using JSON format\n\n                \/\/  ResponseBody responseBody =  req.postLoginJson( RequestBody.create(MediaType.parse(&quot;application\/json;charset=utf-8&quot;),jsonString)).execute().body()\n                ResponseBody responseBody = call.execute().body();\/\/ Execute method,\n                if (responseBody == null) {\n                    Log.e(&quot;Login&quot;, &quot;Response body is null&quot;);\n                    return;\n                }\n\n                String responseString = responseBody.string();\/\/   Get return value after execution\n                \/\/ The continuous operation is , req.postLoginJson( RequestBody.create(MediaType.parse(&quot;application\/json;charset=utf-8&quot;),jsonString)).execute().body().string()\n\n                \/\/ {&quot;code&quot;:200,&quot;msg&quot;:&quot;ok&quot;,&quot;token&quot;:&quot;jfieefjeifjei-jefjeifejf-ejfiefi-100&quot;}\n                HttpResponse obj = new Gson().fromJson(responseString, HttpResponse.class);\n\n                \/\/Log.e(&quot;Retrofit return result&quot;,responseString);\n                Log.e(&quot;Retrofit return result&quot;, obj.token);\/\/ Output Gson deserialization\n\n                \/\/ Get server credentials, write to local xml file\n                \/\/ Write to SharedPreferences\n                Context context = getContext();\n                if (context != null) {\n                    SharedPreferences sp = context.getSharedPreferences(&quot;s_city&quot;, Context.MODE_PRIVATE);\n                    SharedPreferences.Editor editor = sp.edit();\n                    editor.putString(&quot;token&quot;, obj.token);\n                    editor.apply();\n\n                    \/\/ Read token value from local xml file\n                    String token = sp.getString(&quot;token&quot;, &quot;&quot;);\n                    Log.e(&quot;Read token value from local xml file&quot;, token);\n                }\n\n            } catch (Exception e) {\n                e.printStackTrace();\n            }\n        }).start();\n    }<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-aedc8d45');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<h3 class=\"wp-block-heading\">user login request api <\/h3>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-9c314a38\"\n     id=\"betterdocs-code-snippet-9c314a38\"\n     data-language=\"python\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\ud83d\udc0d<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">\/home\/calleng\/p9\/Mikrom2.0\/ToolKit\/\u6742\u4e03\u6742\u516b\u5de5\u5177\u7bb1\/Android_Http_API.py<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-9c314a38 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-python\"><code>from flask import Flask, jsonify, request\n\napp = Flask(__name__)\n\n\n@app.route(&#039;\/auth&#039;,methods=[&quot;GET&quot;,&quot;POST&quot;])\ndef auth():\n\n    &quot;&quot;&quot;\n    # 1,Get data (Form format)\n    username = request.form.get(&quot;user&quot;)\n    password = request.form.get(&quot;pwd&quot;)\n    sign = request.form.get(&#039;sign&#039;)\n    print(username,password,sign)\n    &quot;&quot;&quot;\n    # 1,Get data\n    print(request.data)  # Get raw format\n    # print(request.json)\n    print(request.form)\n    print(request.headers)\n\n\n    # 2,Verify signature validity\n\n    # 3,Business processing\n    return jsonify({&quot;code&quot;:200,&quot;msg&quot;:&quot;ok&quot;,&quot;token&quot;:&quot;jfieefjeifjei-jefjeifejf-ejfiefi-100&quot;})\n\n@app.route(&#039;\/users&#039;,methods=[&quot;GET&quot;,&quot;POST&quot;])\ndef users():\n    # print(request.data)  # Get raw format\n    print(request.json)\n    print(request.form)\n    print(request.headers)\n\n    return jsonify({&quot;code&quot;:200,&quot;msg&quot;:&quot;ok&quot;,&quot;token&quot;:&quot;jfieefjeifjei-jefjeifejf-ejfiefi-100&quot;})\n\n\n\nif __name__ == &#039;__main__&#039;:\n    # app.run(host=&#039;127.0.0.1&#039;, port=8080)\n    # app.run(host=&#039;10.10.10.236&#039;, port=8080)\n    app.run(host=&#039;0.0.0.0&#039;, port=8081)<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-9c314a38');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\">Network Request Flow<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 1<\/strong>: <strong>Request Method<\/strong><\/h3>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-79e7b8dd\"\n     id=\"betterdocs-code-snippet-79e7b8dd\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Java<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-79e7b8dd .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>private void doLogin() {\n    String username = binding.username.getText().toString();\n    String password = binding.password.getText().toString();\n\n    \/\/ 1. Construct request data\n    TreeMap&lt;String, String&gt; map = new TreeMap&lt;&gt;();\n    map.put(&quot;user&quot;, username);\n    map.put(&quot;pwd&quot;, password);\n\n    \/\/ 2. Generate MD5 signature\n    String signString = md5(&quot;pwd=&quot; + password + &quot;&amp;user=&quot; + username);\n    map.put(&quot;sign&quot;, signString);\n\n    \/\/ 3. Async network request\n    new Thread(() -&gt; {\n        try {\n            \/\/ Use Retrofit to send request\n            Retrofit retrofit = new Retrofit.Builder()\n                    .baseUrl(&quot;http:\/\/192.168.9.101:8081&quot;)\n                    .build();\n\n            HttpReq req = retrofit.create(HttpReq.class);\n\n            \/\/ Convert to JSON format\n            JSONObject json = new JSONObject(map);\n            String jsonString = json.toString();\n\n            \/\/ Create request body\n            RequestBody form = RequestBody.create(\n                    MediaType.parse(&quot;application\/json;charset=utf-8&quot;),\n                    jsonString);\n\n            \/\/ Send request\n            Call&lt;ResponseBody&gt; call = req.postLoginJson(form);\n            ResponseBody responseBody = call.execute().body();\n\n            if (responseBody != null) {\n                String responseString = responseBody.string();\n                \/\/ Handle response data...\n            }\n\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }).start();\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-79e7b8dd');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step2:<strong>Form Format Comparison<\/strong><\/strong> &#8211;&gt;<strong> Form Format<\/strong> (<code>application\/x-www-form-urlencoded<\/code>)<\/h3>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-7a57adcd\"\n     id=\"betterdocs-code-snippet-7a57adcd\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Java<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-7a57adcd .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>\/\/ Construct Form data\nFormBody.Builder formBuilder = new FormBody.Builder()\n    .add(&quot;user&quot;, &quot;calleng&quot;)\n    .add(&quot;pwd&quot;, &quot;2022&quot;)\n    .add(&quot;sign&quot;, &quot;5f4dcc3b5aa765d61d8327deb882cf99&quot;);\n\nRequestBody formBody = formBuilder.build();<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-7a57adcd');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<p><strong>HTTP Request Example:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>POST \/auth HTTP\/1.1\nHost: 192.168.9.101:8081\nContent-Type: application\/x-www-form-urlencoded\nContent-Length: 58\n\npwd=2022&amp;user=calleng&amp;sign=5f4dcc3b5aa765d61d8327deb882cf99<\/code><\/pre>\n\n\n\n<p><strong>JSON Format<\/strong> (<code>application\/json<\/code>) &#8211; <strong>Currently Used<\/strong><\/p>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-07331d04\"\n     id=\"betterdocs-code-snippet-07331d04\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Java<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-07331d04 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>\/\/ Construct JSON data\nTreeMap&lt;String, String&gt; map = new TreeMap&lt;&gt;();\nmap.put(&quot;user&quot;, &quot;calleng&quot;);\nmap.put(&quot;pwd&quot;, &quot;2022&quot;);\nmap.put(&quot;sign&quot;, &quot;5f4dcc3b5aa765d61d8327deb882cf99&quot;);\n\nJSONObject json = new JSONObject(map);\nString jsonString = json.toString();\n\nRequestBody jsonBody = RequestBody.create(\n    MediaType.parse(&quot;application\/json;charset=utf-8&quot;),\n    jsonString\n);<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-07331d04');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<p><strong>HTTP Request Example:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>POST \/auth HTTP\/1.1\nHost: 192.168.9.101:8081\nContent-Type: application\/json;charset=utf-8\nContent-Length: 78\n\n{\n  \"pwd\": \"2022\",\n  \"user\": \"calleng\",\n  \"sign\": \"5f4dcc3b5aa765d61d8327deb882cf99\"\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Step 3: Retrofit Configuration Code<\/strong><\/strong> <strong>. Retrofit Interface Definition<\/strong> <\/h3>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-67ac9ea0\"\n     id=\"betterdocs-code-snippet-67ac9ea0\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">HttpReq.java<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-67ac9ea0 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>import okhttp3.RequestBody;\nimport okhttp3.ResponseBody;\nimport retrofit2.Call;\nimport retrofit2.http.Body;\nimport retrofit2.http.POST;\nimport retrofit2.http.GET;\n\npublic interface HttpReq {\n\n    \/\/ JSON format POST request\n    @POST(&quot;\/auth&quot;)\n    Call&lt;ResponseBody&gt; postLoginJson(@Body RequestBody body);\n\n    \/\/ Form format POST request (optional)\n    @POST(&quot;\/auth&quot;)\n    @FormUrlEncoded\n    Call&lt;ResponseBody&gt; postLoginForm(\n        @Field(&quot;user&quot;) String user,\n        @Field(&quot;pwd&quot;) String pwd,\n        @Field(&quot;sign&quot;) String sign\n    );\n\n    \/\/ GET request to get user info\n    @GET(&quot;\/users&quot;)\n    Call&lt;ResponseBody&gt; getUserInfo();\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-67ac9ea0');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-93fa94b6\"\n     id=\"betterdocs-code-snippet-93fa94b6\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Retrofit Client Configuration<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-93fa94b6 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>import retrofit2.Retrofit;\nimport retrofit2.converter.gson.GsonConverterFactory;\n\npublic class RetrofitClient {\n\n    private static Retrofit retrofit = null;\n\n    \/\/ Basic configuration\n    public static Retrofit getBasicClient() {\n        if (retrofit == null) {\n            retrofit = new Retrofit.Builder()\n                    .baseUrl(&quot;http:\/\/192.168.9.101:8081&quot;)\n                    .build();\n        }\n        return retrofit;\n    }\n\n    \/\/ Configuration with Gson converter\n    public static Retrofit getGsonClient() {\n        if (retrofit == null) {\n            retrofit = new Retrofit.Builder()\n                    .baseUrl(&quot;http:\/\/192.168.9.101:8081&quot;)\n                    .addConverterFactory(GsonConverterFactory.create())\n                    .build();\n        }\n        return retrofit;\n    }\n\n    \/\/ Configuration with OkHttp client\n    public static Retrofit getFullClient(OkHttpClient client) {\n        if (retrofit == null) {\n            retrofit = new Retrofit.Builder()\n                    .baseUrl(&quot;http:\/\/192.168.9.101:8081&quot;)\n                    .client(client)\n                    .addConverterFactory(GsonConverterFactory.create())\n                    .build();\n        }\n        return retrofit;\n    }\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-93fa94b6');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 4: Request Interceptor<\/strong><\/h3>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-a93a0dbc\"\n     id=\"betterdocs-code-snippet-a93a0dbc\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Logging Interceptor Implementation<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-a93a0dbc .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>import okhttp3.logging.HttpLoggingInterceptor;\n\npublic class LoggingInterceptor {\n    public static HttpLoggingInterceptor getInterceptor() {\n        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();\n        logging.setLevel(HttpLoggingInterceptor.Level.BODY); \/\/ Log complete request and response info\n        return logging;\n    }\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-a93a0dbc');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-50645207\"\n     id=\"betterdocs-code-snippet-50645207\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Header Interceptor<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-50645207 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>import okhttp3.Interceptor;\nimport okhttp3.Request;\nimport okhttp3.Response;\n\npublic class HeaderInterceptor implements Interceptor {\n    @Override\n    public Response intercept(Chain chain) throws IOException {\n        Request originalRequest = chain.request();\n\n        Request requestWithHeaders = originalRequest.newBuilder()\n                .addHeader(&quot;User-Agent&quot;, &quot;Android-NetFilter\/1.0&quot;)\n                .addHeader(&quot;Accept&quot;, &quot;application\/json&quot;)\n                .addHeader(&quot;Content-Type&quot;, &quot;application\/json;charset=utf-8&quot;)\n                .addHeader(&quot;X-App-Version&quot;, &quot;1.0.0&quot;)\n                .build();\n\n        return chain.proceed(requestWithHeaders);\n    }\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-50645207');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-4e19669e\"\n     id=\"betterdocs-code-snippet-4e19669e\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Authentication Interceptor<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-4e19669e .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>import android.content.Context;\nimport android.content.SharedPreferences;\n\npublic class AuthInterceptor implements Interceptor {\n    private Context context;\n\n    public AuthInterceptor(Context context) {\n        this.context = context;\n    }\n\n    @Override\n    public Response intercept(Chain chain) throws IOException {\n        Request originalRequest = chain.request();\n\n        \/\/ Read Token from SharedPreferences\n        SharedPreferences sp = context.getSharedPreferences(&quot;s_city&quot;, Context.MODE_PRIVATE);\n        String token = sp.getString(&quot;token&quot;, &quot;&quot;);\n\n        if (!token.isEmpty()) {\n            Request requestWithAuth = originalRequest.newBuilder()\n                    .addHeader(&quot;Authorization&quot;, &quot;Bearer &quot; + token)\n                    .build();\n            return chain.proceed(requestWithAuth);\n        }\n\n        return chain.proceed(originalRequest);\n    }\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-4e19669e');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-68e4e072\"\n     id=\"betterdocs-code-snippet-68e4e072\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Complete OkHttp Client Configuration<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-68e4e072 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>import okhttp3.OkHttpClient;\nimport java.util.concurrent.TimeUnit;\n\npublic class OkHttpClientFactory {\n\n    public static OkHttpClient createClient(Context context) {\n        return new OkHttpClient.Builder()\n                \/\/ Add interceptors\n                .addInterceptor(new HeaderInterceptor())\n                .addInterceptor(new AuthInterceptor(context))\n                .addInterceptor(LoggingInterceptor.getInterceptor())\n\n                \/\/ Set timeout\n                .connectTimeout(30, TimeUnit.SECONDS)\n                .readTimeout(30, TimeUnit.SECONDS)\n                .writeTimeout(30, TimeUnit.SECONDS)\n\n                \/\/ Retry mechanism\n                .retryOnConnectionFailure(true)\n\n                .build();\n    }\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-68e4e072');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 5: Gson Deserialization Parsing<\/strong><\/h3>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-7e8b6d35\"\n     id=\"betterdocs-code-snippet-7e8b6d35\"\n     data-language=\"javascript\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\ud83d\udcc4<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Data Model Class Definition<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-7e8b6d35 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-javascript\"><code>\/\/ Response data model\npublic class HttpResponse {\n    public int code;\n    public String msg;\n    public String token;\n    public User data; \/\/ Optional user data\n\n    @Override\n    public String toString() {\n        return &quot;HttpResponse{&quot; +\n                &quot;code=&quot; + code +\n                &quot;, msg=&#039;&quot; + msg + &#039;\\&#039;&#039; +\n                &quot;, token=&#039;&quot; + token + &#039;\\&#039;&#039; +\n                &#039;}&#039;;\n    }\n}\n\n\/\/ User data model (optional)\npublic class User {\n    public String id;\n    public String username;\n    public String email;\n    public long createTime;\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-7e8b6d35');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-e74d85fc\"\n     id=\"betterdocs-code-snippet-e74d85fc\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Gson Parsing Code<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-e74d85fc .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>import com.google.gson.Gson;\nimport com.google.gson.reflect.TypeToken;\n\npublic class GsonParser {\n\n    \/\/ 1. Basic object parsing\n    public static HttpResponse parseResponse(String jsonString) {\n        Gson gson = new Gson();\n        HttpResponse response = gson.fromJson(jsonString, HttpResponse.class);\n        return response;\n    }\n\n    \/\/ 2. Parsing with generics\n    public static List&lt;User&gt; parseUserList(String jsonString) {\n        Gson gson = new Gson();\n        Type type = new TypeToken&lt;List&lt;User&gt;&gt;(){}.getType();\n        return gson.fromJson(jsonString, type);\n    }\n\n    \/\/ 3. Manual parsing (more flexible)\n    public static void manualParse(String jsonString) {\n        try {\n            JSONObject jsonObject = new JSONObject(jsonString);\n\n            int code = jsonObject.getInt(&quot;code&quot;);\n            String msg = jsonObject.getString(&quot;msg&quot;);\n            String token = jsonObject.optString(&quot;token&quot;, &quot;&quot;); \/\/ optString avoids exceptions\n\n            if (code == 200) {\n                Log.i(&quot;GsonParse&quot;, &quot;Login successful: &quot; + token);\n            } else {\n                Log.e(&quot;GsonParse&quot;, &quot;Login failed: &quot; + msg);\n            }\n\n        } catch (Exception e) {\n            Log.e(&quot;GsonParse&quot;, &quot;Parsing failed: &quot; + e.getMessage());\n        }\n    }\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-e74d85fc');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-58d3aac6\"\n     id=\"betterdocs-code-snippet-58d3aac6\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Using Gson in Network Requests<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-58d3aac6 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>private void doLoginWithGson() {\n    \/\/ ... previous network request code\n\n    \/\/ After receiving response\n    String responseString = responseBody.string();\n\n    \/\/ Method 1: Direct parsing\n    HttpResponse response = GsonParser.parseResponse(responseString);\n    Log.e(&quot;GsonParsingResult&quot;, &quot;Token: &quot; + response.token);\n\n    \/\/ Method 2: Manual parsing\n    GsonParser.manualParse(responseString);\n\n    \/\/ Method 3: Use Gson instance\n    Gson gson = new Gson();\n    HttpResponse obj = gson.fromJson(responseString, HttpResponse.class);\n    Log.e(&quot;DirectGsonParsing&quot;, obj.token);\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-58d3aac6');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 6: XML File Save Code<\/strong><\/h3>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-0f5c50f4\"\n     id=\"betterdocs-code-snippet-0f5c50f4\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">SharedPreferences Storage (actually XML format)<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-0f5c50f4 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>import android.content.Context;\nimport android.content.SharedPreferences;\n\npublic class PreferenceManager {\n    private Context context;\n    private SharedPreferences sharedPreferences;\n\n    public PreferenceManager(Context context) {\n        this.context = context;\n        this.sharedPreferences = context.getSharedPreferences(&quot;s_city&quot;, Context.MODE_PRIVATE);\n    }\n\n    \/\/ Save Token\n    public void saveToken(String token) {\n        SharedPreferences.Editor editor = sharedPreferences.edit();\n        editor.putString(&quot;token&quot;, token);\n        editor.putString(&quot;login_time&quot;, String.valueOf(System.currentTimeMillis()));\n        editor.apply(); \/\/ Async save\n\n        Log.i(&quot;SharedPreferences&quot;, &quot;Token saved: &quot; + token);\n    }\n\n    \/\/ Read Token\n    public String getToken() {\n        return sharedPreferences.getString(&quot;token&quot;, &quot;&quot;);\n    }\n\n    \/\/ Save user info\n    public void saveUserInfo(String username, String userId) {\n        SharedPreferences.Editor editor = sharedPreferences.edit();\n        editor.putString(&quot;username&quot;, username);\n        editor.putString(&quot;user_id&quot;, userId);\n        editor.putBoolean(&quot;is_logged_in&quot;, true);\n        editor.apply();\n    }\n\n    \/\/ Clear all data\n    public void clearAllData() {\n        SharedPreferences.Editor editor = sharedPreferences.edit();\n        editor.clear();\n        editor.apply();\n        Log.i(&quot;SharedPreferences&quot;, &quot;All data cleared&quot;);\n    }\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-0f5c50f4');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-fed032c0\"\n     id=\"betterdocs-code-snippet-fed032c0\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Real XML File Operations<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-fed032c0 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>import java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport org.w3c.dom.Document;\nimport org.w3c.dom.Element;\nimport javax.xml.parsers.DocumentBuilder;\nimport javax.xml.parsers.DocumentBuilderFactory;\nimport javax.xml.transform.Transformer;\nimport javax.xml.transform.TransformerFactory;\nimport javax.xml.transform.dom.DOMSource;\nimport javax.xml.transform.stream.StreamResult;\n\npublic class XmlManager {\n    private Context context;\n    private String xmlFileName = &quot;login_data.xml&quot;;\n\n    public XmlManager(Context context) {\n        this.context = context;\n    }\n\n    \/\/ Save data to XML file\n    public void saveToXml(String token, String username, String userId) {\n        try {\n            \/\/ Get file path\n            File xmlFile = new File(context.getFilesDir(), xmlFileName);\n\n            \/\/ Create Document\n            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();\n            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();\n            Document doc = docBuilder.newDocument();\n\n            \/\/ Create root element\n            Element rootElement = doc.createElement(&quot;LoginData&quot;);\n            doc.appendChild(rootElement);\n\n            \/\/ Create user info element\n            Element userElement = doc.createElement(&quot;User&quot;);\n            rootElement.appendChild(userElement);\n\n            \/\/ Add child elements\n            createElement(doc, userElement, &quot;Token&quot;, token);\n            createElement(doc, userElement, &quot;Username&quot;, username);\n            createElement(doc, userElement, &quot;UserId&quot;, userId);\n            createElement(doc, userElement, &quot;LoginTime&quot;, String.valueOf(System.currentTimeMillis()));\n\n            \/\/ Save to file\n            TransformerFactory transformerFactory = TransformerFactory.newInstance();\n            Transformer transformer = transformerFactory.newTransformer();\n            DOMSource source = new DOMSource(doc);\n            StreamResult result = new StreamResult(xmlFile);\n\n            transformer.transform(source, result);\n\n            Log.i(&quot;XMLFile&quot;, &quot;Data saved successfully: &quot; + xmlFile.getAbsolutePath());\n\n        } catch (Exception e) {\n            Log.e(&quot;XMLFile&quot;, &quot;Save failed: &quot; + e.getMessage());\n        }\n    }\n\n    \/\/ Helper method to create elements\n    private void createElement(Document doc, Element parent, String tagName, String textContent) {\n        Element element = doc.createElement(tagName);\n        element.setTextContent(textContent);\n        parent.appendChild(element);\n    }\n\n    \/\/ Read XML file\n    public void readFromXml() {\n        try {\n            File xmlFile = new File(context.getFilesDir(), xmlFileName);\n\n            if (!xmlFile.exists()) {\n                Log.w(&quot;XMLFile&quot;, &quot;File does not exist&quot;);\n                return;\n            }\n\n            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();\n            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();\n            Document doc = docBuilder.parse(xmlFile);\n\n            Element root = doc.getDocumentElement();\n            Element userElement = (Element) root.getElementsByTagName(&quot;User&quot;).item(0);\n\n            String token = getElementText(userElement, &quot;Token&quot;);\n            String username = getElementText(userElement, &quot;Username&quot;);\n            String loginTime = getElementText(userElement, &quot;LoginTime&quot;);\n\n            Log.i(&quot;XMLRead&quot;, &quot;Token: &quot; + token);\n            Log.i(&quot;XMLRead&quot;, &quot;Username: &quot; + username);\n            Log.i(&quot;XMLRead&quot;, &quot;LoginTime: &quot; + loginTime);\n\n        } catch (Exception e) {\n            Log.e(&quot;XMLFile&quot;, &quot;Read failed: &quot; + e.getMessage());\n        }\n    }\n\n    \/\/ Helper method to get element text\n    private String getElementText(Element parent, String tagName) {\n        Element element = (Element) parent.getElementsByTagName(tagName).item(0);\n        return element != null ? element.getTextContent() : &quot;&quot;;\n    }\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-fed032c0');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-3194b09d\"\n     id=\"betterdocs-code-snippet-3194b09d\"\n     data-language=\"java\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\u2615<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">Using Storage in Network Requests<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-3194b09d .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-java\"><code>private void handleLoginResponse(HttpResponse response) {\n    if (response.code == 200) {\n        \/\/ 1. Use SharedPreferences to save\n        PreferenceManager preferenceManager = new PreferenceManager(getContext());\n        preferenceManager.saveToken(response.token);\n        preferenceManager.saveUserInfo(&quot;calleng&quot;, &quot;12345&quot;);\n\n        \/\/ 2. Use XML file to save\n        XmlManager xmlManager = new XmlManager(getContext());\n        xmlManager.saveToXml(response.token, &quot;calleng&quot;, &quot;12345&quot;);\n\n        \/\/ 3. Read and verify\n        String savedToken = preferenceManager.getToken();\n        Log.i(&quot;StorageVerification&quot;, &quot;Saved Token: &quot; + savedToken);\n\n        xmlManager.readFromXml(); \/\/ Read XML file content\n\n    } else {\n        Log.e(&quot;LoginFailed&quot;, response.msg);\n    }\n}<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-3194b09d');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Summary<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Data Flow:<\/strong><\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>User Input \n\u2192 Construct Form \n\u2192 MD5 Signature \n\u2192 JSON Serialization \n\u2192 Retrofit Send \n\u2192 Interceptor Process \n\u2192 Server Response \n\u2192 Gson Parse \n\u2192 XML Save<\/code><\/pre>\n\n\n\n<div class=\"betterdocs-code-snippet-wrapper theme-light betterdocs-code-snippet-a077cba1\"\n     id=\"betterdocs-code-snippet-a077cba1\"\n     data-language=\"bash\"\n     data-copy-button=\"true\">\n\n            <div class=\"betterdocs-code-snippet-header betterdocs-file-preview-header\">\n        <div class=\"betterdocs-file-preview-left\">\n                            <div class=\"betterdocs-traffic-lights\">\n                    <span class=\"traffic-light traffic-light-red\"><\/span>\n                    <span class=\"traffic-light traffic-light-yellow\"><\/span>\n                    <span class=\"traffic-light traffic-light-green\"><\/span>\n                <\/div>\n            \n            <div class=\"betterdocs-file-info\">\n                                    <div class=\"betterdocs-file-icon\">\n                                                    <span class=\"betterdocs-file-icon-emoji\">\ud83d\udcbb<\/span>\n                                            <\/div>\n                \n                                    <div class=\"betterdocs-file-name\">\n                        <span class=\"file-name-text\">dipper:\/data\/data\/ca.netfilter\/shared_prefs # cat s_city.xml<\/span>\n                    <\/div>\n                            <\/div>\n        <\/div>\n\n        <div class=\"betterdocs-file-preview-right\">\n                            <div class=\"betterdocs-code-snippet-copy-container\">\n                    <button class=\"betterdocs-code-snippet-copy-button\"\n                            type=\"button\"\n                            data-clipboard-target=\"#betterdocs-code-snippet-a077cba1 .betterdocs-code-snippet-code code\"\n                            aria-label=\"Copy code to clipboard\">\n                        <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n                            <path d=\"M16 1H4C2.9 1 2 1.9 2 3V17H4V3H16V1ZM19 5H8C6.9 5 6 5.9 6 7V21C6 22.1 6.9 23 8 23H19C20.1 23 21 22.1 21 21V7C21 5.9 20.1 5 19 5ZM19 21H8V7H19V21Z\" fill=\"currentColor\"\/>\n                        <\/svg>\n                    <\/button>\n                                    <\/div>\n                    <\/div>\n        <\/div>\n    \n    <div class=\"betterdocs-code-snippet-content\">\n        \n        <pre class=\"betterdocs-code-snippet-code language-bash\"><code>dipper:\/data\/data\/ca.netfilter # cd shared_prefs\/                                                                             \ndipper:\/data\/data\/ca.netfilter\/shared_prefs # ls\ns_city.xml\ndipper:\/data\/data\/ca.netfilter\/shared_prefs # cat s_city.xml                                                                  \n&lt;?xml version=&#039;1.0&#039; encoding=&#039;utf-8&#039; standalone=&#039;yes&#039; ?&gt;\n&lt;map&gt;\n    &lt;string name=&quot;token&quot;&gt;jfieefjeifjei-jefjeifejf-ejfiefi-100&lt;\/string&gt;\n&lt;\/map&gt;\ndipper:\/data\/data\/ca.netfilter\/shared_prefs #<\/code><\/pre>\n    <\/div>\n<\/div>\n\n<script type=\"text\/javascript\">\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ Initialize copy functionality for this specific snippet\n    const snippet = document.getElementById('betterdocs-code-snippet-a077cba1');\n    if (snippet && window.BetterDocsCodeSnippet) {\n        window.BetterDocsCodeSnippet.initCopyButton(snippet);\n    }\n});\n<\/script>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Key Components:<\/strong><\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Retrofit2<\/strong> &#8211; Network request framework<\/li>\n\n\n\n<li><strong>OkHttp<\/strong> &#8211; HTTP client + interceptors<\/li>\n\n\n\n<li><strong>Gson<\/strong> &#8211; JSON serialization\/deserialization<\/li>\n\n\n\n<li><strong>SharedPreferences<\/strong> &#8211; Lightweight XML storage<\/li>\n\n\n\n<li><strong>DOM Parser<\/strong> &#8211; Standard XML file operations<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Quickly develop an Android page (user login &amp; jump) Android UI and background logic android UI User Login Interface Function Interface Function Button Background Logic Definition of user login request user login request api Network Request Flow Step 1: Request Method Step2:Form Format Comparison &#8211;&gt; Form Format (application\/x-www-form-urlencoded) HTTP Request Example: JSON Format (application\/json) &#8211;&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"doc_category":[18],"glossaries":[],"doc_tag":[],"knowledge_base":[13],"class_list":["post-468","docs","type-docs","status-publish","hentry","doc_category-android-example","knowledge_base-develop_hook"],"year_month":"2026-05","word_count":190,"total_views":"166","reactions":{"happy":"0","normal":"0","sad":"0"},"author_info":{"display_name":"sandbox","author_link":"https:\/\/www.nullflag.com\/support\/author\/sandbox\/"},"doc_category_info":[{"term_name":"Android Example","term_url":"https:\/\/www.nullflag.com\/support\/kb\/develop_hook\/android-example\/"}],"doc_tag_info":[],"taxonomy_info":{"doc_category":[{"value":18,"label":"Android Example"}],"knowledge_base":[{"value":13,"label":"evelopment and utilization, and solidification of hooks"}]},"featured_image_src_large":false,"comment_info":0,"knowledge_base_info":[{"term_name":"evelopment and utilization, and solidification of hooks","term_url":"https:\/\/www.nullflag.com\/support\/kb\/develop_hook\/","term_slug":"develop_hook"}],"knowledge_base_slug":["develop_hook"],"_links":{"self":[{"href":"https:\/\/www.nullflag.com\/support\/wp-json\/wp\/v2\/docs\/468","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nullflag.com\/support\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/www.nullflag.com\/support\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/www.nullflag.com\/support\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nullflag.com\/support\/wp-json\/wp\/v2\/comments?post=468"}],"version-history":[{"count":7,"href":"https:\/\/www.nullflag.com\/support\/wp-json\/wp\/v2\/docs\/468\/revisions"}],"predecessor-version":[{"id":580,"href":"https:\/\/www.nullflag.com\/support\/wp-json\/wp\/v2\/docs\/468\/revisions\/580"}],"wp:attachment":[{"href":"https:\/\/www.nullflag.com\/support\/wp-json\/wp\/v2\/media?parent=468"}],"wp:term":[{"taxonomy":"doc_category","embeddable":true,"href":"https:\/\/www.nullflag.com\/support\/wp-json\/wp\/v2\/doc_category?post=468"},{"taxonomy":"glossaries","embeddable":true,"href":"https:\/\/www.nullflag.com\/support\/wp-json\/wp\/v2\/glossaries?post=468"},{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/www.nullflag.com\/support\/wp-json\/wp\/v2\/doc_tag?post=468"},{"taxonomy":"knowledge_base","embeddable":true,"href":"https:\/\/www.nullflag.com\/support\/wp-json\/wp\/v2\/knowledge_base?post=468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}