<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Software Development Archives - Symatech Labs</title>
	<atom:link href="https://symatechlabs.com/category/software-development/feed/" rel="self" type="application/rss+xml" />
	<link>https://symatechlabs.com/category/software-development/</link>
	<description>We at Symatech Labs Limited believe Great Software solves Great Problems. Our services range from Desktop Software Development to Mobile Application Development. Over the years we have been able to develop software for reputable organisations and that has never changed.</description>
	<lastBuildDate>Wed, 21 May 2025 20:59:58 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://symatechlabs.com/wp-content/uploads/2023/07/cropped-logo_2401x1067-32x32.png</url>
	<title>Software Development Archives - Symatech Labs</title>
	<link>https://symatechlabs.com/category/software-development/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Integrate Your QuickBooks Online To KRA eTIMS</title>
		<link>https://symatechlabs.com/integrate-your-quickbooks-online-to-kra-etims/</link>
		
		<dc:creator><![CDATA[Symatech Labs]]></dc:creator>
		<pubDate>Wed, 21 May 2025 20:25:44 +0000</pubDate>
				<category><![CDATA[Integrations]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://symatechlabs.com/?p=71260</guid>

					<description><![CDATA[<p>Integrate QuickBooks Online To KRA eTIMS QuickBooks Online is a powerful, cloud-based accounting software built for small businesses, freelancers, and entrepreneurs to easily manage their finances. In light of the requirement by KRA for businesses to be compliant with eTIMS, below are the steps one can follow when integrating the QuickBooks Online account:     Step [&#8230;]</p>
<p>The post <a href="https://symatechlabs.com/integrate-your-quickbooks-online-to-kra-etims/">Integrate Your QuickBooks Online To KRA eTIMS</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="71260" class="elementor elementor-71260">
									<section class="elementor-section elementor-top-section elementor-element elementor-element-f94f3e8 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="f94f3e8" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-80f5a27" data-id="80f5a27" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-f636311 elementor-widget elementor-widget-text-editor" data-id="f636311" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.14.0 - 26-06-2023 */
.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}</style>				<h2>Integrate QuickBooks Online To KRA eTIMS</h2><p><strong><a href="https://quickbooks.intuit.com/global/oa/online-accounting-software-for-small-business/" target="_blank" rel="noopener">QuickBooks Online</a></strong> is a powerful, cloud-based accounting software built for small businesses, freelancers, and entrepreneurs to easily manage their finances. In light of the requirement by <strong><a href="https://www.kra.go.ke/" target="_blank" rel="noopener">KRA</a></strong> for businesses to be compliant with <strong><a href="https://etims.kra.go.ke/basic/login/indexLogin" target="_blank" rel="noopener">eTIMS</a></strong>, below are the steps one can follow when integrating the QuickBooks Online account:  </p><p> </p><h4><strong>Step One</strong></h4><ul><li>Navigate to the <strong><a href="https://developer.intuit.com/" target="_blank" rel="noopener">Intuit Developer</a></strong> Section.</li><li>Create an <strong><a href="https://developer.intuit.com/workspaces" target="_blank" rel="noopener">App</a>.</strong></li><li>Set up a valid redirect URI in your App <strong>settings</strong>.</li></ul><div> </div><p>We&#8217;ve published a <strong><a href="https://github.com/symatechlabs/QuickBooks-KRA-Agent-Connect" target="_blank" rel="noopener">GitHub</a></strong> repository that includes method definitions for obtaining the <strong>Authorization Code</strong> after your App has been set up. The <em><strong>getAuthCode </strong></em>function will return a URL which you can open using your browser</p>						</div>
				</div>
				<div class="elementor-element elementor-element-e814433 elementor-widget elementor-widget-code-block-for-elementor" data-id="e814433" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='no'><code class='language-javascript'>    def getAuthCode(self):
        params = {
            &quot;client_id&quot; : CLIENT_ID,
            &quot;redirect_uri&quot; : REDIRECT_URI,
            &quot;response_type&quot; : &quot;code&quot;,
            &quot;scope&quot; : &quot;com.intuit.quickbooks.accounting&quot;,
            &quot;state&quot; : &quot;15874&quot;
        }
        return &quot;https://appcenter.intuit.com/connect/oauth2?&quot; + urllib.parse.urlencode(params)
        
        #The method will return a URL i.e http://localhost/quickbooks/?code={Authorization Code}&amp;state={State}&amp;realmId={CompanyID}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-a851c5b elementor-widget elementor-widget-image" data-id="a851c5b" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.14.0 - 26-06-2023 */
.elementor-widget-image{text-align:center}.elementor-widget-image a{display:inline-block}.elementor-widget-image a img[src$=".svg"]{width:48px}.elementor-widget-image img{vertical-align:middle;display:inline-block}</style>												<img fetchpriority="high" decoding="async" width="852" height="671" src="https://symatechlabs.com/wp-content/uploads/2025/05/Screenshot-from-2025-05-21-20-42-45.png" class="attachment-large size-large wp-image-71261" alt="QuickBooks Online Authorization Screen" />															</div>
				</div>
				<div class="elementor-element elementor-element-90ab0d1 elementor-widget elementor-widget-text-editor" data-id="90ab0d1" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>Select the <strong>Connect</strong> option, this action will result in the browser redirecting to the redirect link you had set.</p><h4><strong>Step Two</strong></h4><div><p>We would need to exchange the <strong>Authorization Code</strong> for the <strong>Access Token</strong>.</p></div>						</div>
				</div>
				<div class="elementor-element elementor-element-6ab59e2 elementor-widget elementor-widget-code-block-for-elementor" data-id="6ab59e2" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='no'><code class='language-javascript'>    def getTokens(self):
        token_url = OAUTH_URL+&quot;/oauth2/v1/tokens/bearer&quot;
        auth = base64.b64encode(f&quot;{CLIENT_ID}:{CLIENT_SECRET}&quot;.encode()).decode()

        headers = {
            &quot;Authorization&quot;: f&quot;Basic {auth}&quot;,
            &quot;Content-Type&quot;: CONTENT_TYPE_FORM_URL_ENCODED
        }

        data = {
            &quot;grant_type&quot;: &quot;authorization_code&quot;,
            &quot;code&quot;: AUTHORIZATION_CODE,
            &quot;redirect_uri&quot;: REDIRECT_URI
        }

        response = requests.post(token_url, headers=headers, data=data)
        return response.json()</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-a04a4ab elementor-widget elementor-widget-text-editor" data-id="a04a4ab" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4> </h4><h4><strong>Step Three</strong></h4><p>With the <strong>Access Token</strong>, we can then proceed to getting the sales transactions.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-832cd8c elementor-widget elementor-widget-code-block-for-elementor" data-id="832cd8c" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>    def getSalesReceipts(self, accessToken, companyID, maxResults):
        url = f&quot;{SANDBOX_URL}company/{companyID}/query&quot;
        headers = {
            &quot;Authorization&quot;: f&quot;Bearer {accessToken}&quot;,
            &quot;Accept&quot;: &quot;application/json&quot;,
            &quot;Content-Type&quot;: CONTENT_TYPE_TEXT
        }

        query = &quot;SELECT * FROM SalesReceipt ORDERBY TxnDate DESC MAXRESULTS &quot;+maxResults
        response = requests.get(url, headers=headers, params={&quot;query&quot;: query})
        return response.json()</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-28e0d96 elementor-widget elementor-widget-text-editor" data-id="28e0d96" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4> </h4><h4><strong>Step Four</strong></h4><p>The result of <em><strong>Step Three</strong></em> above can then be submitted to our KRA Agent App which would then handle the submission to <strong><a href="https://etims.kra.go.ke/basic/login/indexLogin" target="_blank" rel="noopener">KRA eTIMS.</a></strong></p>						</div>
				</div>
					</div>
		</div>
							</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-6d1399a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="6d1399a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3b66269" data-id="3b66269" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-d3d295a elementor-widget elementor-widget-text-editor" data-id="d3d295a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4> </h4><h4><strong>Github</strong></h4><p>Find the full codebase on <a href="https://github.com/symatechlabs/QuickBooks-KRA-Agent-Connect" target="_blank" rel="noopener">Github</a></p><p> </p><p><em><a href="https://bit.ly/3YsPhmL" target="_blank" rel="noopener">Symatech Labs</a> is a Software Development company based in Nairobi, Kenya that specializes in Software Development, Mobile App Development, Web Application Development, Integrations, USSD and Consultancy.</em></p>						</div>
				</div>
					</div>
		</div>
							</div>
		</section>
							</div>
		<p>The post <a href="https://symatechlabs.com/integrate-your-quickbooks-online-to-kra-etims/">Integrate Your QuickBooks Online To KRA eTIMS</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Integrate KRA eTIMS API With Your Point Of Sale Or System</title>
		<link>https://symatechlabs.com/how-to-integrate-kra-etims-api-with-your-point-of-sale-or-system/</link>
		
		<dc:creator><![CDATA[Symatech Labs]]></dc:creator>
		<pubDate>Thu, 08 May 2025 18:35:43 +0000</pubDate>
				<category><![CDATA[Integrations]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://symatechlabs.com/?p=71179</guid>

					<description><![CDATA[<p>  How To Integrate KRA eTIMS API With Your Point Of Sale Or System eTIMS is a software solution by KRA that offers taxpayers a simple, convenient, and flexible way to manage electronic invoicing. It is accessible across a range of computing devices, ensuring ease of use and broad compatibility. Businesses can now generate and [&#8230;]</p>
<p>The post <a href="https://symatechlabs.com/how-to-integrate-kra-etims-api-with-your-point-of-sale-or-system/">How to Integrate KRA eTIMS API With Your Point Of Sale Or System</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="71179" class="elementor elementor-71179">
									<section class="elementor-section elementor-top-section elementor-element elementor-element-9502b8a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="9502b8a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3839508" data-id="3839508" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-7bcf81a elementor-widget elementor-widget-text-editor" data-id="7bcf81a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2> </h2><h2><span data-preserver-spaces="true">How To Integrate KRA eTIMS API </span><span data-preserver-spaces="true">With</span><span data-preserver-spaces="true"> Your Point </span><span data-preserver-spaces="true">Of</span><span data-preserver-spaces="true"> Sale </span><span data-preserver-spaces="true">Or</span><span data-preserver-spaces="true"> System</span></h2><p><strong><a class="editor-rtfLink" href="https://etims.kra.go.ke/basic/login/indexLogin" target="_blank" rel="noopener"><span data-preserver-spaces="true">eTIMS</span></a></strong><span data-preserver-spaces="true"> is a software solution by </span><strong><a class="editor-rtfLink" href="https://www.kra.go.ke/" target="_blank" rel="noopener"><span data-preserver-spaces="true">KRA</span></a></strong><span data-preserver-spaces="true"> that offers taxpayers a simple, convenient, and flexible way to manage electronic invoicing. It is accessible across </span><span data-preserver-spaces="true">a range of</span><span data-preserver-spaces="true"> computing devices, ensuring ease of use and broad compatibility. Businesses can now generate and submit invoices using the following options:</span></p><p> </p><ul><li><span data-preserver-spaces="true">Online Portal – a web-based platform for invoicing accessible via </span><a class="editor-rtfLink" href="https://etims.kra.go.ke/basic/login/indexLogin" target="_blank" rel="noopener"><span data-preserver-spaces="true">etims.kra.go.ke</span></a></li><li><span data-preserver-spaces="true">eTIMS Client – a downloadable software that supports multiple branches and cashier tills/pay points. The software can be configured for both Windows and </span><span data-preserver-spaces="true">android</span><span data-preserver-spaces="true"> devices, </span><span data-preserver-spaces="true">i.e.</span> <span data-preserver-spaces="true">Windows based</span><span data-preserver-spaces="true"> computers &amp; laptops, </span><span data-preserver-spaces="true">android</span> <span data-preserver-spaces="true">smart phones</span><span data-preserver-spaces="true">, tablets &amp; Personal Digital Assistant (PDA) </span><span data-preserver-spaces="true">devices</span></li><li><span data-preserver-spaces="true">eTIMS Lite (Web) – a web-based solution accessible through eCitizen.</span></li><li><span data-preserver-spaces="true">eTIMS Lite (USSD) – accessed through the short code </span><strong><em><span data-preserver-spaces="true">*222#</span></em></strong><span data-preserver-spaces="true">. This solution is for individuals and sole proprietors.</span></li><li><span data-preserver-spaces="true">eTIMS Lite (Mobile app) – accessible on </span><span data-preserver-spaces="true">Play</span><span data-preserver-spaces="true"> Store and </span><span data-preserver-spaces="true">Apple</span><span data-preserver-spaces="true"> Store.</span></li><li><span data-preserver-spaces="true">eTIMS System to System Integration – This solution is tailored for businesses with an invoicing system and would like to integrate with eTIMS </span><span data-preserver-spaces="true">i.e.</span><span data-preserver-spaces="true">, Virtual Sales Control Unit (VSCU) and Online Sales Control Unit (OSCU).</span></li><li><span data-preserver-spaces="true">Reverse Invoicing and Buyer Initiated Solution – both solutions enable the buyer to generate a tax invoice on behalf of a seller.</span></li></ul><p> </p><p><span data-preserver-spaces="true">In this case, we will focus on the </span><strong><span data-preserver-spaces="true">OSCU</span></strong><em><span data-preserver-spaces="true">(Online Sales Control Unit) </span></em><span data-preserver-spaces="true">and </span><strong><span data-preserver-spaces="true">VSCU</span></strong><em><span data-preserver-spaces="true">(Virtual Sales Control Unit)</span></em><span data-preserver-spaces="true"> and how businesses can integrate their point of sale or system. </span><strong><a class="editor-rtfLink" href="https://www.kra.go.ke/" target="_blank" rel="noopener"><span data-preserver-spaces="true">KRA</span></a></strong><span data-preserver-spaces="true"> advises </span><span data-preserver-spaces="true">businesses</span><span data-preserver-spaces="true"> that have a lot of transactions to consider using </span><strong><span data-preserver-spaces="true">OSCU</span></strong><span data-preserver-spaces="true"> or the </span><strong><span data-preserver-spaces="true">VSCU. </span></strong></p><p><strong><span data-preserver-spaces="true">OSCU</span></strong><span data-preserver-spaces="true"> is preferred for businesses that primarily have their operations done in an online setting, while </span><strong><span data-preserver-spaces="true">VSCU</span></strong><span data-preserver-spaces="true"> is good for </span><span data-preserver-spaces="true">businesses</span><span data-preserver-spaces="true"> that are not always online.</span></p><p> </p>						</div>
				</div>
				<div class="elementor-element elementor-element-3b214f7 elementor-arrows-position-outside elementor-pagination-position-outside elementor-widget elementor-widget-image-carousel" data-id="3b214f7" data-element_type="widget" data-settings="{&quot;navigation&quot;:&quot;both&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;infinite&quot;:&quot;yes&quot;,&quot;speed&quot;:500}" data-widget_type="image-carousel.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.14.0 - 26-06-2023 */
.elementor-widget-image-carousel .swiper,.elementor-widget-image-carousel .swiper-container{position:static}.elementor-widget-image-carousel .swiper-container .swiper-slide figure,.elementor-widget-image-carousel .swiper .swiper-slide figure{line-height:inherit}.elementor-widget-image-carousel .swiper-slide{text-align:center}.elementor-image-carousel-wrapper:not(.swiper-container-initialized):not(.swiper-initialized) .swiper-slide{max-width:calc(100% / var(--e-image-carousel-slides-to-show, 3))}</style>		<div class="elementor-image-carousel-wrapper swiper-container" dir="ltr">
			<div class="elementor-image-carousel swiper-wrapper" aria-live="off">
								<div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="1 of 3"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://symatechlabs.com/wp-content/uploads/2025/05/Screenshot-from-2025-05-10-13-52-53.png" alt="KRA eTIMS Login" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="2 of 3"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://symatechlabs.com/wp-content/uploads/2025/05/Screenshot-from-2025-05-10-13-57-49.png" alt="KRA eTIMS Sign Up" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="3 of 3"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://symatechlabs.com/wp-content/uploads/2025/05/Screenshot-from-2025-05-10-13-58-57.png" alt="KRA eTIMS Service Request" /></figure></div>			</div>
												<div class="elementor-swiper-button elementor-swiper-button-prev" role="button" tabindex="0">
						<i aria-hidden="true" class="eicon-chevron-left"></i>					</div>
					<div class="elementor-swiper-button elementor-swiper-button-next" role="button" tabindex="0">
						<i aria-hidden="true" class="eicon-chevron-right"></i>					</div>
				
									<div class="swiper-pagination"></div>
									</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-eb0358e elementor-widget elementor-widget-text-editor" data-id="eb0358e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h3><span data-preserver-spaces="true">Registering for OSCU and VSCU</span></h3><p> </p><p><span data-preserver-spaces="true">The two implementations<em>(OSCU and VSCU)</em> follow a similar signup process:</span></p><p> </p><ol><li><span data-preserver-spaces="true">Visit the </span><strong><a class="editor-rtfLink" href="https://etims.kra.go.ke/basic/login/indexLogin" target="_blank" rel="noopener"><span data-preserver-spaces="true">eTIMS</span></a></strong><span data-preserver-spaces="true"> portal.</span></li><li><span data-preserver-spaces="true">Select the Sign Up option.</span></li><li><span data-preserver-spaces="true">Enter the </span><span data-preserver-spaces="true">PIN number</span><span data-preserver-spaces="true"> of your business and click the verify button. This will auto-populate the other input fields with the details of your business.</span></li><li><span data-preserver-spaces="true">The Send OTP button, when clicked, would send a one-time password to the registered phone number. There are cases where you might want to change the phone number, you can do this by going to </span><strong><a class="editor-rtfLink" href="https://itax.kra.go.ke/KRA-Portal/" target="_blank" rel="noopener"><span data-preserver-spaces="true">iTax</span></a></strong><span data-preserver-spaces="true"> and updating it there. Consider contacting </span><strong><a class="editor-rtfLink" href="mailto:timsupport@kra.go.ke" target="_blank" rel="noopener"><span data-preserver-spaces="true">timsupport@kra.go.ke</span></a><span data-preserver-spaces="true"> </span></strong><span data-preserver-spaces="true">for any incidental technical issue.</span></li><li><span data-preserver-spaces="true">Once you have been able to </span><span data-preserver-spaces="true">Sign Up</span><span data-preserver-spaces="true">, you will </span><span data-preserver-spaces="true">then</span><span data-preserver-spaces="true"> log in and choose the type of eTIMS solution you would want(OSCU or VSCU).</span> <span data-preserver-spaces="true">This will be done by selecting the </span><strong><span data-preserver-spaces="true">Service Request</span></strong><span data-preserver-spaces="true"> tab</span><span data-preserver-spaces="true">, </span><span data-preserver-spaces="true">then </span><strong><span data-preserver-spaces="true">eTIMS.</span></strong></li><li><span data-preserver-spaces="true">You will be required to submit details of the directors and confirm the same using the personal </span><strong><span data-preserver-spaces="true">PIN</span></strong> <span data-preserver-spaces="true">of the directors</span><span data-preserver-spaces="true">, together with their corresponding mobile phone numbers.</span><span data-preserver-spaces="true"> An </span><strong><span data-preserver-spaces="true">OTP</span></strong><span data-preserver-spaces="true"> will be sent to the directors to confirm this action.</span></li><li><span data-preserver-spaces="true">In the Service Information section, you will be presented with the </span><strong><span data-preserver-spaces="true">eTIMS</span></strong><span data-preserver-spaces="true"> type options: </span><strong><em><span data-preserver-spaces="true">eTIMS Client, Online, VSCU </span><span data-preserver-spaces="true">and</span><span data-preserver-spaces="true"> OSCU</span></em></strong><span data-preserver-spaces="true">. Select the preferred option and proceed.</span></li></ol><h3><span data-preserver-spaces="true"> </span></h3><h3><span data-preserver-spaces="true">Integrating Into Your System</span></h3><p><span data-preserver-spaces="true">Depending on the eTIMS type selected above, we can then </span><span data-preserver-spaces="true">proceed to</span><span data-preserver-spaces="true"> integrate your point of sale or system to KRA. </span><strong><span data-preserver-spaces="true">Symatech Labs&#8217;s</span></strong><span data-preserver-spaces="true"> implementation covers all the options </span><span data-preserver-spaces="true">above.</span></p><p><span data-preserver-spaces="true">Recently the government placed a <strong><a href="https://kenyanwallstreet.com/taxman-rolls-out-etims-for-fuel-stations-kra-sets-june-30-compliance-deadline/" target="_blank" rel="noopener">notice</a></strong> on all petrol stations to integrate eTIMS by <em><strong>June 30th 2025</strong></em> as part of their compliance requirement. </span></p>						</div>
				</div>
				<div class="elementor-element elementor-element-52f0be0 elementor-widget elementor-widget-text-editor" data-id="52f0be0" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4> </h4><p><em><a href="https://symatechlabs.com/contact-us/" rel="noreferrer noopener">Symatech L</a><a href="https://symatechlabs.com/" target="_blank" rel="noreferrer noopener">abs</a> is a Software Development company based in Nairobi, Kenya that specializes in Software Development, Mobile App Development, Web Application Development, Integrations, USSD and Consultancy.</em></p>						</div>
				</div>
					</div>
		</div>
							</div>
		</section>
							</div>
		<p>The post <a href="https://symatechlabs.com/how-to-integrate-kra-etims-api-with-your-point-of-sale-or-system/">How to Integrate KRA eTIMS API With Your Point Of Sale Or System</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How To Get Details Of Your Android Device Using Kotlin</title>
		<link>https://symatechlabs.com/how-to-get-details-of-your-android-device-using-kotlin/</link>
		
		<dc:creator><![CDATA[Symatech Labs]]></dc:creator>
		<pubDate>Sun, 10 Nov 2024 14:44:13 +0000</pubDate>
				<category><![CDATA[Mobile Apps]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://symatechlabs.com/?p=70780</guid>

					<description><![CDATA[<p>How to Get details of your Android device using kotlin The Android SDK allows application developers to retrieve information i.e brand of the phone, device name among other details. Below is an example of how this can be done. Build Class import android.os.Build This class provides a number of static fields and methods which return [&#8230;]</p>
<p>The post <a href="https://symatechlabs.com/how-to-get-details-of-your-android-device-using-kotlin/">How To Get Details Of Your Android Device Using Kotlin</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="70780" class="elementor elementor-70780">
									<section class="elementor-section elementor-top-section elementor-element elementor-element-736b005 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="736b005" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-aa3731c" data-id="aa3731c" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-11a1879 elementor-widget elementor-widget-text-editor" data-id="11a1879" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2>How to Get details of your Android device using kotlin </h2><p>The Android <a href="https://symatechlabs.com/sdk-and-apis-what-is-the-difference/">SDK</a> allows application developers to retrieve information i.e device model, device name among other details.</p><h4> </h4><h4><strong>Build Class</strong></h4><div><pre>import android.os.Build</pre></div><p>This class provides a number of static fields and methods which return details of the device. Some of the fields include:</p><ul><li><strong>Build.MODEL</strong>: <em>Returns the name of the device.</em></li><li><strong>Build.VERSION.RELEASE</strong>: <em>Returns the current version of the Android operating system</em></li><li><strong>Build.MANUFACTURER</strong>: <em>Returns the name of the manufacturer</em></li><li><strong>Build.DISPLAY</strong>: <em>Returns information about the software version and build type installed on the device.</em></li><li><strong>Build.FINGERPRINT</strong>: <em>Returns a concatenated string containing information about the manufacturer, device model, Android version, and build details.</em></li></ul><div><i> </i></div><div><h4><strong>Android Permissions</strong></h4><p>It is also possible to get the Wi-Fi/Cellular strength when connected to a network. This would require requesting permissions from the user. </p></div>						</div>
				</div>
				<div class="elementor-element elementor-element-09dab27 elementor-widget elementor-widget-code-block-for-elementor" data-id="09dab27" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='no'><code class='language-javascript'>&lt;uses-permission android:name=&quot;android.permission.ACCESS_FINE_LOCATION&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.READ_PHONE_STATE&quot; /&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_WIFI_STATE&quot;/&gt;
&lt;uses-permission android:name=&quot;android.permission.ACCESS_FINE_LOCATION&quot;/&gt;


/* Android requires runtime permission requests starting from Android 6.0 or API level 23 */

   fun requestPermissions(fragment: Fragment) {

        val requestMultiplePermissionLauncher =
            fragment.registerForActivityResult(
                ActivityResultContracts.RequestMultiplePermissions()
            ) { result -&gt;
                for (r in result) {
                    Log.d(Constants.LOG_TAG, r.key + &quot; : &quot; + r.value.toString())
                }

            }
        requestMultiplePermissionLauncher.launch(
            arrayOf(
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.LOCATION_HARDWARE,
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.MODIFY_PHONE_STATE,
                Manifest.permission.ACCESS_NOTIFICATION_POLICY,
                Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE,
                Manifest.permission.ACCESS_WIFI_STATE,
                Manifest.permission.CHANGE_NETWORK_STATE
            )
        )
    }
</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-b1b58a6 elementor-widget elementor-widget-text-editor" data-id="b1b58a6" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4> </h4><h4><strong>Code</strong></h4><div><p>For simplicity, we have organised the repository in a manner that eliminates most of the boilerplate code. </p></div>						</div>
				</div>
				<div class="elementor-element elementor-element-6de942c elementor-widget elementor-widget-code-block-for-elementor" data-id="6de942c" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='no'><code class='language-javascript'>interface DeviceInfoInterface {

    fun getBatteryStatus(): String;
    fun getBatteryPercentage(): String
    fun getBatteryPercentage_(): Int
    fun getTotalStorage(): String;
    fun getFreeStorage(): String;
    fun getStoragePercentage(): Double;
    fun getTotalMemoryUsage(): String;
    fun getFreeMemoryUsage(): String;
    fun getMemoryPercentage(): Double;
    fun getNetworkInfo(): String;
    fun getAppVersion(): String;
    fun getDataSyncStatus(): String;
    fun getDeviceHealth(): String;
    fun getUserActivity(): String;
    fun getDeviceIdentity(): String;
    fun getWifiSignalStrength(): String
    fun getCellularSignalStrength(callback: (String) -&gt; Unit);
    fun getNetworkType(): String;
    fun getUptime(): String;
    fun startNetworkCallback(onNetworkChange: (String) -&gt; Unit);
    fun stopNetworkCallback();
    fun deviceDetails(deviceDetailsBinding: DeviceDetailsBinding);
    fun getDeviceId(): String

}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-f29d4fd elementor-widget elementor-widget-text-editor" data-id="f29d4fd" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4> </h4><h4><strong>Screens</strong></h4><p> </p>						</div>
				</div>
					</div>
		</div>
							</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-c51b3fc elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="c51b3fc" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b33753e" data-id="b33753e" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-2256a63 elementor-arrows-position-inside elementor-pagination-position-outside elementor-widget elementor-widget-image-carousel" data-id="2256a63" data-element_type="widget" data-settings="{&quot;navigation&quot;:&quot;both&quot;,&quot;autoplay&quot;:&quot;yes&quot;,&quot;pause_on_hover&quot;:&quot;yes&quot;,&quot;pause_on_interaction&quot;:&quot;yes&quot;,&quot;autoplay_speed&quot;:5000,&quot;infinite&quot;:&quot;yes&quot;,&quot;speed&quot;:500}" data-widget_type="image-carousel.default">
				<div class="elementor-widget-container">
					<div class="elementor-image-carousel-wrapper swiper-container" dir="ltr">
			<div class="elementor-image-carousel swiper-wrapper" aria-live="off">
								<div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="1 of 4"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://symatechlabs.com/wp-content/uploads/2024/11/1.png" alt="1" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="2 of 4"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://symatechlabs.com/wp-content/uploads/2024/11/2.png" alt="2" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="3 of 4"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://symatechlabs.com/wp-content/uploads/2024/11/3.png" alt="3" /></figure></div><div class="swiper-slide" role="group" aria-roledescription="slide" aria-label="4 of 4"><figure class="swiper-slide-inner"><img decoding="async" class="swiper-slide-image" src="https://symatechlabs.com/wp-content/uploads/2024/11/4.png" alt="4" /></figure></div>			</div>
												<div class="elementor-swiper-button elementor-swiper-button-prev" role="button" tabindex="0">
						<i aria-hidden="true" class="eicon-chevron-left"></i>					</div>
					<div class="elementor-swiper-button elementor-swiper-button-next" role="button" tabindex="0">
						<i aria-hidden="true" class="eicon-chevron-right"></i>					</div>
				
									<div class="swiper-pagination"></div>
									</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-1ed2218 elementor-widget elementor-widget-text-editor" data-id="1ed2218" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4> </h4><h4><strong>Github</strong></h4><p>Find the full codebase on <a href="https://github.com/brianosoro/DeviceDetails" target="_blank" rel="noopener">Github</a></p><p> </p><p><em><a href="https://bit.ly/3YsPhmL" target="_blank" rel="noopener">Symatech Labs</a> is a Software Development company based in Nairobi, Kenya that specializes in Software Development, Mobile App Development, Web Application Development, Integrations, USSD and Consultancy.</em></p>						</div>
				</div>
					</div>
		</div>
							</div>
		</section>
							</div>
		<p>The post <a href="https://symatechlabs.com/how-to-get-details-of-your-android-device-using-kotlin/">How To Get Details Of Your Android Device Using Kotlin</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Create An Android Mobile App Using Kotlin That Consumes An API From A Drupal Instance</title>
		<link>https://symatechlabs.com/create-an-android-mobile-app-using-kotlin-that-consumes-an-api-from-a-drupal-instance/</link>
		
		<dc:creator><![CDATA[Symatech Labs]]></dc:creator>
		<pubDate>Thu, 01 Aug 2024 18:29:04 +0000</pubDate>
				<category><![CDATA[Mobile Apps]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://symatechlabs.com/?p=70746</guid>

					<description><![CDATA[<p>Create An Android Mobile App Using Kotlin That Consumes An API From A Drupal Instance Drupal is a popular content management system(CMS) written using PHP and is used to build websites and web applications. Popular websites that use Drupal include: Nokia, Prime Minister Of Australia and Tesla. Below are the steps one can use to extend Drupal to the Android [&#8230;]</p>
<p>The post <a href="https://symatechlabs.com/create-an-android-mobile-app-using-kotlin-that-consumes-an-api-from-a-drupal-instance/">Create An Android Mobile App Using Kotlin That Consumes An API From A Drupal Instance</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="70746" class="elementor elementor-70746">
									<section class="elementor-section elementor-top-section elementor-element elementor-element-574623a elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="574623a" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5a38970" data-id="5a38970" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-e8098bc elementor-widget elementor-widget-text-editor" data-id="e8098bc" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2>Create An Android Mobile App Using Kotlin That Consumes An API From A Drupal Instance</h2><p> </p><p><a href="https://www.drupal.org/">Drupal</a> is a content management system<em>(CMS)</em> written using <a href="https://www.php.net/" target="_blank" rel="noopener">PHP</a> and is used to build websites and web applications. Popular websites that use Drupal include: <a href="https://www.nokia.com/" target="_blank" rel="noopener">Nokia</a>, <a href="https://www.pm.gov.au/" target="_blank" rel="noopener">Prime Minister Of Australia</a> and <a href="https://www.tesla.com/" target="_blank" rel="noopener">Tesla</a>. Below are the steps one can use to extend Drupal to the Android client. The assumption is that the Drupal instance has been installed and is running.  </p><p> </p><h4><strong> </strong><strong>Drupal</strong></h4><ol><li>Install and enable the <a style="font-size: 1.125em; letter-spacing: 0.16px;" href="https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module" target="_blank" rel="noopener">JSON:API</a> module on the Drupal instance</li><li>Run the endpoints using Postman to simulate how the requests will be made by the Android client. </li></ol><p> </p><p><strong>Drupal URL structure</strong></p><p>In the <a href="https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module" target="_blank" rel="noopener">JSON:API</a>, each resource has a globally unique type property. For example:</p><ul><li>node&#8211;article  <em><strong>for articles</strong></em></li><li>user&#8211;user <em><strong>for users</strong></em></li><li>node&#8211;pages <em><strong>for pages</strong></em></li></ul><p> </p><p>When running the Postman requests, represent the URL as follows. Replace the BASE_URL with your domain or IP Address.</p><ul><li>https://BASE_URL/jsonapi/node/article    <em>get articles</em></li><li>https://BASE_URL/jsonapi/node/page     <em>get pages</em></li></ul><div><i> </i></div>						</div>
				</div>
				<div class="elementor-element elementor-element-43b5ec4 elementor-widget elementor-widget-image" data-id="43b5ec4" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img decoding="async" width="1024" height="614" src="https://symatechlabs.com/wp-content/uploads/2024/08/Screenshot-from-2024-08-01-20-39-54.png" class="attachment-large size-large wp-image-70751" alt="" />															</div>
				</div>
				<div class="elementor-element elementor-element-4d6e779 elementor-widget elementor-widget-image" data-id="4d6e779" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img decoding="async" width="1024" height="614" src="https://symatechlabs.com/wp-content/uploads/2024/08/Screenshot-from-2024-08-01-20-41-03-1.png" class="attachment-large size-large wp-image-70750" alt="" />															</div>
				</div>
				<div class="elementor-element elementor-element-0192030 elementor-widget elementor-widget-text-editor" data-id="0192030" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4> </h4><h4><strong>Kotlin Android Client</strong></h4><p>The <a href="https://bit.ly/3LQVr8s" target="_blank" rel="noopener">Android App</a> makes HTTP requests to the Drupal instance. Below are the steps used when building the App.</p><p>1. Open Android Studio and create a project</p><p>2. Add the necessary dependencies </p>						</div>
				</div>
					</div>
		</div>
							</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-eaf4088 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="eaf4088" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-452f28b" data-id="452f28b" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-3110ddd elementor-widget elementor-widget-code-block-for-elementor" data-id="3110ddd" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>dependencies {

    implementation(&quot;androidx.core:core-ktx:1.13.1&quot;)
    implementation(&quot;androidx.appcompat:appcompat:1.7.0&quot;)
    implementation(&quot;com.google.android.material:material:1.12.0&quot;)
    implementation(&quot;androidx.swiperefreshlayout:swiperefreshlayout:1.1.0&quot;)
    implementation(&quot;androidx.room:room-common:2.6.1&quot;)
    testImplementation(&quot;junit:junit:4.13.2&quot;)
    androidTestImplementation(&quot;androidx.test.ext:junit:1.2.1&quot;)
    androidTestImplementation(&quot;androidx.test.espresso:espresso-core:3.6.1&quot;)
    implementation(&quot;androidx.hilt:hilt-work:1.2.0&quot;)
    implementation(&quot;androidx.work:work-runtime-ktx:2.9.0&quot;)
    kapt(&quot;androidx.hilt:hilt-compiler:1.2.0&quot;)
    implementation(&quot;com.google.dagger:hilt-android:$hilt&quot;)
    kapt(&quot;com.google.dagger:hilt-compiler:$hilt&quot;)
    implementation(&quot;androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.3&quot;)
    implementation(&quot;com.squareup.retrofit2:retrofit:$retrofit&quot;)
    implementation(&quot;com.squareup.retrofit2:converter-moshi:2.9.0&quot;)
    implementation (&quot;com.squareup.okhttp3:okhttp:4.9.3&quot;)
    implementation(&quot;de.hdodenhof:circleimageview:3.1.0&quot;)
    implementation(&quot;androidx.activity:activity-ktx:1.9.0&quot;)
}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-415d54a elementor-widget elementor-widget-text-editor" data-id="415d54a" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>3. Add the Data Classes corresponding to the JSON structure of your Drupal API responses.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-833bee4 elementor-widget elementor-widget-code-block-for-elementor" data-id="833bee4" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>data class ArticleResponse(
    @field:Json(name = &quot;data&quot;) val data: List&lt;Data&gt; = listOf()
)

data class Data(
    @field:Json(name = &quot;id&quot;) val id: String? = &quot;&quot;,
    @field:Json(name = &quot;attributes&quot;) val attributes: Attributes = Attributes()
)

data class Attributes(
    @field:Json(name = &quot;title&quot;) val title: String? = &quot;&quot;,
    @field:Json(name = &quot;created&quot;) val created: String? = &quot;&quot;,
    @field:Json(name = &quot;path&quot;) val path: Path = Path(),
    @field:Json(name = &quot;body&quot;) val body: Body = Body()
)

data class Path(
    @field:Json(name = &quot;alias&quot;) val alias: String? = &quot;&quot;,
    @field:Json(name = &quot;pid&quot;) val pid: Int? = 0
)

data class Body(
    @field:Json(name = &quot;value&quot;) val value: String? = &quot;&quot;
)</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-366c995 elementor-widget elementor-widget-text-editor" data-id="366c995" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>4. In this case, we made use of the <a href="https://square.github.io/retrofit/">Retrofit</a> library to make HTTP requests to the JSON API.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-7845a04 elementor-widget elementor-widget-code-block-for-elementor" data-id="7845a04" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>    @Singleton
    @Provides
    fun provideRetrofit(): Retrofit{
        val okHttpClient = OkHttpClient().newBuilder()
            .connectTimeout(60, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS)
            .build()
        return Retrofit.Builder()
            .baseUrl(Common.BASE_URL)
            .addConverterFactory(MoshiConverterFactory.create())
            .client(okHttpClient)
            .build();
    }</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-bc7c133 elementor-widget elementor-widget-text-editor" data-id="bc7c133" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>5. Set the API endpoints</p>						</div>
				</div>
				<div class="elementor-element elementor-element-4d88ae1 elementor-widget elementor-widget-code-block-for-elementor" data-id="4d88ae1" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>interface ArticleApi: Common {

    @GET(&quot;node/article&quot;)
    suspend fun getArticles(): ArticleResponse;

}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-ef40bde elementor-widget elementor-widget-text-editor" data-id="ef40bde" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p>6. Ensure you have the requisite permissions </p>						</div>
				</div>
				<div class="elementor-element elementor-element-a77a1b2 elementor-widget elementor-widget-code-block-for-elementor" data-id="a77a1b2" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>    /* AndroidManifest.xml file */
    &lt;uses-permission android:name=&quot;android.permission.ACCESS_NETWORK_STATE&quot; /&gt;
    &lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&gt;
    &lt;uses-permission android:name=&quot;android.permission.ACCESS_WIFI_STATE&quot; /&gt;</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-d97ddb7 elementor-widget elementor-widget-code-block-for-elementor" data-id="d97ddb7" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>/* Kotlin Activity class */

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {


    @Inject
    lateinit var articleRepository: ArticleRepository;
    lateinit var mainActivityMvc: MainActivityMvc;
    lateinit var networkTools: NetworkTools;
    val mainActivityViewModel: MainActivityViewModel by viewModels&lt;MainActivityViewModel&gt;();

    companion object {
        lateinit var appCompatActivity: AppCompatActivity;
    }

    init {
        appCompatActivity = this;
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mainActivityMvc =
            MainActivityMvc(LayoutInflater.from(this), null, this, articleRepository, mainActivityViewModel);
        setContentView(mainActivityMvc.getRootView_())
        networkTools = NetworkTools(this);
        mainActivityMvc.setListerners();
        appCompatActivity = this;
        mainActivityMvc.sendAPIRequest();
        mainActivityViewModel.observe(this, this, mainActivityMvc, mainActivityViewModel);

        requestMultiplePermissionLauncher.launch(
            arrayOf(
                Manifest.permission.INTERNET,
                Manifest.permission.ACCESS_NETWORK_STATE
            )
        )



    }

    override fun onResume() {
        super.onResume()

        if (networkTools.checkConnectivity()) {

        }


    }

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            val homeIntent = Intent(Intent.ACTION_MAIN)
            homeIntent.addCategory(Intent.CATEGORY_HOME)
            homeIntent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
            startActivity(homeIntent)
            return true
        }
        return super.onKeyDown(keyCode, event)
    }

    private val requestMultiplePermissionLauncher =
        registerForActivityResult(
            ActivityResultContracts.RequestMultiplePermissions()
        ) { result -&gt;

        }



}</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-0fc6010 elementor-widget elementor-widget-text-editor" data-id="0fc6010" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4> </h4><p>The above codebase is also available on <em><a href="https://bit.ly/3LQVr8s">Github</a></em> </p><p> </p><p><em><a href="https://bit.ly/3YsPhmL" target="_blank" rel="noopener">Symatech Labs</a> is a Software Development company based in Nairobi, Kenya that specializes in Software Development, Mobile App Development, Web Application Development, Integrations, USSD and Consultancy.</em></p>						</div>
				</div>
					</div>
		</div>
							</div>
		</section>
							</div>
		<p>The post <a href="https://symatechlabs.com/create-an-android-mobile-app-using-kotlin-that-consumes-an-api-from-a-drupal-instance/">Create An Android Mobile App Using Kotlin That Consumes An API From A Drupal Instance</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Export All Databases In MySQL At Once</title>
		<link>https://symatechlabs.com/export-all-mysql-databases-at-once/</link>
		
		<dc:creator><![CDATA[Symatech Labs]]></dc:creator>
		<pubDate>Thu, 25 Apr 2024 17:50:08 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://symatechlabs.com/?p=70728</guid>

					<description><![CDATA[<p>Export All Databases In MySQL At Once While this might not be something you would need to do every day, it could come in handy to know how to export all databases in your MySQL instance at once. The implementation makes use of a shell script which is an essential component of Linux process automation. Shell scripts make it easier to write and execute commands. Let&#8217;s jump [&#8230;]</p>
<p>The post <a href="https://symatechlabs.com/export-all-mysql-databases-at-once/">Export All Databases In MySQL At Once</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="70728" class="elementor elementor-70728">
									<section class="elementor-section elementor-top-section elementor-element elementor-element-1bac2ba elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="1bac2ba" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c707e07" data-id="c707e07" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-d18f361 elementor-widget elementor-widget-text-editor" data-id="d18f361" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2>Export All Databases In MySQL At Once</h2><p><span data-preserver-spaces="true">While this might not be something you would need to do every day, </span><span data-preserver-spaces="true">it could come in handy to know</span><span data-preserver-spaces="true"> how to export all </span><a class="editor-rtfLink" href="https://symatechlabs.com/creating-a-database-for-your-app/" target="_blank" rel="noopener"><span data-preserver-spaces="true">databases</span></a><span data-preserver-spaces="true"> in your MySQL instance at once.</span><span data-preserver-spaces="true"> </span><span data-preserver-spaces="true">The implementation </span><span data-preserver-spaces="true">makes use of</span><span data-preserver-spaces="true"> a shell script </span><span data-preserver-spaces="true">which</span><span data-preserver-spaces="true"> is an</span><span data-preserver-spaces="true"> essential component of Linux process automation.</span><span data-preserver-spaces="true"> Shell scripts make it easier to write and execute commands.</span></p><p>Let&#8217;s jump to the code.</p>						</div>
				</div>
				<div class="elementor-element elementor-element-5f0953b elementor-widget elementor-widget-code-block-for-elementor" data-id="5f0953b" data-element_type="widget" data-widget_type="code-block-for-elementor.default">
				<div class="elementor-widget-container">
			<pre class='line-numbers theme-okaidia' data-show-toolbar='yes'><code class='language-javascript'>#!/bin/bash

# Your MySQL credentials
USER=&quot;username&quot;
PASSWORD=&quot;password&quot;

# Retrieve all databases in your MySQL instance
DATABASES=$(mysql -u $USER -p$PASSWORD -e &quot;SHOW DATABASES;&quot; | grep -Ev &quot;(Database|information_schema|performance_schema|mysql)&quot;)

# Export as you iterate through the databases in your MySQL instance 
for DB in $DATABASES; do
    mysqldump -u $USER -p$PASSWORD --databases $DB &gt; $DB.sql
done
</code></pre>		</div>
				</div>
				<div class="elementor-element elementor-element-000956e elementor-widget elementor-widget-text-editor" data-id="000956e" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h4> </h4><h4><strong>Executing Shell Scripts</strong></h4><p><strong>Assumption</strong>: You are running a computer that uses Linux or a Unix equivalent.</p><ol><li>Create the shell script <em>(as  above)</em></li><li>Set the right file permission to the script  <em><strong>chmod +x name_of_the_script.sh</strong></em></li><li>Run the script on your <a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-the-linux-terminal" target="_blank" rel="noopener">Terminal</a><em><strong> ./name_of_the_script.sh</strong></em></li></ol><p> </p><p><em><a href="https://symatechlabs.com/contact-us/" target="_blank" rel="noreferrer noopener">Symatech L</a><a href="https://symatechlabs.com/" target="_blank" rel="noreferrer noopener">abs</a> is a Software Development company based in Nairobi, Kenya that specializes in Software Development, Mobile App Development, Web Application Development, Integrations, USSD and Consultancy.</em></p>						</div>
				</div>
					</div>
		</div>
							</div>
		</section>
							</div>
		<p>The post <a href="https://symatechlabs.com/export-all-mysql-databases-at-once/">Export All Databases In MySQL At Once</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Steps of Creating A Custom Camera using CameraX Library in Android</title>
		<link>https://symatechlabs.com/steps-of-creating-a-custom-camera-using-camerax-library-in-android/</link>
		
		<dc:creator><![CDATA[Symatech Labs]]></dc:creator>
		<pubDate>Thu, 11 Apr 2024 18:58:19 +0000</pubDate>
				<category><![CDATA[Mobile Apps]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://symatechlabs.com/?p=70677</guid>

					<description><![CDATA[<p>Steps of Creating A Custom Camera using CameraX Library in Android Comparatively, building a custom camera with Android&#8217;s CameraX library is &#8220;easier&#8221; than with the previous android.hardware.Camera API. android.hardware.Camera  had little control over exposure, focussing, and camera settings. It was devoid of many sophisticated features seen in contemporary cameras. The goal of Android Jetpack, which [&#8230;]</p>
<p>The post <a href="https://symatechlabs.com/steps-of-creating-a-custom-camera-using-camerax-library-in-android/">Steps of Creating A Custom Camera using CameraX Library in Android</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="70677" class="elementor elementor-70677">
									<section class="elementor-section elementor-top-section elementor-element elementor-element-293221d elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="293221d" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7d58903" data-id="7d58903" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-2e216cf elementor-widget elementor-widget-text-editor" data-id="2e216cf" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2>Steps of Creating A Custom Camera using CameraX Library in Android</h2><p>Comparatively, building a custom camera with Android&#8217;s <a href="https://developer.android.com/media/camera/camerax" target="_blank" rel="noopener">CameraX</a> library is &#8220;easier&#8221; than with the previous <a href="https://developer.android.com/reference/android/hardware/Camera" target="_blank" rel="noopener"><em><strong>android.hardware.Camera</strong></em></a> API. <a href="https://developer.android.com/reference/android/hardware/Camera" target="_blank" rel="noopener"><em><strong>android.hardware.Camera</strong></em></a>  had little control over exposure, focussing, and camera settings. It was devoid of many sophisticated features seen in contemporary cameras. The goal of <a href="https://developer.android.com/jetpack" target="_blank" rel="noopener">Android Jetpack</a>, which includes <a href="https://developer.android.com/media/camera/camerax" target="_blank" rel="noopener">CameraX</a>, is to simplify and standardize camera development across various Android devices.</p><p>Below are steps you can use when creating your custom camera.</p><h3> </h3><h3>Step One: Dependancies</h3><p>Add the following dependancies to the <strong><em>build.gradle.kts</em></strong> file. Sync the project to download the libraries to your local set up. You might experience some configuration issues, in that case you can always go through/download the source code as on <a href="https://bit.ly/3W20dGq" target="_blank" rel="noopener">Github.</a></p><p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-70679" src="https://symatechlabs.com/wp-content/uploads/2024/04/carbon.png" alt="Add dependancies Camera X" width="2800" height="640" /></p><h4> </h4><h3>Step Two: Set up the permissions</h3><p>Add the following permissions on your<strong><em> AndroidManifest.xml</em></strong> file.</p><p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-70683" src="https://symatechlabs.com/wp-content/uploads/2024/04/Android_Manifest_CameraX.png" alt="" width="2800" height="640" /></p><h3> </h3><h3>Step Three: Set up the Layout</h3><p>Include the <a href="https://developer.android.com/media/camera/camerax/preview" target="_blank" rel="noopener">PreviewView</a> in your layout file.</p><p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-70688" src="https://symatechlabs.com/wp-content/uploads/2024/04/camera_x_xml_layout.png" alt="" width="2800" height="2464" /></p><h3> </h3><h3>Step Four: Jump to the code</h3><p>In this case we used an <a href="https://developer.android.com/guide/components/activities/intro-activities" target="_blank" rel="noopener">Activity</a>, the same can also be done for <a href="https://developer.android.com/guide/fragments" target="_blank" rel="noopener">Fragments</a>. The full codebase can be found on <a href="https://bit.ly/3W20dGq">Github.</a></p><p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-70684" src="https://symatechlabs.com/wp-content/uploads/2024/04/CameraX_Kotlin_Android_Code.png" alt="" width="2800" height="3618" /></p><h3> </h3><h3>Final output</h3><p>Find the final output in the <a href="https://www.youtube.com/shorts/KsdO0iCyLjo" target="_blank" rel="noopener">YouTube Video</a> below.</p><p><iframe loading="lazy" title="Steps of Creating A Custom Camera Using CameraX Library In Android" width="1778" height="1000" src="https://www.youtube.com/embed/KsdO0iCyLjo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></p><p><em><a href="https://symatechlabs.com/contact-us/" target="_blank" rel="noreferrer noopener">Symatech L</a><a href="https://symatechlabs.com/" target="_blank" rel="noreferrer noopener">abs</a> is a Software Development company based in Nairobi, Kenya that specializes in Software Development, Mobile App Development, Web Application Development, Integrations, USSD and Consultancy.</em></p>						</div>
				</div>
					</div>
		</div>
							</div>
		</section>
							</div>
		<p>The post <a href="https://symatechlabs.com/steps-of-creating-a-custom-camera-using-camerax-library-in-android/">Steps of Creating A Custom Camera using CameraX Library in Android</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Creating A Database For Your App ?</title>
		<link>https://symatechlabs.com/creating-a-database-for-your-app/</link>
		
		<dc:creator><![CDATA[Symatech Labs]]></dc:creator>
		<pubDate>Fri, 23 Feb 2024 22:06:35 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[StartUps]]></category>
		<guid isPermaLink="false">https://symatechlabs.com/?p=70594</guid>

					<description><![CDATA[<p>Creating a database for your application is among the initial items in your development sprint. It is important to get it right in the first instance as redoing the schema could mean a change in your application logic.  &#160; What is a database? You can imagine a database as some sort of a “digital cabinet” [&#8230;]</p>
<p>The post <a href="https://symatechlabs.com/creating-a-database-for-your-app/">Creating A Database For Your App ?</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="70594" class="elementor elementor-70594">
									<section class="elementor-section elementor-top-section elementor-element elementor-element-5191367c elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5191367c" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5ff69362" data-id="5ff69362" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-139dac5d elementor-widget elementor-widget-text-editor" data-id="139dac5d" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<h2>Creating A Database For Your App ?</h2><p><span style="font-weight: 400;">Creating a database for your application is among the initial items in your development sprint. It is important to get it right in the first instance as redoing the schema could mean a change in your application logic. </span></p><h3> </h3><h3>What is a database?</h3><p>You can imagine a database as some sort of a “digital cabinet” that is neatly arranged and has the different items organized in their own “compartments” that are in most cases named for easy retrieval. An example could be a book cabinet that has compartments named by the genre i.e. fiction, biographies, science fiction, mystery, and e.t.c.</p><p> </p><p><span style="font-weight: 400;">The following are some of the considerations you can make when picking a database system.</span></p><h4> </h4><h4><strong>1. What Is The Purpose Of The Database</strong></h4><p><span style="font-weight: 400;">There are many reasons for coming up with a database, it is pertinent to determine this as it informs on the design and probably avoids unnecessary complexity. A database used in storing product details could be different from one that is used to record books in a library. </span></p><h4> </h4><h4><strong>2. The Type Of Database</strong></h4><p>Selecting the right database is critical as different databases have different features. For example, NoSQL databases do not store data using tabular relations as Relational databases. NoSQL databases are better suited for flexible, unstructured data or huge, scalable datasets, whereas Relational databases excel at structured data with clearly established relationships.</p><h4> </h4><h4><strong>3. Compatibility</strong></h4><p>The technology stack in use could determine the choice of the database system. Availability of drivers among other dependencies could inform your choice. You should pick a database system that would be compatible with your environment.</p><h4> </h4><h4><strong>4. Scalability</strong></h4><p>Over time, as users continue to make use of your application. The data stored in the database could grow and the demand in terms of resources<em>(CPU,RAM)</em> increases. Good user experience would dictate that the users should not experience degradation of the service. Picking a scalable database becomes an important factor to consider.</p><h4> </h4><h4><strong>5. Security Features</strong></h4><p>We live in a world where application software is mostly orchestrated and accessed publicly <em>(via Public IPs/Domains)</em>. There are advantages of having your application being publicly accessible i.e. you can serve people across the world. You can now see why security becomes an important consideration given that sensitive data could unwittingly get into the wrong hands. Some database systems come with security features that meet regulatory compliance out of the box. Other database systems would require intervention by the database administrator to enforce.</p><h4> </h4><h4><strong>6. Recovery</strong></h4><p>Make sure the database system has backup and durability procedures for data in the event of software errors, hardware malfunctions, or other calamities. Examine features like backups, replication, and transaction logging to prevent data loss and guarantee data integrity. </p><h4> </h4><h4><strong>7. Community Support</strong></h4><p>The ecosystem of the database system is as important as the features it has. Invariably, you will face issues, and depending on how big the community ecosystem is, resolution could take a few minutes to a few days.</p><h4> </h4><h4><strong>8. Cost &amp; Licensing</strong></h4><p>This may be the most underlooked factor when selecting a database system. Different setups could demand different licenses and some come with a cost attached to them.</p><p><em><a href="https://symatechlabs.com/contact-us/" target="_blank" rel="noreferrer noopener">Symatech L</a><a href="https://symatechlabs.com/" target="_blank" rel="noreferrer noopener">abs</a> is a Software Development company based in Nairobi, Kenya that specializes in Software Development, Mobile App Development, Web Application Development, Integrations, USSD and Consultancy.</em></p>						</div>
				</div>
					</div>
		</div>
							</div>
		</section>
							</div>
		<p>The post <a href="https://symatechlabs.com/creating-a-database-for-your-app/">Creating A Database For Your App ?</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How To Make Your Android App The Default SMS App</title>
		<link>https://symatechlabs.com/how-to-make-your-android-app-the-default-sms-app/</link>
		
		<dc:creator><![CDATA[Symatech Labs]]></dc:creator>
		<pubDate>Sat, 02 Dec 2023 19:45:13 +0000</pubDate>
				<category><![CDATA[Mobile Apps]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://symatechlabs.com/?p=70409</guid>

					<description><![CDATA[<p>How To Make Your Android App The Default SMS App   SMSs are still here with us, 30 years later. Software engineers have built amazing experiences around SMSs complimenting stock SMS clients (SMS Apps that come with your phone/device). To do this, it  is a requirement to make the mobile application the default messaging app [&#8230;]</p>
<p>The post <a href="https://symatechlabs.com/how-to-make-your-android-app-the-default-sms-app/">How To Make Your Android App The Default SMS App</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="70409" class="elementor elementor-70409">
									<section class="elementor-section elementor-top-section elementor-element elementor-element-04ed3ed elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="04ed3ed" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-de5fb91" data-id="de5fb91" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-82f5a6b elementor-widget-mobile__width-inherit elementor-widget elementor-widget-text-editor" data-id="82f5a6b" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							<p></p>
<h2>How To Make Your Android App The Default SMS App</h2>
<p> </p>
<p>SMSs are still here with us, <a href="https://www.vodafone.com/news/technology/25-anniversary-text-message" target="_blank" rel="noopener">30 years</a> later. Software engineers have built amazing experiences around SMSs complimenting stock SMS clients <em>(SMS Apps that come with your phone/device)</em>. To do this, it  is a requirement to make the mobile application the default messaging app running on the Android phone/device.</p>
<p> </p>
<h3>Steps</h3>
<p><strong>1. Android Manifest</strong></p>
<p>Set up your manifest to have the following: </p>
<p><iframe src="https://pl.kotl.in/IY9FP6T91"></iframe></p>
<p> </p>
<p><strong>2. Broadcast Receivers</strong></p>
<p>Have a <a href="https://developer.android.com/guide/components/broadcasts" target="_blank" rel="noopener">broadcast receiver</a> to allow your Android app to receive incoming SMS messages.</p>
<p> </p>
<p><iframe src="https://pl.kotl.in/q3lsrIxKp"></iframe></p>
<p>Have another <a href="https://developer.android.com/guide/components/broadcasts" target="_blank" rel="noopener">broadcast receiver</a> to allow your Android app to receive incoming MMS messages.</p>
<p> </p>
<p><iframe src="https://pl.kotl.in/7u06KlfHn"></iframe></p>
<p> </p>
<p><strong>3. Activity</strong></p>
<p>This activity could be where you would have the bulk of the default SMS app functionality <em>i.e. send SMS, view SMS etc.</em> </p>
<p> </p>
<p><iframe src="https://pl.kotl.in/-aP0FtRAX"></iframe></p>
<p>There&#8217;s a function <em><strong>areWeTheDefaultMessagingApp()</strong> </em>that checks for the default SMS app on the device and returns a boolean <em>(<strong>false</strong> if the Android app you are building is not the default SMS app)</em>. How it is currently set up on the <a href="https://bit.ly/419jir4" target="_blank" rel="noopener">codebase</a> is that the button, when clicked, invokes the said function and depending on the returned value, the option of selecting the default SMS app runs. One should not be limited to doing the same using a button, you can have the function running when the app starts.</p>
<p> </p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-70471 aligncenter" src="https://symatechlabs.com/wp-content/uploads/2023/12/Screenshot_20231202_221748_Permission-controller-portrait-2.png" alt="" width="268" height="300" /></p>
<p>Google announced an impending modification to the way the OS handled SMS apps just before releasing Android 4.4 <em>&#8220;Kit Kat&#8221;</em>. In the past, your Android device could be configured to receive or send SMS messages from any number of apps. Google has attempted to tighten all of that with Kit Kat, restricting the OS to essentially letting only one app send and receive SMS and MMS messages.</p>
<p> </p>
<p><strong>4. Intent Service</strong></p>
<p>There could be occasions where you might want users to promptly reply to incoming phone calls by sending an instant text message.</p>
<p> </p>
<p><iframe src="https://pl.kotl.in/uSOHE8_aK"></iframe></p>
<p>The above codebase is also available on <a href="https://bit.ly/419jir4" target="_blank" rel="noopener">Github</a> </p>
<p> </p>
<p><em><a href="https://symatechlabs.com/contact-us/" target="_blank" rel="noreferrer noopener">Symatech L</a><a href="https://symatechlabs.com/" target="_blank" rel="noreferrer noopener">abs</a> is a Software Development company based in Nairobi, Kenya that specializes in Software Development, Mobile App Development, Web Application Development, Integrations, USSD and Consultancy.</em></p>
<p> </p>						</div>
				</div>
					</div>
		</div>
							</div>
		</section>
							</div>
		<p>The post <a href="https://symatechlabs.com/how-to-make-your-android-app-the-default-sms-app/">How To Make Your Android App The Default SMS App</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Why some Apps require the Device Admin Permission</title>
		<link>https://symatechlabs.com/why-some-apps-require-the-device-admin-permission/</link>
		
		<dc:creator><![CDATA[Brian Osoro]]></dc:creator>
		<pubDate>Fri, 19 May 2023 21:18:27 +0000</pubDate>
				<category><![CDATA[Mobile Apps]]></category>
		<category><![CDATA[Software Development]]></category>
		<guid isPermaLink="false">https://www.symatechlabs.com/blog/?p=126</guid>

					<description><![CDATA[<p>Android provides support for some applications through the Android Device Administration API. This API enables device administration features at the system level, allowing the creation of security-conscious apps that are valuable in enterprise environments where IT professionals require extensive control over companies devices.   A common use case for using the Device Admin Permission is [&#8230;]</p>
<p>The post <a href="https://symatechlabs.com/why-some-apps-require-the-device-admin-permission/">Why some Apps require the Device Admin Permission</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="126" class="elementor elementor-126">
									<section class="elementor-section elementor-top-section elementor-element elementor-element-7d3b2ca5 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7d3b2ca5" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-203600a" data-id="203600a" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-55c30a70 elementor-widget elementor-widget-text-editor" data-id="55c30a70" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							
<p><strong><a href="https://www.android.com/" target="_blank" rel="noreferrer noopener">Android</a></strong> provides support for some applications through the <a href="https://developer.android.com/reference/android/app/admin/DeviceAdminInfo" target="_blank" rel="noreferrer noopener"><strong>Android Device Administration API</strong></a>. This API enables device administration features at the system level, allowing the creation of security-conscious apps that are valuable in enterprise environments where IT professionals require extensive control over companies devices.</p>

<p> </p>
<p>A common use case for using the Device Admin Permission is when a company buys devices for it&#8217;s employers and wants to set policies which are to be adhered to. The policies include:</p>
<p> </p>

<ol class="wp-block-list">
<li>Disabling all cameras of a phone</li>

<li>Disables use of <a href="https://stackoverflow.com/questions/17689842/what-is-the-keyguard-in-android" target="_blank" rel="noreferrer noopener">keyguard features</a>.</li>

<li>Enforce a password change for users within a time limit specified by the administrator.</li>

<li>Force the device to lock or limit the maximum lock timeout for the device.</li>

<li>Limit the passwords that the user can select.</li>

<li>Enforce the device password reset.</li>

<li>Observe login attempts by the user.</li>

<li>Force the device to go on factory reset.</li>

<li>Wipe the device&#8217;s data.</li>
</ol>

<p> </p>
<p>It is important to note that before the above functionalities can run, one needs to accept and enable the Device Admin App. Upon enabling the Device Admin App, users become bound by its policies, which often result in privileges such as accessing sensitive systems and data.</p>

<p> </p>
<p>An example of an App that makes use of the Device Admin Permission is <a href="https://bit.ly/3MnRQyx" target="_blank" rel="noreferrer noopener"><strong>PinFailed</strong></a>, an App we developed. You can also find it&#8217;s source code on <a href="https://bit.ly/3MoYVio" target="_blank" rel="noreferrer noopener"><strong>Github</strong></a></p>

<p> </p>

<p><em><strong><a href="https://symatechlabs.com/contact-us/" target="_blank" rel="noreferrer noopener">Symatech Labs</a></strong> is a Software Development company based in Nairobi, Kenya that specializes in Software Development, Mobile App Development, Web Application Development, Integrations, USSD and Consultancy.</em></p>
						</div>
				</div>
					</div>
		</div>
							</div>
		</section>
							</div>
		<p>The post <a href="https://symatechlabs.com/why-some-apps-require-the-device-admin-permission/">Why some Apps require the Device Admin Permission</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How Code can be documented</title>
		<link>https://symatechlabs.com/how-code-can-be-documented/</link>
		
		<dc:creator><![CDATA[Brian Osoro]]></dc:creator>
		<pubDate>Fri, 04 Nov 2022 15:09:19 +0000</pubDate>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Code Documentation]]></category>
		<category><![CDATA[Documentation]]></category>
		<guid isPermaLink="false">https://www.symatechlabs.com/blog/?p=112</guid>

					<description><![CDATA[<p>How Code can be documented   Documentation is the instruction manual that explains how code is structured and, consequently, how it works. This is often accomplished by outlining the arguments that the function or method anticipates, the body of the function, and the results of the function. For a variety of reasons, code documentation is [&#8230;]</p>
<p>The post <a href="https://symatechlabs.com/how-code-can-be-documented/">How Code can be documented</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="112" class="elementor elementor-112">
									<section class="elementor-section elementor-top-section elementor-element elementor-element-fe490f0 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="fe490f0" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-528e2dd" data-id="528e2dd" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-5736068 elementor-widget elementor-widget-heading" data-id="5736068" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.14.0 - 26-06-2023 */
.elementor-heading-title{padding:0;margin:0;line-height:1}.elementor-widget-heading .elementor-heading-title[class*=elementor-size-]>a{color:inherit;font-size:inherit;line-height:inherit}.elementor-widget-heading .elementor-heading-title.elementor-size-small{font-size:15px}.elementor-widget-heading .elementor-heading-title.elementor-size-medium{font-size:19px}.elementor-widget-heading .elementor-heading-title.elementor-size-large{font-size:29px}.elementor-widget-heading .elementor-heading-title.elementor-size-xl{font-size:39px}.elementor-widget-heading .elementor-heading-title.elementor-size-xxl{font-size:59px}</style><h4 class="elementor-heading-title elementor-size-default">How Code can be documented<br></h4>		</div>
				</div>
				<div class="elementor-element elementor-element-287cf11 elementor-widget elementor-widget-image" data-id="287cf11" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="1000" height="420" src="https://symatechlabs.com/wp-content/uploads/2022/11/ttbzcx5npi9al3gaqfly.webp" class="attachment-large size-large wp-image-113" alt="Code documentation" srcset="https://symatechlabs.com/wp-content/uploads/2022/11/ttbzcx5npi9al3gaqfly.webp 1000w, https://symatechlabs.com/wp-content/uploads/2022/11/ttbzcx5npi9al3gaqfly-300x126.webp 300w, https://symatechlabs.com/wp-content/uploads/2022/11/ttbzcx5npi9al3gaqfly-768x323.webp 768w" sizes="auto, (max-width: 1000px) 100vw, 1000px" />															</div>
				</div>
					</div>
		</div>
							</div>
		</section>
				<section class="elementor-section elementor-top-section elementor-element elementor-element-5179ab5 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="5179ab5" data-element_type="section">
						<div class="elementor-container elementor-column-gap-default">
					<div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6a707f2a" data-id="6a707f2a" data-element_type="column">
			<div class="elementor-widget-wrap elementor-element-populated">
								<div class="elementor-element elementor-element-65952c63 elementor-widget elementor-widget-text-editor" data-id="65952c63" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
							
<p> </p>
<p>Documentation is the instruction manual that explains how code is structured and, consequently, how it works. This is often accomplished by outlining the arguments that the function or method anticipates, the body of the function, and the results of the function. For a variety of reasons, code documentation is important. Well-documented code is simpler to maintain and update, and future developers will have a better understanding of the codebase as they will know where to make modifications when adjustments are required. Documentation may also assist in learning from the errors we made today so that we don&#8217;t make the same ones again when working on future projects. </p>

<h2 class="wp-block-heading"> </h2>
<h2>Nobody Has Time For Documentation</h2>

<p>Rarely do we have time to stop everything we&#8217;re doing and concentrate on documenting our code when working on a project that has a deadline. Whatever you are doing, there&#8217;s a good chance you or a colleague will need to review the source code at some point. It will be difficult to recall what you wrote and why as clearly as it was on that day. And even if you get to remember what you wrote, there might be some edge instances or particular uses that aren&#8217;t immediately obvious. Documentation becomes the obvious option.</p>

<p>Spending a little more time now to properly describe the work you did will pay off in the long run. The next time someone wants to understand what happens inside your code, you will only have to point them to the detailed documentation. Both you and they will save time since you won&#8217;t need to explain things to them, and they will save time because they won&#8217;t need to rely on you.</p>

<h2 class="wp-block-heading"> </h2>
<h2>Some Principles To Consider</h2>

<ol class="wp-block-list">
<li>The documentation should not be ambiguous but precise and to the point.</li>

<li>In terms of context, it should be from the point of view of the person reading the code.</li>

<li>Assume the person reading your code knows nothing.</li>

<li>Should describe how the codebase has been organized in terms of structure and how the various components interact. A description of the design pattern used is equally important. </li>

<li>Document bugs and how they got solved.</li>

<li>Document changes made to the code and why they were made.</li>

<li>Making use of glossaries to aid the reader in understanding terms that directly relate to a subject</li>

<li>The documentation needs to be up to date, updates/changes made to the codebase would require a similar update in the documentation for relevance. </li>

<li>Documentation should be a collaborative affair more so if the codebase had more than one author.</li>

<li>Getting rid of what is not being used <em>dead </em>is essential especially when the same could become a source of misinformation. </li>
</ol>

<p> </p>

<h2 class="wp-block-heading"> </h2>
<h2>Nested Code</h2>

<p>Conditionals are primarily responsible for nested code. We can&#8217;t really get rid of conditionals because they are the foundation of all programming logic. We must be aware of how they affect the reading of the source code.</p>

<p>An important aspect when reading nested code is the number of levels the nested code has. The more levels, the more complicated it gets when reading the source code. When reading source code, we ideally intend to create a mental model of the program’s behavior. Readable code requires less effort to create and maintain the mental model than code that is hard to read. </p>

<p>An example of nested code, as you can see, it takes some time for one to get around and there’s a possibility of misinterpreting what the code intends to achieve.</p>
<p> </p>

<p><img loading="lazy" decoding="async" src="https://lh5.googleusercontent.com/hH3QcMv8Z5v_BSBguEugqVutMfirqcDDVVXKxjvqxFBrO_7G7mbkj4TyXtxpBwQ3CXleqkgDadSU-JEUm5jUyj_fKJjyAhI9iKMoFvOluZlirFP67UQEmnLd_fLRz_CLCFHpGT2LAEvErbxPjgTMIXMx7MN99yz1ah5lz5HFJsFJD1NRpQuox2kqnFdgxg" width="444" height="682" /></p>

<p>The above code snippet is an example of nested code, its understanding is subjective to the author and will be difficult for anyone else to understand and create a mental model. Possible solutions for this could be:</p>

<ol class="wp-block-list">
<li>Document each line of the code to give a detailed explanation of what was to be achieved. </li>

<li>Refactor the different nested blocks into separate functions.</li>

<li>Use of <a href="https://deviq.com/design-patterns/guard-clause">guard clauses</a></li>
</ol>

<p> </p>

<h2 class="wp-block-heading">Example</h2>

<p>Below are screenshots and the actual Java files demonstrating how the documentation has been done on the selected classes. It is a part of a bigger project that can be found <a href="https://bit.ly/3Uzg2AL" target="_blank" rel="noreferrer noopener">here</a></p>

<p>Link to the documentation example: <a href="https://bit.ly/3UuF4kd" target="_blank" rel="noreferrer noopener">https://bit.ly/3UuF4kd </a></p>

<p> </p>

<p><a href="https://symatechlabs.com/contact-us/" target="_blank" rel="noreferrer noopener">Symatech L</a><a href="https://symatechlabs.com/" target="_blank" rel="noreferrer noopener">abs</a> is a Software Development company based in Nairobi, Kenya that specializes in Software Development, Mobile App Development, Web Application Development, Integrations, USSD and Consultancy.</p>
						</div>
				</div>
					</div>
		</div>
							</div>
		</section>
							</div>
		<p>The post <a href="https://symatechlabs.com/how-code-can-be-documented/">How Code can be documented</a> appeared first on <a href="https://symatechlabs.com">Symatech Labs</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
