<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[TechZenith - Medium]]></title>
        <description><![CDATA[TechZenith: Keeping you informed and inspired by the ever-evolving world of technology. - Medium]]></description>
        <link>https://medium.com/techzenith?source=rss----7e9fdc97eccb---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>TechZenith - Medium</title>
            <link>https://medium.com/techzenith?source=rss----7e9fdc97eccb---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 15:30:37 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/techzenith" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[What is Android API 36]]></title>
            <link>https://medium.com/techzenith/what-is-android-api-36-b6e8401e69b6?source=rss----7e9fdc97eccb---4</link>
            <guid isPermaLink="false">https://medium.com/p/b6e8401e69b6</guid>
            <category><![CDATA[android-apps]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[androiddev]]></category>
            <category><![CDATA[android-development]]></category>
            <category><![CDATA[android-app-development]]></category>
            <dc:creator><![CDATA[www.jyotishgher.in]]></dc:creator>
            <pubDate>Sat, 14 Feb 2026 16:17:51 GMT</pubDate>
            <atom:updated>2026-02-14T16:17:52.511Z</atom:updated>
            <content:encoded><![CDATA[<p>In the rapidly evolving landscape of mobile technology, <strong>Android 36</strong> (released in late 2025/early 2026) represents a pivotal shift from “Smartphones” to “Ambient Intelligence.” While previous versions of Android focused on visual overhauls (Material You) or privacy tweaks, Android 36-codenamed <strong>“Pecan Pie”</strong> internally-is the first operating system designed from the ground up to be AI-native.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/496/0*0q31ZZsq5IwZHGXe.png" /></figure><p>Here is an in-depth look at how Android 36 is redefining the mobile experience.</p><h3>1. The Core Architecture: Neural Engine 2.0</h3><p>The most significant change in Android 36 isn’t a button or a menu; it’s the kernel-level integration of <strong>Neural Engine 2.0</strong>. In older versions, AI was an app or a service. In Android 36, the OS itself is a predictive engine.</p><ul><li><strong>Zero-Latency On-Device Processing:</strong> Unlike previous generations that relied on cloud processing for complex tasks, Android 36 performs 90% of its reasoning on-device. This ensures that privacy is maintained while drastically reducing battery drain associated with data transmission.</li><li><strong>Predictive Resource Allocation:</strong> The OS anticipates which apps you will open based on your location, biometric stress levels, and time of day, pre-loading them into a “Virtual RAM” state that makes the interface feel instantaneous.</li></ul><h3><a href="https://www.blogger.com/blog/post/edit/5914738389516293803/6415687313368935120#">2. The User Interface: “Fluid Material”</a></h3><p>Android 36 introduces <strong>Fluid Material</strong>, an evolution of Google’s design language. The static grid of icons is finally beginning to fade.</p><h4>The Dynamic Canvas</h4><p>Instead of a traditional home screen, Android 36 features a <strong>Dynamic Canvas</strong>. If you are at the gym, your health metrics and music controls expand to take up 70% of the screen. If you are at work, your calendar and document snippets take priority. The UI “flows” around your context.</p><h3>Semantic Search Integration</h3><p>The search bar at the bottom of the screen has been replaced by the <strong>Semantic Hub</strong>. You no longer search for “Files” or “Photos.” You type or say, <em>“Show me that document I was reading on the train yesterday about the budget,”</em> and the OS pulls the specific section of the PDF regardless of where it’s stored.</p><h3>3. Communication: Real-Time Universal Translator</h3><p>Android 36 has effectively broken the language barrier. Building on the foundations of Live Translate, the new <strong>Universal Audio Bridge</strong> allows for:</p><ul><li><strong>Two-Way Voice Translation in Third-Party Apps:</strong> Whether you are on a WhatsApp call or a Zoom meeting, Android 36 provides real-time, lag-free voice dubbing in over 120 languages.</li><li><strong>Contextual Nuance:</strong> The AI now recognizes sarcasm, regional dialects, and emotional tone, ensuring that the translation isn’t just accurate in words, but also in intent.</li></ul><h3>4. Privacy and the “Private Compute Core”</h3><p>With great AI power comes the need for great privacy. Android 36 introduces <strong>The Vault</strong>, a hardware-isolated environment for all personal data.</p><ul><li><strong>Data Poisoning Protection:</strong> To prevent malicious apps from “learning” your habits, Android 36 generates “noise” data to confuse trackers while keeping your actual usage patterns locked in the Vault.</li><li><strong>One-Time Permissions 2.0:</strong> You can now grant “Visual Permissions” where an app can see the screen for a specific task (like scanning a QR code) and then immediately loses access the microsecond the task is finished.</li></ul><h3>5. Connectivity: The “Satellite-First” Era</h3><p>Android 36 marks the end of “No Service” zones. Through partnerships with global satellite constellations, Android 36 features <strong>Seamless Satellite Roaming</strong>.</p><p>When terrestrial 5G or 6G signals drop below a certain threshold, the OS automatically handshakes with low-earth orbit (LEO) satellites. This isn’t just for emergencies anymore; Android 36 supports low-bandwidth messaging and navigation via satellite as a standard feature, included in the OS core.</p><p><em>Originally published at </em><a href="https://whatandroidwhy.blogspot.com/2026/02/what-is-android-api-36.html"><em>https://whatandroidwhy.blogspot.com</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b6e8401e69b6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/techzenith/what-is-android-api-36-b6e8401e69b6">What is Android API 36</a> was originally published in <a href="https://medium.com/techzenith">TechZenith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What is Android 37]]></title>
            <link>https://medium.com/techzenith/what-is-android-37-05c6a8047da4?source=rss----7e9fdc97eccb---4</link>
            <guid isPermaLink="false">https://medium.com/p/05c6a8047da4</guid>
            <category><![CDATA[android-development]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[android-app-development]]></category>
            <category><![CDATA[quantum-computing]]></category>
            <dc:creator><![CDATA[www.jyotishgher.in]]></dc:creator>
            <pubDate>Thu, 12 Feb 2026 05:53:34 GMT</pubDate>
            <atom:updated>2026-02-12T05:53:36.152Z</atom:updated>
            <content:encoded><![CDATA[<p>What is Android 37 ,while the tech world is currently anticipating the evolution of <a href="https://whatandroidwhy.blogspot.com/2026/02/what-is-android-api-36.html">Android 15 and 16,</a> imagining <strong>Android 37</strong> requires us to project roughly 22 years into the future (circa 2047). By then, the “operating system” will likely have moved beyond glass screens and pocket-sized bricks, transitioning into a ubiquitous, ambient intelligence that integrates directly with human biology and the physical world.</p><p>Here is a deep dive into the speculative world of Android 37: The Neural-Spatio OS.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/446/0*uIAkzXnCuEwGp0uQ" /><figcaption>What is Android 37</figcaption></figure><h3>1. From “Mobile First” to “Neural First”</h3><p>The most significant shift in Android 37 is the retirement of the traditional Graphic User Interface (GUI). While Android 14 relied on Material You, Android 37 utilizes <strong>Material Mind</strong>.</p><p>By 2047, non-invasive BCI (Brain-Computer Interface) wearables-integrated into glasses, ear-pieces, or even biocompatible dermal patches-have replaced the handheld smartphone. Android 37 doesn’t wait for you to tap an icon; it anticipates intent through synaptic patterns. If you think about wanting to see the “Upay of Anant Kaal Sarp Yog” (as found on your blog), the OS doesn’t open a browser; it projects the text directly into your visual field via augmented reality (AR) or synthesized thought.</p><h3>2. The Architecture: Quantum-Linux Kernel</h3><p>The Linux kernel that served as the foundation for decades has evolved into the <strong>Quantum-Linux Kernel (QLK)</strong>.</p><ul><li><strong>Instantaneous Processing:</strong> Android 37 leverages quantum entanglement for data transfer, meaning “latency” is a word found only in history books.</li><li><strong>Infinite Multitasking:</strong> Unlike the restricted RAM management of the 2020s, Android 37 uses “Dynamic Reality Sharding.” It can run thousands of “Applets” (now called Entities) simultaneously across a distributed cloud network, ensuring your device never slows down, regardless of the complexity of the task.</li></ul><h3>3. The “Gemini Omega” Core</h3><p>Artificial Intelligence is no longer an app or a side-feature; it is the core of the OS. <strong>Gemini Omega</strong>, the successor to the AI of the 2020s, acts as a digital twin.</p><p>In Android 37, the OS knows your astrological chart, your health metrics, and your professional schedule better than you do. It uses <strong>Predictive Life Path Modeling</strong> to suggest actions. For example, if it detects a planetary transit that might cause stress (based on your <a href="https://www.jyotishgher.in/videos/how-to-find-life-partner.php">Jyotish interests</a>), it automatically adjusts your environment-dimming smart lights, playing frequency-tuned audio, and rescheduling non-essential meetings.</p><h3>4. Privacy: The Sovereign Vault</h3><p>In an era where the OS is connected to your thoughts, privacy is the ultimate concern. Android 37 introduces the <strong>Sovereign Vault</strong>.</p><p>Instead of your data living on Google’s servers, Android 37 operates on a decentralized, “Zero-Knowledge” mesh network. Your memories, biometric data, and personal preferences are encrypted with post-quantum cryptography. The OS operates on a “Local-Only” logic for sensitive neural data, ensuring that even Google cannot “see” your thoughts-only the metadata required to provide services.</p><h3>5. Visuals: The Death of the Screen</h3><p>By the time Android 37 arrives, hardware has bifurcated into two categories:</p><ol><li><strong>Ambient Surfaces:</strong> Every window, mirror, and tabletop is a potential display. Android 37 uses “Surface Casting” to move your workspace from a kitchen counter to a car windshield seamlessly.</li><li><strong>Retinal Projection:</strong> Using low-power micro-LEDs or laser projection, the OS draws the interface directly onto your retina.</li></ol><p>The “Home Screen” is now a 360-degree 3D environment. You don’t scroll through a feed; you walk through a digital gallery of your news, messages, and social updates.</p><h3>6. Connectivity: 9G and Beyond</h3><p>While we currently struggle with 5G dead zones, Android 37 utilizes <strong>9G (Terahertz) connectivity</strong> combined with <strong>Satellite Mesh</strong>.</p><p>Connectivity is no longer about “bars” of signal. It is about “Atmospheric Data.” The very air around us becomes a medium for data transmission using light-fidelity (Li-Fi) and satellite-to-neural links. This ensures that whether you are in a remote mountain temple or a subterranean city, your connection to the global collective remains unbroken.</p><h3>7. The Developer Ecosystem: Prompt-Based Creation</h3><p>Coding in Android 37 has shifted from Java and Kotlin to <strong>Natural Intent Language (NIL)</strong>.</p><p>Developers no longer write lines of code. They define the “Persona” and “Purpose” of an Entity. To build an app for your Jyotish blog in 2047, you would simply tell the OS: <em>“Create a localized astral-tracking Entity that provides real-time remedies for Kaal Sarp Yog using haptic feedback.”</em> The OS then compiles the necessary quantum logic gates in real-time.</p><h3>8. Sustainability: Kinetic and Thermal Charging</h3><p>Battery anxiety is a relic of the past. Android 37 devices are powered by <strong>Energy Harvesting</strong>.</p><ul><li><strong>Kinetic:</strong> Charging via the movement of your body.</li><li><strong>Thermal:</strong> Using the heat of your skin to power the micro-processors.</li><li><strong>Solar-Dermal:</strong> Transparent solar cells integrated into the device’s casing or the wearable itself.</li></ul><p>A single “charge” can last months, or in some cases, the device is perpetually powered as long as it is near a human heat source.</p><h3>9. Integration with the Physical World (Matter 5.0)</h3><p>Android 37 acts as the “remote control for reality.” Through an advanced version of the Matter protocol, the OS can manipulate physical objects.</p><ul><li><strong>Molecular Haptics:</strong> When you touch a holographic object in Android 37, ultrasound waves create the sensation of resistance and texture, making digital objects feel real.</li><li><strong>Smart Matter:</strong> The OS can command “programmable matter” to change shape. Your phone might literally unfold into a tablet or reshape itself into a wearable bracelet depending on the context.</li></ul><h3>The Human-OS Symbiosis</h3><p>Android 37 represents the final transition of technology from a <em>tool we use</em> to an <em>extension of who we are</em>. It bridges the gap between the ancient wisdom of the stars and the future of quantum computation.</p><p>In 2047, you won’t “search” for a remedy on a blog; you will <em>feel</em> the solution as part of your intuition, provided by an operating system that has become as natural as breathing.</p><p><em>Originally published at </em><a href="https://whatandroidwhy.blogspot.com/2026/02/what-is-android-37.html"><em>https://whatandroidwhy.blogspot.com</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=05c6a8047da4" width="1" height="1" alt=""><hr><p><a href="https://medium.com/techzenith/what-is-android-37-05c6a8047da4">What is Android 37</a> was originally published in <a href="https://medium.com/techzenith">TechZenith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[6 Websites I Visit Every Day in 2026 (And Why My 2020 Self Would Be Shocked)]]></title>
            <link>https://medium.com/techzenith/6-websites-i-visit-every-day-in-2026-and-why-my-2020-self-would-be-shocked-4c7aa4cd19e0?source=rss----7e9fdc97eccb---4</link>
            <guid isPermaLink="false">https://medium.com/p/4c7aa4cd19e0</guid>
            <category><![CDATA[website]]></category>
            <category><![CDATA[2026]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[www.jyotishgher.in]]></dc:creator>
            <pubDate>Fri, 31 Oct 2025 08:46:03 GMT</pubDate>
            <atom:updated>2025-10-31T08:46:02.440Z</atom:updated>
            <content:encoded><![CDATA[<p>It’s 2026, and the digital landscape has transformed in ways I could barely have imagined just a few years ago. The endless, algorithmic scroll of the monolithic social platforms of the early 2020s has given way to a more intentional, personalized, and functional web. My daily browsing habits are no longer about killing time, but about enhancing it. Here are the six websites I visit without fail every day, each a testament to how our relationship with the internet has evolved.</p><figure><img alt="6 Websites I Visit Every Day in 2026" src="https://cdn-images-1.medium.com/max/1024/1*SbFmTz-GZtnb5WskZKJ50g.png" /><figcaption>6 Websites I Visit Every Day in 2026</figcaption></figure><h3>1. The Compass: My AI-Powered Digital Chief of Staff</h3><p>Then (2020): A chaotic mix of bookmarks, a cluttered bookmark bar, and a dozen open tabs for email, calendar, news, and project management.<br>Now (2026): [The Compass] — a single, unified dashboard that serves as the operational hub of my digital life.</p><p>The Compass isn’t just an aggregator; it’s an intelligent interface. Upon logging in, it greets me by name and provides a “Morning Briefing.” This isn’t a simple list of links. It’s a synthesized summary prepared by my AI assistant, pulling from the other sites on this list. It highlights my top three priorities for the day from my project management tool, warns me of a potential traffic delay for my first meeting, and surfaces one news article deeply relevant to my industry, summarizing its key points in two sentences.</p><p>I don’t “use” The Compass so much as I “consult” it. It’s my digital chief of staff, filtering the noise and presenting only the signal I need to start my day effectively. My 2020 self, drowning in tab overload, would have wept with relief at its serene efficiency.</p><h3>2. Nexus: The Return of the Interest-Based Forum</h3><p>Then (2020): Endlessly doom-scrolling through Twitter/X and Reddit, seeing a jumbled mix of world news, memes, and personal drama from strangers.<br>Now (2026): [Nexus] — a platform built not on followers, but on passions.</p><p>Nexus killed the influencer. Instead, it revived the deeply-nested forum model with a modern, AI-curated twist. I’m a member of “Nexus Nodes” for “Post-Climate Adaptive Architecture,” “Vintage Analog Synthesizers,” and “Competitive Sourdough Baking.” Each Node has strict, community-enforced quality standards. Low-effort posts are filtered out, and AI assistants help summarize long technical threads or fact-check claims in real-time.</p><p>My daily visit feels like stepping into a specialized library or a dedicated clubhouse. The conversations are nuanced, knowledgeable, and constructive. The dopamine hit doesn’t come from likes, but from genuine learning and connection. The chaotic, anger-driven algorithms of old social media feel like a distant, bad dream.</p><h3>3. DeepRead: Beyond the Clickbait</h3><p>Then (2020): Skimming headlines from a dozen different news sites, most of them designed for outrage or clicks, leaving me informed of the controversy but not the context.<br>Now (2026): [DeepRead] — the anti-clickbait news platform.</p><p>DeepRead operates on a simple, brilliant model: it only publishes one major, in-depth “Context Brief” per day on a leading story, and two or three shorter “Explainer” pieces. There are no headlines in the traditional sense, only posed questions: “What Are the Real-World Implications of the New EU AI Accord?” or “How is the Re-greening of the Sahel Actually Progressing?”</p><p>Each piece is a multi-format masterpiece — text, integrated data visualizations, short expert video interviews, and a timeline of key events. Reading it feels like taking a 15-minute masterclass on the most important thing happening in the world. It has single-handedly cured my news anxiety by replacing shallow information with deep understanding.</p><h3>4. Soma: The Digital Wellness Prescription</h3><p>Then (2020): Using a meditation app sporadically, feeling guilty about screen time reports, and having no real structure for mental fitness.<br>Now (2026): [Soma] — my personalized digital wellness clinic.</p><p>Soma understands that wellness isn’t one-size-fits-all. Each morning, I begin with a 60-second “Pulse Check” — a quick series of questions and voice analysis that gauges my mood and energy levels. Based on this, Soma “prescribes” my daily regimen. It might be a 5-minute focused breathing exercise, a 10-minute guided journaling prompt about gratitude, or a “Audio Walk” that pairs ambient soundscapes with a narrative designed to stimulate creative thinking.</p><p>My daily visit is non-negotiable, like brushing my teeth. It’s the site that actively repairs the cognitive drain caused by the rest of the digital world. It’s not an app I ignore; it’s a practice I engage with, and it has fundamentally changed my relationship with stress and focus.</p><h3>5. The Forge: My Continuous Learning Engine</h3><p>Then (2020): Occasionally browsing YouTube tutorials or signing up for a multi-week online course I’d never finish.<br>Now (2026): [The Forge] — a platform for “micro-apprenticeships.”</p><p>The Forge is built on the premise that learning is a continuous, daily process, not a periodic event. Each day, it serves me a single, 10-minute “Learning Module.” This week, I’m on a track for “Basic Quantum Computing Concepts.” Yesterday’s module was a 7-minute interactive simulation explaining superposition. Today’s is a 3-minute read on qubit stability, followed by a two-question quiz.</p><p>The genius is in the consistency and the granularity. It doesn’t feel like a chore; it feels like a daily mental warm-up. Over a year, these tiny modules compound into genuine, retained expertise. It has made lifelong learning not just an aspiration, but a seamless part of my daily routine.</p><h3>6. Mycelia: The Anti-Silo Social Network</h3><p>Then (2020): Posting the same photo to Instagram, the same thought to Twitter, and the same life update to Facebook, fragmenting my digital identity.<br>Now (2026): [Mycelia] — the decentralized, owner-controlled social web.</p><p>Mycelia is less a “website” and more a “home base.” It’s my personal blog, photo gallery, and status update hub, all rolled into one. I own all the content and data. The magic, however, is in the “Connective Threads.” When I post a photo from a recent hike, it doesn’t just sit on my page. With my permission, it’s seamlessly syndicated to the “Close Friends” circle on a friend’s Nexus Node, appears as a preview in my family’s Compass feeds, and is archived in my private Soma journal.</p><p>My daily visit is to tend my own digital garden. I write a short reflection, post a photo, or share an interesting link from DeepRead. I’m not posting for an algorithm; I’m connecting my little node of the web to the nodes of the people I care about. It’s quiet, personal, and profoundly human.</p><p>This daily ritual across these six sites represents a broader shift: from a web that <em>happened to us</em> to a web that <em>works for us</em>. It’s a move away from centralized attention markets and toward a distributed, purposeful, and human-centric digital experience. My 2020 self was a passive consumer in a crowded, noisy bazaar. In 2026, I am an active curator in a well-designed library of my own making. And the difference, quite literally, is day and night.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4c7aa4cd19e0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/techzenith/6-websites-i-visit-every-day-in-2026-and-why-my-2020-self-would-be-shocked-4c7aa4cd19e0">6 Websites I Visit Every Day in 2026 (And Why My 2020 Self Would Be Shocked)</a> was originally published in <a href="https://medium.com/techzenith">TechZenith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Steps to Implement Deep Link (2 + App Links) for Your New App]]></title>
            <link>https://medium.com/techzenith/steps-to-implement-deep-link-2-app-links-for-your-new-app-612bddb17d54?source=rss----7e9fdc97eccb---4</link>
            <guid isPermaLink="false">https://medium.com/p/612bddb17d54</guid>
            <category><![CDATA[mobile-app-deep-linking]]></category>
            <category><![CDATA[deeplink]]></category>
            <category><![CDATA[deep-linking]]></category>
            <category><![CDATA[deep-link-android]]></category>
            <category><![CDATA[deeplinktutorial]]></category>
            <dc:creator><![CDATA[www.jyotishgher.in]]></dc:creator>
            <pubDate>Sat, 23 Aug 2025 04:29:18 GMT</pubDate>
            <atom:updated>2025-08-23T04:29:07.491Z</atom:updated>
            <content:encoded><![CDATA[<p>Since I already have <strong>one app on Play Store with deep link (App Links)</strong>, adding <strong>another app</strong> with its own deep links requires a few careful steps.</p><figure><img alt="Steps to Implement Deep Link" src="https://cdn-images-1.medium.com/max/1024/1*aLpWnMqD8yDXsoIRffo2dQ.png" /><figcaption>Steps to Implement Deep Link</figcaption></figure><h4>1. Create new Digital Asset Links file (assetlinks.json)</h4><p>Every app must have its own <strong>package name</strong> and <strong>SHA256 certificate fingerprints</strong> in the assetlinks.json.</p><p>For your <strong>new app</strong> (let’s say package_name = com.yourorg.newapp):</p><p>[<br> {<br> “relation”: [“delegate_permission/common.handle_all_urls”],<br> “target”: {<br> “namespace”: “android_app”,<br> “package_name”: “com.yourorg.newapp”,<br> “sha256_cert_fingerprints”: [<br> “AA:BB:CC:DD:…:FF” // Replace with your new app signing certificate SHA-256<br> ]<br> }<br> }<br>]</p><p>2. Host the assetlinks.json file</p><ul><li>Make sure it is <strong>publicly accessible</strong> (check with browser).</li><li>If you already have an assetlinks.json for the first app, you just need to <strong>add another object</strong> for the second app.</li></ul><h3>Example with <strong>two apps in same file</strong>:</h3><pre>[<br>  {<br>    &quot;relation&quot;: [&quot;delegate_permission/common.handle_all_urls&quot;],<br>    &quot;target&quot;: {<br>      &quot;namespace&quot;: &quot;android_app&quot;,<br>      &quot;package_name&quot;: &quot;nanoakhi.rcfinternal&quot;,<br>      &quot;sha256_cert_fingerprints&quot;: [<br>        &quot;AA:BB:CC:DD:…:FF&quot;,   //this is Google play console u will get<br>        &quot;AA:BB:CC:DD:…:FF&quot;  //this is Android Studio u will get for debugging<br>      ]<br>    }<br>  },<br>  {<br>    &quot;relation&quot;: [&quot;delegate_permission/common.handle_all_urls&quot;],<br>    &quot;target&quot;: {<br>      &quot;namespace&quot;: &quot;android_app&quot;,<br>      &quot;package_name&quot;: &quot;com.yourorg.newapp&quot;,<br>      &quot;sha256_cert_fingerprints&quot;: [<br>&quot;AA:BB:CC:DD:…:FF&quot;,   //this is Google play console u will get<br>        &quot;AA:BB:CC:DD:…:FF&quot;  //this is Android Studio u will get for debugging<br>      ]<br>    }<br>  }<br>]</pre><h4>3. Update your new app’s AndroidManifest.xml</h4><p>Add an <strong>intent filter</strong> to handle deep links:</p><pre>&lt;activity<br>    android:name=&quot;.YourDeepLinkActivity&quot;<br>    android:exported=&quot;true&quot;&gt;<br>    <br>    &lt;intent-filter android:autoVerify=&quot;true&quot;&gt;<br>        &lt;action android:name=&quot;android.intent.action.VIEW&quot; /&gt;<br><br>        &lt;category android:name=&quot;android.intent.category.DEFAULT&quot; /&gt;<br>        &lt;category android:name=&quot;android.intent.category.BROWSABLE&quot; /&gt;<br><br>        &lt;!-- Change host/path according to your domain --&gt;<br>        &lt;data<br>            android:scheme=&quot;https&quot;<br>            android:host=&quot;yourdomain.com&quot;<br>            android:pathPrefix=&quot;/deeplink&quot; /&gt;<br>    &lt;/intent-filter&gt;<br>&lt;/activity&gt;</pre><p>android:autoVerify=&quot;true&quot; makes Android check assetlinks.json during install.</p><h4>4. Handle the deep link in code</h4><p>In your YourDeepLinkActivity (or MainActivity):</p><pre>@Override<br>protected void onCreate(Bundle savedInstanceState) {<br>    super.onCreate(savedInstanceState);<br>    setContentView(R.layout.activity_main);<br><br>    Intent intent = getIntent();<br>    Uri data = intent.getData();<br><br>    if (data != null) {<br>        String path = data.getPath();<br>        String query = data.getQueryParameter(&quot;id&quot;); // Example<br>        Toast.makeText(this, &quot;Deep link opened: &quot; + path + &quot; id=&quot; + query, Toast.LENGTH_LONG).show();<br>    }<br>}</pre><h3>Summary:</h3><ul><li>Keep <strong>one </strong><strong>assetlinks.json</strong> for all apps, with multiple entries.</li><li>Each app must have its <strong>own package + SHA256 fingerprint</strong> entry.</li><li>Add <strong>intent filter</strong> in manifest.</li><li>Handle the deep link in activity code.</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=612bddb17d54" width="1" height="1" alt=""><hr><p><a href="https://medium.com/techzenith/steps-to-implement-deep-link-2-app-links-for-your-new-app-612bddb17d54">Steps to Implement Deep Link (2 + App Links) for Your New App</a> was originally published in <a href="https://medium.com/techzenith">TechZenith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[OTP login page Android JSON API]]></title>
            <link>https://medium.com/techzenith/otp-login-page-android-json-api-bb604273c5c6?source=rss----7e9fdc97eccb---4</link>
            <guid isPermaLink="false">https://medium.com/p/bb604273c5c6</guid>
            <category><![CDATA[android-login]]></category>
            <category><![CDATA[otp-login]]></category>
            <category><![CDATA[json-web-token]]></category>
            <category><![CDATA[json]]></category>
            <category><![CDATA[android]]></category>
            <dc:creator><![CDATA[www.jyotishgher.in]]></dc:creator>
            <pubDate>Mon, 04 Aug 2025 04:57:18 GMT</pubDate>
            <atom:updated>2025-08-04T04:57:05.925Z</atom:updated>
            <content:encoded><![CDATA[<p>To <strong>skip the OTP login page</strong> once the OTP has been verified <strong>at least once</strong>, you can use SharedPreferences to store a flag like otp_verified=true when verification succeeds. On future launches, check this flag in onCreate() and redirect the user to the Dashboard directly.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CZSXR_qkvA-Vg1Q4Udl-SQ.png" /><figcaption>OTP login page Android</figcaption></figure><h3>Step-by-step changes:</h3><h4>1. Set flag when OTP is verified</h4><p>In insertOtpToCmms() method, after successful login (whether success == 1 or success == 2), save a flag in SharedPreferences.</p><blockquote>SharedPreferences.Editor editor = settings.edit();<br>editor.putBoolean(“otp_verified”, true);<br>editor.apply();</blockquote><h3>For Example</h3><p>So, your if (success == 1) and if (success == 2) blocks become:</p><pre>if (success == 1) {<br>    SharedPreferences.Editor editor = settings.edit();<br>    editor.putBoolean(&quot;otp_verified&quot;, true);<br>    editor.apply();<br><br>    Intent intent = new Intent(MainActivity.this, entry_page_register.class);<br>    intent.putExtra(&quot;MOBILE&quot;, mobile);<br>    intent.putExtra(&quot;TYPE&quot;, &quot;LOGIN&quot;);<br>    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);<br>    startActivity(intent);<br>} else if (success == 2) {<br>    SharedPreferences.Editor editor = settings.edit();<br>    editor.putBoolean(&quot;otp_verified&quot;, true);<br>    editor.apply();<br><br>    Intent intent = new Intent(MainActivity.this, dashboard.class);<br>    intent.putExtra(&quot;MOBILE&quot;, mobile);<br>    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);<br>    startActivity(intent);<br>}</pre><h4>2. Check this flag in onCreate() before showing the login UI</h4><p>Add the following at the very <strong>top of your </strong><strong>onCreate()</strong>:</p><p>settings = getSharedPreferences(MyPREFERENCES, 0);<br>boolean isOtpVerified = settings.getBoolean(“otp_verified”, false);</p><blockquote>if (isOtpVerified) {<br> // Redirect to dashboard and finish this activity<br> Intent intent = new Intent(MainActivity.this, dashboard.class);<br> intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);<br> startActivity(intent);<br> finish(); // Don’t allow returning to OTP screen<br> return;<br>}</blockquote><h3>Optional: To reset OTP (e.g. during logout)</h3><p>When user logs out, you can clear this flag like this:</p><blockquote>SharedPreferences.Editor editor = getSharedPreferences(MyPREFERENCES, 0).edit();<br>editor.remove(“otp_verified”); // or editor.clear() to wipe all<br>editor.apply();</blockquote><h3>Final result:</h3><ul><li>First login → OTP shown → Verified → Dashboard</li><li>Next time opening app → Goes directly to Dashboard</li><li>Only shows OTP screen if not verified yet or after logout.</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bb604273c5c6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/techzenith/otp-login-page-android-json-api-bb604273c5c6">OTP login page Android JSON API</a> was originally published in <a href="https://medium.com/techzenith">TechZenith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[session_start() in PHP: A session had already been started]]></title>
            <link>https://medium.com/techzenith/session-start-in-php-a-session-had-already-been-started-b6c6ad0bb2e1?source=rss----7e9fdc97eccb---4</link>
            <guid isPermaLink="false">https://medium.com/p/b6c6ad0bb2e1</guid>
            <category><![CDATA[cookies]]></category>
            <category><![CDATA[php-developers]]></category>
            <category><![CDATA[sessions]]></category>
            <category><![CDATA[php]]></category>
            <dc:creator><![CDATA[www.jyotishgher.in]]></dc:creator>
            <pubDate>Wed, 30 Jul 2025 06:06:17 GMT</pubDate>
            <atom:updated>2025-07-30T06:06:06.858Z</atom:updated>
            <content:encoded><![CDATA[<p>The error Notice: session_start(): A session had already been started — ignoring occurs because session_start() is being called multiple times in your application. In PHP, session_start() should only be called once per request, as subsequent calls will trigger this notice. This is likely happening because the session_start() function is being invoked in the index.php file and possibly in one of the included files (../includes/db.php, ../includes/functions.php, ../includes/header.php, or ../includes/footer.php).</p><figure><img alt="session_start() in PHP" src="https://cdn-images-1.medium.com/max/464/0*-yRaYJcVQXfq9p2t.png" /><figcaption>session_start() in PHP</figcaption></figure><p>Here’s how you can diagnose and fix the issue:</p><h3>Steps to Resolve the Issue</h3><ol><li><strong>Check for Multiple session_start() Calls</strong></li></ol><ul><li>The error indicates that session_start() is being called more than once. Since you have session_start() on line 11 of index.php, check the included files (db.php, functions.php, header.php, or footer.php) for additional calls to session_start().</li><li>Look for session_start() in:</li><li>../includes/db.php</li><li>../includes/functions.php</li><li>../includes/header.php</li><li>../includes/footer.php</li></ul><h3><strong>Prevent Multiple session_start() Calls</strong></h3><ul><li>To avoid this issue, ensure that session_start() is called only once at the beginning of the request. You can use the session_status() function to check if a session is already active before calling session_start(). Modify the code in index.php (line 11) as follows:</li><li>// Start session only if it hasn’t been started if (session_status() === PHP_SESSION_NONE) { session_start(); }</li><li>This checks if a session is already active (PHP_SESSION_ACTIVE) and only starts a new session if none exists (PHP_SESSION_NONE).</li></ul><h3><strong>Move session_start() to a Common Include File</strong></h3><ul><li>If multiple files in your application need session access, it’s better to move the session_start() call to a single common file that is included early in the request lifecycle, such as ../includes/functions.php or ../includes/header.php. For example, in functions.php:</li><li>// In ../includes/functions.php if (session_status() === PHP_SESSION_NONE) { session_start(); }</li><li>Then, remove the session_start() call from index.php and ensure that functions.php is included before any session-related code.</li></ul><h3><strong>Best Practices</strong></h3><ul><li>Always call session_start() as early as possible in your script, before any output is sent to the browser, to avoid issues with headers already sent</li><li>Consider centralizing session management in a single configuration file to avoid accidental duplicate calls.</li><li>In production, disable display_errors to prevent notices from being exposed to users:</li></ul><p><em>Originally published at </em><a href="https://whatandroidwhy.blogspot.com/2025/07/sessionstart-in-php-session-had-already.html"><em>https://whatandroidwhy.blogspot.com</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b6c6ad0bb2e1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/techzenith/session-start-in-php-a-session-had-already-been-started-b6c6ad0bb2e1">session_start() in PHP: A session had already been started</a> was originally published in <a href="https://medium.com/techzenith">TechZenith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[csrf_token in PHP for Secure csrf_tokenTransfer]]></title>
            <link>https://medium.com/techzenith/csrf-token-in-php-for-secure-csrf-tokentransfer-e8cce665b087?source=rss----7e9fdc97eccb---4</link>
            <guid isPermaLink="false">https://medium.com/p/e8cce665b087</guid>
            <category><![CDATA[csrf-token]]></category>
            <category><![CDATA[php]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[post]]></category>
            <category><![CDATA[csr-tokens]]></category>
            <dc:creator><![CDATA[www.jyotishgher.in]]></dc:creator>
            <pubDate>Tue, 29 Jul 2025 04:45:44 GMT</pubDate>
            <atom:updated>2025-07-29T04:45:32.774Z</atom:updated>
            <content:encoded><![CDATA[<h3>csrf_token in PHP for Secure Post Transfer</h3><p>To secure the sensitive parameters (e.g., user_id, dob, birth_time, birth_place, gender, etc.) being passed via URL query strings in the &lt;a&gt; tags, you need to prevent sensitive data from being exposed in the browser’s address bar, history, or logs, and protect against potential tampering or unauthorized access. Below, I’ll outline the steps to make these links secure by avoiding sensitive data in query strings and implementing a more secure approach.</p><figure><img alt="csrf_token in PHP for Secure Post Transfer" src="https://cdn-images-1.medium.com/max/1024/1*K3ftw1AGYRxfl8FzMDB6dw.png" /><figcaption>csrf_token in PHP for Secure Post Transfer</figcaption></figure><h4>Security Concerns with Current Approach</h4><ol><li><strong>Sensitive Data Exposure</strong>: Parameters like dob, birth_time, and birth_place are personally identifiable information (PII) visible in the URL, which can be logged in browser history, server logs, or intercepted by intermediaries.</li><li><strong>Tampering Risk</strong>: Query parameters can be modified by users, potentially leading to unauthorized access or incorrect data processing.</li><li><strong>Lack of Confidentiality</strong>: URLs are not encrypted in transit (unless using HTTPS, which only protects during transmission, not in logs or history).</li><li><strong>Replay Attacks</strong>: URLs can be copied and reused, potentially allowing unauthorized access to restricted data.</li></ol><h4>Secure Solution</h4><p>To secure the links, you can:</p><ol><li><strong>Use POST Requests Instead of GET</strong>: Move sensitive data to form submissions via POST, which sends data in the request body, not the URL.</li><li><strong>Use Encrypted Tokens</strong>: Replace sensitive parameters with an encrypted token or temporary ID that maps to the data on the server.</li><li><strong>Implement Session-Based Data Storage</strong>: Store sensitive data in the session or a temporary database table and pass only a reference ID.</li><li><strong>Add CSRF Protection</strong>: Include a CSRF token to prevent cross-site request forgery when using forms.</li><li><strong>Validate and Authorize Access</strong>: Ensure the target pages (horoscope_charts.php and horoscope_matching.php) validate user permissions and data integrity.</li></ol><p>Below, I’ll implement the <strong>POST request with session-based data storage</strong> approach, as it balances security and simplicity while completely avoiding sensitive data in URLs.</p><h4>Updated PHP and HTML</h4><blockquote>&lt;?php // Generate unique tokens for horoscope and matching data $horoscope_token = bin2hex(random_bytes(16)); // Unique token for horoscope</blockquote><blockquote>$matching_token = bin2hex(random_bytes(16)); // Unique token for matching</blockquote><blockquote>// Store horoscope data in session $_SESSION[‘horoscope_data’][$horoscope_token] = [ ‘user_id’ =&gt; $user_id, ‘profile_id’ =&gt; $profile_id, ‘created_at’ =&gt; time() // For expiration check ];</blockquote><blockquote>// Store matching data in session $_SESSION[‘matching_data’][$matching_token] = [ ‘user_id’ =&gt; $user_id, ‘profile_id’ =&gt; $profile_id, ‘user_gender’ =&gt; $current_user[‘gender’] ?: ‘’, ‘profile_dob’ =&gt; $profile[‘dob’] ?: ‘’, ‘created_at’ =&gt; time() ]; // Generate CSRF token if (!isset($_SESSION[‘csrf_token’]))</blockquote><blockquote>{ $_SESSION[‘csrf_token’] = bin2hex(random_bytes(32)); } $csrf_token = $_SESSION[‘csrf_token’]; ?&gt; &lt;div class=”side-buttons”&gt; &lt;?php if ($membership_plan === ‘Free’): ?&gt; &lt;form action=”page1.php” method=”POST”&gt; &lt;input type=”hidden” name=”token” value=”&lt;?php echo htmlspecialchars($horoscope_token); ?&gt;”&gt; &lt;input type=”hidden” name=”csrf_token” value=”&lt;?php echo htmlspecialchars($csrf_token); ?&gt;”&gt; &lt;button type=”submit” id=”horoscopeButton”&gt;View Horoscope&lt;/button&gt; &lt;/form&gt; &lt;form action=”page1=2.php” method=”POST”&gt; &lt;input type=”hidden” name=”token” value=”&lt;?php echo htmlspecialchars($matching_token); ?&gt;”&gt; &lt;input type=”hidden” name=”csrf_token” value=”&lt;?php echo htmlspecialchars($csrf_token); ?&gt;”&gt; &lt;button type=”submit” id=”matchingButton”&gt;Horoscope Matching&lt;/button&gt; &lt;/form&gt; &lt;?php else: ?&gt; &lt;?php endif; ?&gt; &lt;/div&gt;</blockquote><h3>page1.php</h3><p>&lt;?php</p><p>session_start();</p><p>require_once ‘includes/db.php’;</p><p>require_once ‘includes/functions.php’;</p><p>if (!isset($_SESSION[‘user_id’])) {</p><p>header(“Location: login.php”);</p><p>exit;</p><p>}</p><p>// Validate CSRF token</p><p>if (!isset($_POST[‘csrf_token’]) || $_POST[‘csrf_token’] !== $_SESSION[‘csrf_token’]) {</p><p>$_SESSION[‘errors’] = [“Invalid CSRF token.”];</p><p>header(“Location: error.php”);</p><p>exit;</p><p>}</p><p>// Validate token</p><p>if (!isset($_POST[‘token’]) || !isset($_SESSION[‘horoscope_data’][$_POST[‘token’]])) {</p><p>$_SESSION[‘errors’] = [“Invalid or expired token.”];</p><p>header(“Location: error.php”);</p><p>exit;</p><p>}</p><p>// Retrieve data from session</p><p>$data = $_SESSION[‘horoscope_data’][$_POST[‘token’]];</p><p>// Check token expiration (e.g., 5 minutes)</p><p>if (time() — $data[‘created_at’] &gt; 300) {</p><p>unset($_SESSION[‘horoscope_data’][$_POST[‘token’]]);</p><p>$_SESSION[‘errors’] = [“Token expired.”];</p><p>header(“Location: error.php”);</p><p>exit;</p><p>}</p><p>// Verify user membership</p><p>$stmt = $conn-&gt;prepare(“SELECT * FROM tablename WHERE id = ?”);</p><p>$stmt-&gt;execute([$_SESSION[‘user_id’]]);</p><p>$user = $stmt-&gt;fetch(PDO::FETCH_ASSOC);</p><p>if (!$user || !in_array($user[‘membership_plan’], [‘Gold’, ‘Platinum’, ‘Diamond’])) {</p><p>$_SESSION[‘errors’] = [“Please upgrade .”];</p><p>header(“Location: plans.php”);</p><p>exit;</p><p>}</p><p>// Extract data</p><p>$user_id = $data[‘user_id’];</p><p>$profile_id = $data[‘profile_id’];</p><p>// Clean up session data</p><p>unset($_SESSION[‘horoscope_data’][$_POST[‘token’]]);</p><p>// Your horoscope generation logic here</p><p>?&gt;</p><p>&lt;!DOCTYPE html&gt;</p><p>&lt;html lang=”en”&gt;</p><p>&lt;head&gt;</p><p>&lt;meta charset=”UTF-8&quot;&gt;</p><p>&lt;meta name=”viewport” content=”width=device-width, initial-scale=1.0&quot;&gt;</p><p>&lt;title&gt;Chart&lt;/title&gt;</p><p>&lt;/head&gt;</p><p>&lt;body&gt;</p><p>&lt;?php require_once ‘includes/header.php’; ?&gt;</p><p>&lt;div class=”container mx-auto p-4&quot;&gt;</p><p>&lt;h2 class=”text-2xl font-bold”&gt;Chart&lt;/h2&gt;</p><p>&lt;p&gt;Date of Birth: &lt;?php echo htmlspecialchars($dob); ?&gt;&lt;/p&gt;</p><p>&lt;! — Add chart rendering logic here →</p><p>&lt;/div&gt;</p><p>&lt;?php require_once ‘includes/footer.php’; ?&gt;</p><p>&lt;/body&gt;</p><p>&lt;/html&gt;</p><p><em>Originally published at </em><a href="https://whatandroidwhy.blogspot.com/2025/07/csrftoken-in-php-for-secure-post.html"><em>https://whatandroidwhy.blogspot.com</em></a><em>.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e8cce665b087" width="1" height="1" alt=""><hr><p><a href="https://medium.com/techzenith/csrf-token-in-php-for-secure-csrf-tokentransfer-e8cce665b087">csrf_token in PHP for Secure csrf_tokenTransfer</a> was originally published in <a href="https://medium.com/techzenith">TechZenith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Password Reset process in PHP]]></title>
            <link>https://medium.com/techzenith/password-reset-process-in-php-7ce6ebf19b6b?source=rss----7e9fdc97eccb---4</link>
            <guid isPermaLink="false">https://medium.com/p/7ce6ebf19b6b</guid>
            <category><![CDATA[php-development]]></category>
            <category><![CDATA[password-reset]]></category>
            <category><![CDATA[php-developers]]></category>
            <category><![CDATA[reset]]></category>
            <category><![CDATA[php]]></category>
            <dc:creator><![CDATA[www.jyotishgher.in]]></dc:creator>
            <pubDate>Fri, 25 Jul 2025 05:02:32 GMT</pubDate>
            <atom:updated>2025-07-25T05:02:05.089Z</atom:updated>
            <content:encoded><![CDATA[<p>To complete the password reset process, you’ll need a reset-password.php page to handle the token and allow the user to set a new password. Below is a sample implementation for reset-password.php:</p><figure><img alt="Password Reset process in PHP" src="https://cdn-images-1.medium.com/max/1024/1*K3ftw1AGYRxfl8FzMDB6dw.png" /><figcaption>Password Reset process in PHP</figcaption></figure><h3>pass_resets SQL</h3><blockquote>CREATE TABLE pass_resets(</blockquote><blockquote>id INT AUTO_INCREMENT PRIMARY KEY,</blockquote><blockquote>email VARCHAR(255) NOT NULL,</blockquote><blockquote>token VARCHAR(64) NOT NULL,</blockquote><blockquote>expires_at DATETIME NOT NULL,</blockquote><blockquote>created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,</blockquote><blockquote>INDEX idx_email (email),</blockquote><blockquote>INDEX idx_token (token)</blockquote><blockquote>) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;</blockquote><h3>reset-password.php:</h3><blockquote>&lt;?php</blockquote><blockquote>session_start();<br>$error = $success = null;</blockquote><blockquote>if ($_SERVER[‘REQUEST_METHOD’] === ‘POST’ &amp;&amp; verifyCSRFToken($_POST[‘csrf’])) {<br> $token = filter_var($_POST[‘token’], FILTER_SANITIZE_STRING);<br> $new_password = $_POST[‘new_password’];<br> $confirm_password = $_POST[‘confirm_password’];</blockquote><blockquote>if ($new_password !== $confirm_password) {<br> $error = “Passwords do not match.”;<br> } elseif (strlen($new_password) &lt; 8) {<br> $error = “Password must be at least 8 characters long.”;<br> } else {<br> $stmt = $conn-&gt;prepare(“SELECT email FROM pass_resets WHERE token = ? AND expires_at &gt; NOW()”);<br> $stmt-&gt;execute([$token]);<br> $reset = $stmt-&gt;fetch();</blockquote><blockquote>if ($reset) {<br> $email = $reset[‘email’];<br> $hashed_password = password_hash($new_password, PASSWORD_DEFAULT);</blockquote><blockquote>// Update user password<br> $updateStmt = $conn-&gt;prepare(“UPDATE users SET password = ? WHERE email = ?”);<br> $updateStmt-&gt;execute([$hashed_password, $email]);</blockquote><blockquote>// Delete used token<br> $deleteStmt = $conn-&gt;prepare(“DELETE FROM pass_resets WHERE token = ?”);<br> $deleteStmt-&gt;execute([$token]);</blockquote><blockquote>$success = “Password updated successfully. Please log in.”;<br> } else {<br> $error = “Invalid or expired reset link.”;<br> }<br> }<br>}</blockquote><blockquote>$token = isset($_GET[‘token’]) ? filter_var($_GET[‘token’], FILTER_SANITIZE_STRING) : ‘’;<br>?&gt;</blockquote><blockquote>&lt;!DOCTYPE html&gt;<br>&lt;html lang=”en”&gt;<br>&lt;head&gt;<br><br>&lt;/head&gt;<br>&lt;body&gt;<br> &lt;main class=”min-h-screen flex items-center justify-center px-4 py-8&quot;&gt;<br> &lt;div class=”card max-w-md w-full p-6&quot;&gt;<br> &lt;h2 class=”text-2xl sm:text-3xl font-semibold text-red-700 text-center mb-4&quot;&gt;Reset Password&lt;/h2&gt;<br> &lt;?php if (isset($error)): ?&gt;<br> &lt;div class=”alert-danger”&gt;&lt;?php echo htmlspecialchars($error); ?&gt;&lt;/div&gt;<br> &lt;?php endif; ?&gt;<br> &lt;?php if (isset($success)): ?&gt;<br> &lt;div class=”alert-success”&gt;&lt;?php echo htmlspecialchars($success); ?&gt;&lt;/div&gt;<br> &lt;?php endif; ?&gt;<br> &lt;form method=”POST” class=”space-y-4&quot;&gt;<br> &lt;input type=”hidden” name=”csrf_token” value=”&lt;?php echo htmlspecialchars(generateCSRFToken()); ?&gt;”&gt;<br> &lt;input type=”hidden” name=”token” value=”&lt;?php echo htmlspecialchars($token); ?&gt;”&gt;<br> &lt;div class=”mb-3&quot;&gt;<br> &lt;label for=”new_password” class=”block text-gray-600 font-medium mb-1&quot;&gt;New Password&lt;/label&gt;<br> &lt;input type=”password” id=”new_password” name=”new_password” class=”form-control” required placeholder=”Enter new password”&gt;<br> &lt;/div&gt;<br> &lt;div class=”mb-3&quot;&gt;<br> &lt;label for=”confirm_password” class=”block text-gray-600 font-medium mb-1&quot;&gt;Confirm Password&lt;/label&gt;<br> &lt;input type=”password” id=”confirm_password” name=”confirm_password” class=”form-control” required placeholder=”Confirm new password”&gt;<br> &lt;/div&gt;<br> &lt;button type=”submit” class=”btn-primary w-full”&gt;Reset Password&lt;/button&gt;<br> &lt;/form&gt;<br> &lt;p class=”text-gray-600 text-sm mt-4 text-center”&gt;<br> Back to &lt;a href=”/matrimonial/login.php” class=”text-red-700 hover:underline”&gt;Login&lt;/a&gt;<br> &lt;/p&gt;<br> &lt;/div&gt;<br> &lt;/main&gt;<br><br>&lt;/body&gt;<br>&lt;/html&gt;</blockquote><p>This solution avoids the issue of sending hashed passwords, provides a secure and user-friendly reset process, and maintains all existing functionality. If you need further assistance with reset-password.php or additional features (e.g., password strength validation), let me know!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7ce6ebf19b6b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/techzenith/password-reset-process-in-php-7ce6ebf19b6b">Password Reset process in PHP</a> was originally published in <a href="https://medium.com/techzenith">TechZenith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Constant expression required in Android]]></title>
            <link>https://medium.com/techzenith/constant-expression-required-in-android-3c36ead500fe?source=rss----7e9fdc97eccb---4</link>
            <guid isPermaLink="false">https://medium.com/p/3c36ead500fe</guid>
            <category><![CDATA[android-app-development]]></category>
            <category><![CDATA[switch-case-in-java]]></category>
            <category><![CDATA[if-else]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[constant]]></category>
            <dc:creator><![CDATA[www.jyotishgher.in]]></dc:creator>
            <pubDate>Tue, 22 Jul 2025 04:45:04 GMT</pubDate>
            <atom:updated>2025-07-22T04:44:53.761Z</atom:updated>
            <content:encoded><![CDATA[<p>You’re encountering the “constant expression required” error because parent.getId() is a runtime value, and switch case labels in Java must be compile-time constants.</p><figure><img alt="Constant expression required in Android" src="https://cdn-images-1.medium.com/max/1024/1*S0CY8fmPtroEH949ZJ1uyg.png" /><figcaption>Constant expression required in Android</figcaption></figure><p>The solution, as in previous instances, is to replace the switch statement with an if-else if ladder. This achieves the exact same logic but bypasses the compile-time restriction.</p><h3>Previous code was</h3><blockquote>parent.getItemAtPosition(position);</blockquote><blockquote>switch (parent.getId()) {</blockquote><blockquote>case R.id.spinner_comp_type:</blockquote><blockquote>sp1 = getCourse(position);</blockquote><blockquote>wing_name.clear();</blockquote><blockquote>getWing(sp1);</blockquote><blockquote>break;</blockquote><blockquote>case R.id.comp_type_list:</blockquote><blockquote>Nature_Name = getSUBNATURE_DESC(position);</blockquote><blockquote>Nature_Code = getSUBNATURE_CODE(position);</blockquote><blockquote>break;</blockquote><blockquote>case R.id.location_list:</blockquote><blockquote>COMP_LOCATION = comp_location[position];</blockquote><blockquote>COMP_LOCATION_SELECTED= comp_location[position];</blockquote><blockquote>if(COMP_LOCATION_SELECTED.equalsIgnoreCase(“A”))</blockquote><blockquote>{</blockquote><blockquote>COMP_LOCATION =”.”;</blockquote><blockquote>}</blockquote><blockquote>else if(COMP_LOCATION_SELECTED.equalsIgnoreCase(“B”))</blockquote><blockquote>{</blockquote><blockquote>COMP_LOCATION =”Store Room”;</blockquote><blockquote>}</blockquote><blockquote>else if(COMP_LOCATION_SELECTED.equalsIgnoreCase(“other”))</blockquote><blockquote>{</blockquote><blockquote>COMP_LOCATION =”others”;</blockquote><blockquote>}</blockquote><blockquote>break;</blockquote><blockquote>}</blockquote><h3>Updated Code</h3><p>// Assuming ‘parent’ is an AdapterView or similar, and ‘position’ is the selected item’s position.<br>parent.getItemAtPosition(position); // This line remains as is, likely for retrieving the selected item object.</p><p>int parentId = parent.getId(); // Get the ID once for comparison</p><p>if (parentId == R.id.spinner_comp_type) {<br>in original<br> sp1 = getCourse(position);<br> wing_name.clear();<br> getWing(sp1);<br>} else if (parentId == R.id.comp_type_list) {<br><br> Nature_Name = getSUBNATURE_DESC(position);<br> Nature_Code = getSUBNATURE_CODE(position);<br><br>} else if (parentId == R.id.location_list) {<br> // Logic for location_list<br> COMP_LOCATION = comp_location[position];<br> COMP_LOCATION_SELECTED = comp_location[position];</p><p>if (COMP_LOCATION_SELECTED.equalsIgnoreCase(“A”)) {<br> COMP_LOCATION = “Entry Room”; // Changed from “.” to “Entry Room”<br> } else if (COMP_LOCATION_SELECTED.equalsIgnoreCase(“B”)) {<br> COMP_LOCATION = “Store Room”;<br> } else if (COMP_LOCATION_SELECTED.equalsIgnoreCase(“अन्य”)) {<br> COMP_LOCATION = “others”;<br> }<br>}<br>// If there are other cases, you would add more ‘else if’ blocks here.</p><h3><strong>Key Changes and Explanation:</strong></h3><ol><li><strong>int parentId = parent.getId();</strong>: We first retrieve the ID into a local variable.</li><li><strong>if-else if Ladder</strong>: The switch statement is replaced with a series of if and else if conditions that compare parentId directly with the R.id constants. This is perfectly valid and resolves the &quot;constant expression required&quot; error.</li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3c36ead500fe" width="1" height="1" alt=""><hr><p><a href="https://medium.com/techzenith/constant-expression-required-in-android-3c36ead500fe">Constant expression required in Android</a> was originally published in <a href="https://medium.com/techzenith">TechZenith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Google’s official ZXing library]]></title>
            <link>https://medium.com/techzenith/googles-official-zxing-library-360bb1ed17d1?source=rss----7e9fdc97eccb---4</link>
            <guid isPermaLink="false">https://medium.com/p/360bb1ed17d1</guid>
            <category><![CDATA[qr-code-generator-app]]></category>
            <category><![CDATA[android-app-development]]></category>
            <category><![CDATA[zxing]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[qr-code]]></category>
            <dc:creator><![CDATA[www.jyotishgher.in]]></dc:creator>
            <pubDate>Sat, 19 Jul 2025 06:10:32 GMT</pubDate>
            <atom:updated>2025-07-19T06:10:20.672Z</atom:updated>
            <content:encoded><![CDATA[<p>If You’re encountering an issue just like me while updating to API 35 in android because the library androidmads.library.qrgenearator:QRGenearator:1.0.3 is <strong>obsolete and no longer compatible with Android API 35</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vlgFFTZPrwu89aaH-F0Qkw.png" /><figcaption>Google’s official ZXing library</figcaption></figure><h3>Recommended Alternative</h3><p>Replace the deprecated QRGEncoder and QRGContents with <strong>Google’s official ZXing library</strong>, which is actively maintained and works well with the latest Android APIs.</p><h3>Step 1: Add ZXing Dependency</h3><p>In your build.gradle:</p><pre>gradle</pre><pre>dependencies {<br>    implementation &#39;com.google.zxing:core:3.5.3&#39; // Latest as of 2025<br>    implementation &#39;com.journeyapps:zxing-android-embedded:4.3.0&#39; // Android wrapper<br>}</pre><h3>Step 2: Replace QRGEncoder with ZXing</h3><p>Update the QR code generation logic in your guestSuccess.java:</p><h4>Replace this:</h4><pre>java</pre><pre>qrgEncoder = new QRGEncoder(passno, null, QRGContents.Type.TEXT, dimen);<br>bitmap = qrgEncoder.encodeAsBitmap();<br>qrCodeIV.setImageBitmap(bitmap);</pre><h4>With this:</h4><pre>java</pre><pre>import com.journeyapps.barcodescanner.BarcodeEncoder;<br>import com.google.zxing.BarcodeFormat;<br>import com.google.zxing.WriterException;<br>import com.google.zxing.common.BitMatrix;<br>import com.journeyapps.barcodescanner.BarcodeEncoder;</pre><pre>try {<br>    BarcodeEncoder barcodeEncoder = new BarcodeEncoder();<br>    BitMatrix bitMatrix = new com.google.zxing.qrcode.QRCodeWriter().encode(<br>            passno, BarcodeFormat.QR_CODE, dimen, dimen);<br>    Bitmap bitmap = barcodeEncoder.createBitmap(bitMatrix);<br>    qrCodeIV.setImageBitmap(bitmap);<br>} catch (WriterException e) {<br>    e.printStackTrace();<br>}</pre><p>This replaces the obsolete QR generation and is <strong>fully compatible with Android API 34+ and 35</strong>.</p><h3>Cleanup</h3><p>You can remove these lines from your imports:</p><pre>java</pre><pre>import androidmads.library.qrgenearator.QRGContents;<br>import androidmads.library.qrgenearator.QRGEncoder;</pre><h3>That’s it!</h3><p>Now your QR code generation will work with Android API 35 and later using the <strong>Google ZXing library</strong>, while the <strong>rest of your code remains intact</strong>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=360bb1ed17d1" width="1" height="1" alt=""><hr><p><a href="https://medium.com/techzenith/googles-official-zxing-library-360bb1ed17d1">Google’s official ZXing library</a> was originally published in <a href="https://medium.com/techzenith">TechZenith</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>