Wednesday, December 25, 2013

Basic Android UI, Design Patterns & ListView

Here i'd like to note useful ideas, links i referenced during my my month of self learning Android application development. Hope it is helpful to others as well.

User Interface (UI) in Android

An app's user interface is everything that the user can see and interact with. The response to user input is designed to be immediate and provides a fluid touch interface, often using the vibration capabilities of the device to provide haptic feedback to the user.

To design a good user interface we must:
·     Focus on the user
o   Know the users
o   Age, skill level, culture
o   What they want to do with the app
o   What kinds of devices they’ll be using
o   When, where, how they’ll be using the devices
·     Design with a user first mentality
o   Users are generally task driven
o   Test on real users, early and often
·      Make the right things visible
o   The most common operation should be immediately visible and available
o   Secondary functionality should be reserved for the menu button
·     Show proper feedback
o   Have at least four states(<selector>) for all interactive UI elements
o   Make sure the effects of the action are clear and visible
o   Show adequate yet unobtrusive progress indicators
·     Be predictable
o   Do what the user expects
o   Properly interact with the activity stack
o   Show information and action user wants to see
o   Use proper affordances
o   If something is clickable, make sure it looks clickable
·     Be fault-tolerant
o   Constraint possible operations to only those that make sense
o   limit the number of irreversible actions
o   Prefer undo to confirmation dialogues

Views and ViewGroups

The basic unit of an Android application is an Activity. An Activity displays the user interface of the application, which may contain widgets like buttons, labels, text boxes, etc. Typically, we define the UI using an XML file (for example, the main.xml file located in the res/layout folder).

An Activity contains Views and ViewGroups. A View is a widget that has an appearance on screen. Examples of widgets are buttons, labels, text boxes, etc.

One or more Views can be grouped together into a ViewGroup. A ViewGroup (which is by itself is a special type of View) provides the layout in which you can order the appearance and sequence of views. Android supports the following ViewGroups:

·     LinearLayout
o   The LinearLayout arranges views in a single column or single row. Child views can either be arranged vertically or horizontally.
·     AbsoluteLayout
o   The AbsoluteLayout lets to specify the exact location of its children.
·      TableLayout
o   The TableLayout groups views into rows and columns. We use the <TableRow> element to designate a row in the table. Each row can contain one or more views. Each view you place within a row forms a cell. The width for each column is determined by the largest width of each cell in that column.
·      RelativeLayout
o   The RelativeLayout lets us specify how child views are positioned relative to each other.
·      FrameLayout
o   The FrameLayout is a placeholder on screen that we can use to display a single view. Views that is added to a FrameLayout is always anchored to the top left of the layout.
·      ScrollView
o   A ScrollView is a special type of FrameLayout in that it allows users to scroll through a list of views that occupy more space than the physical display.



Android UI Design Patterns


Like a software design pattern, a UI design pattern describes a general solution to a recurring problem. Patterns emerge as a natural by-product of the design process. The design patterns include:


Dashboard


A quick intro to an app, revealing capabilities and proactively highlighting new content. It is the organized way of display to arrange the functionalities of the app.  It highlights what’s new and focuses on 3-8 most important choices. It should be flavorful as it is the first impression of the app.




Action Bar

It is a dedicated real estate at top of the screen to support navigation and frequently used operations. It can provide a quick link to dashboard (or other app home). It is used to bring key actions onscreen and helps to convey a sense of place. It is used consistently within the app.




Search Bar
It is a consistent pop-in search form anchored to top of the screen. It can replace action bar (if present). It is used for simple searches which provides rich suggestions.


 Quick Actions
It is an action popup triggered from distinct visual target. It is minimally disruptive to screen context. Actions are straightforward, fast and fun. It is used when items have competing internal targets. It is present for most important and obvious actions.



ListView


A Simple ListView is a view group that displays a list of scrollable items. The list items are automatically inserted to the list using an Adapter that pulls content from a source such as an array or database query and converts each item result into a view that's placed into the list.


In a custom listview, we will create custom ListView where each row item consists of the views we want, and populate its items using custom ArrayAdapter. The Adapter defines how each row is displayed (i.e the layout for each row. We will define layout for rows in ListView in a XML file and place it in res/layout. The adapter provides data to each row in ListView.


We can customize our ListView with image that is not defined in the resource folder in android by loading images from the internet. 

It's a time-consume task to load bitmap from internet. Whenever we need to perform lengthy operation or any background operation we can use Asynctask which executes a task in background and publish results on the UI thread without having to manipulate threads and/or handlers. In onCreate(), we create and execute the task to load image from url. The task’s execute method invokes doInBackground() where we open a Http URL connection and create a Bitmap from InputStream and return it. Once the background computation finishes, onPostExecute() is invoked on the UI thread which sets the Bitmap on ImageView. The image should be cached in the phone in case we want to reuse it later. If the number of items to be downloaded exceeds a certain threshold(meaning more fetches and memory) we should consider reducing the fetches and also the Runtime memory consumption by caching them. We can choose to save them on Sdcard.





















ActionBarSherlock in Android [Latest]

Implementing ActionBarSherlock in Android
ActionBarSherlock is an library designed to facilitate the use of the action bar design pattern across all versions of Android through a single API.

The library will automatically use the native actionbar implementation on Android 4.0 or later. For previous versions which do not include ActionBar, a custom action bar implementation based on the sources of Ice Cream Sandwich will automatically be wrapped around the layout. This allows to easily develop an application with an action bar for every version of Android from 2.x and up

Step 1: Download the ActionBarSherlock Library from the website http://actionbarsherlock.com/

(I have downloaded ABS from this site : https://api.github.com/repos/JakeWharton/ActionBarSherlock/zipball/4.2.0 )
Step 2: You will get the library in ".zip / .tar" format. After downloading the ABS library, extract it and copy the 'library' folder into your workspace.

Screenshot showing library folder
In case you have downloaded the same ABS as I have, then
Replace the 'android-support-v4' jar file inside the 'libs' folder of 'library' folder in your workspace with the latest 'android-support-v4' jar file from http://actionbarsherlock.com/ .

Step 3: Import the 'library' as a project into Eclipse.

Go to File > Import

Go to Android and select 'Existing Android Code Into Workspace'

Click on 'Browse'

Select the library within your workspace

Make sure 'Copy projects into workspace' is checked and click 'Finish'
Library has been imported



Step 4 : 'Right Click' on 'library' and go to 'Properties'. Make sure 'Is Library' is checked under the field 'Android'.

Clicking on 'Properties' of ' library'


Go to Android and make sure 'Is Library' is checked



Step 5 : Now import ABS library into your project. 'Right Click' on project node and go to your project 'Properties'. Select it and continue with the screen flow.

Click on 'Properties'

Click 'Add'

Select 'library' and click 'OK'

Make sure Is Library is not checked. Click 'Apply' and 'OK'


Step 6 : You might get new error as 'jar mismatch : fix your dependencies'. This error is because the 'android-support-v4' jar file of 'libs' under your project and the 'android-support-v4' jar file of 'libs' under the 'library' is exactly the same. 

So just delete the 'android-support-v4' jar file of 'libs' under your project.

Deleting the jar file of 'libs' under your project 


Step 7: Now go to your project's AndroidManifest file and choose your application theme as android:theme="@style/Theme.Sherlock".

AndroidManifest.xml


Also goto your project's MainActivity.java and extend MainActivity with SherlockActivity.

MainActivity.java




Now you are ready to access ActionBarSherlock Library Features in your Android Application Project.
References

Sunday, December 15, 2013

Introduction to Elgg

An Intro on Elgg - How to get started in Elgg Theming ?

Intro to Elgg

Elgg is a social networking framework that helps to build a social networking site in fair amount of time. It's written on PHP. Elgg can be compared to "PHP based CMS" designed for a social networking site so it can called as "social networking CMS" and also is based on MVC pattern. Elgg independently consist of its framework approach and does not depend upon existing frameworks. It can be a plus point and negative point as well also depending upon your existing familiarity with PHP MVC frameworks.

By visiting its official site , Elgg.org, you can understand a lot about its core codebase and active community. Being a social networking CMS a normal user can also initiate it with minimum amount of time and run it with full flexibility.

Elgg is backed by community support and number of developers working on this platform are increasing. Which has created tremendous resources for learning. Therefore with freely available resources online developers can self learn to extend elgg according to their need. We can find many plugins and themes at the elgg community site. By checking out how these plugins and themes are built you can get much more information about the developmental pattern of elgg and understand plugins and themes better.

Architecture of Elgg

Elgg consists of controller and Modular Plugins System 
Elgg is built on MVC.

Folder Structure of Elgg


The primary folder structure includes

/mod → Plugins / themes stores
/engine → Elgg core files
/views → All views files resides here
/actions → Actions Controller
/documentation → Documentation of Elgg
/pages → Various Pages Controllers
/install → Installation folder ( Can be deleted after the installation )


A glimpse of the folder structure is shown above

Theming / Plugin development

By default elgg contains various important plugins built by the elgg developers itself. But depending upon the custom requirements for our social networks they might not be sufficient. So to fulfill our requirement according to our need we can make our own custom plugin/themes. Themes in Elgg are implemented as plugins. When we talk about building themes - we talk about building plugins.

Folder Structure of Plugins

All plugins are stored in "mod" directory in Elgg installation.
For activating plugins , log in with your administrator account , Administration -> Configure -> Plugins.
Find your plugin in the list of installed plugins and click on the 'Enable' button.

A  glimpse of the folder structure of a core plugin ‘blog’ is shown below




Plugin Manifest

Plugin Manifest is the information file related to plugin. It is an XML file located in the root folder of a plugin (see above picture of blog plugin). This file contains information about the plugin like author and version. The information stored here is viewed in admin dashboard as a plugin identifying information.

Plugin Hooks

Elgg plugins hooks are simple events that are triggered (executed) when an action has occurred and parts of that action can be overridden by a plugin. Though there are more cases when a plugin hook can be used because it is more general purpose than an Elgg event.

To get on plugin hooks first we have to register it by calling reister_plugin_hook() that will resides in start.php file

Simple plugin


A plugin development begins with creation of start.php file. It is very important due to the fact this file contains all the things that need to get operated while going through the plugin.
Among all the the features of elgg, one feature of elgg is that every aspects of the core are extensible.

Elgg contains lots of core plugins and default theme that you can start with . In elgg you can build theme/plugin starting over and in reference of existing plugins. 

Here themes are treated as plugins that override display aspects (views) of Elgg and should normally be placed at the bottom of the plugin list (in administration dashboard) so that the current theme runs last due to the fact that it need necessary component to load.

Overriding default views of “different elements/sections” - menu, header, footer etc

Elgg views depend upon the files located at default view folder. For customizing these views we create the file structures of which we want to extend such as menu, header, footer etc categories according to the folders.
View scripts are mapped to view name strings.
Elgg contains different files related to the design of the page views such as menu, header, navigation footer etc . Depending upon the choice we can extend these files and modify according to our necessity.
For New views use configuration as elgg_extend_view($view_name, $view_extension_name)
The similar files names are created in our own extended component. So if the files exists then the files are executed else the default files containing in mod directory get executed for the similar names.
Be careful with the file names as it should be identical to that of default directory.

Whenever we install a theme, we are overriding all or portions of the default theme.

References:

A Good Overview from Elgg Core devs:

Official Documentation
http://docs.elgg.org/wiki/Main_Page

Useful information
http://www.perjensen-online.dk/12/elgg-unextend-view/

Wednesday, November 27, 2013

Intern Story: Begining Android Development (first hand experience)


Before starting developing Android apps, the development environment is set up. I found it a bit of a hassle, but once it sets up, it works really well. Eclipse is the IDE that I use. I am following the Android training from developer.android.com. Android applications are built in Java and uses XML. The first day is stressful as the vocabulary from the Java and the Android SDK is completely new to me. It takes time to understand and get acquainted with the new vocabulary.

The XML part is straight forward, but linking things like links in websites is a fiddly job. As we can make html pages in website for each page in an Android application we make an Activity. And we can link between activities like we can do in website, which can be done by intent. Intent is an intention to do an action. It is a message from an application saying it wants to perform an action. It lets the applications to interact with each activity and share data. This is a useful feature that helps to move swiftly between the activities, and notify application & user of various events. The activities we link to/from are capable to listen to the intents and respond to them.

The next chapter in developer.android.com is, I feel, not as good as the first because it does not give us the step by step guide of everything in detail. I felt the need to find some other tutorials which could be handy for a beginner like me where every small element is described with examples.

Layouts are the essential things to know when we start learning android. Android layouts are written in XML. It is a resource that defines what to see on the screen which organizes the child controls such as button or text controls or images. I found it easy to start building layouts in XML. There are a number of different layout types that can be used to organize controls on a screen and we can choose the appropriate layout in accordance with our requirement. Layouts can be nested if needed.

I can use the style resource to define the format and look for a UI and the style can be applied to an individual View or to an entire Activity or application. Android uses XML for styles. Android also uses XML for strings, colors and others. A string resource provides text strings for application with optional text styling and formatting.

What I came to know as a thing of vital importance is Android development platform helps to make the application work itself across all the devices with wide variety of resolution, screen sizes, and screen densities by performing scaling and resizing to give user the feeling that using android is one fluid experience. For this, all the images for different screen densities are saved in the drawable resources folder and the system will pick the correct one. The same thing can be done with the layouts, different layouts for small and large screens can be used, and system will use the right one, simply just to fit the screen.

Overall, I'm beginning to grasp Android quickly. I could grasp wee bit of everything I learned. So in my view, through self-learning, Android Development will be challenging and exciting task to do but not a problematic and impossible task. I think, this is the era for the android developers as more and more versatile and powerful smartphones are built on android platforms. We just have to clear our mind and have the “let’s just do it” attitude to self-learn to develop android applications. I do really enjoy working with Android, and will definitely continue to do so in the future.

Written By:Bibash Shrestha
Android Apps / Game Development Intern
After his first week @ first hand experience in Android development

Monday, July 29, 2013

Basic blogger template : just posts, absolutely minimum

Here's a basic form of blogger template that you can use to build other advanced template. I always wanted to bake my own custom themes and templates for blogger but there's no official documentation - actually there are but not that developer friendly ! Further, inspecting existing template source code it is very hard to derive what follows. I mean, there are definitely rules and syntaxes to follow in blogger template but looking at any downloaded template can be intimidating to beginners.

So, this is very minimal template i'm presenting here. Make template a xml doc, inspect header and meta tags. All CSS style rules inside - under CDATA (it's xml). And minimum requirement for a blogger template is there should be at least one b:section This basic template has one section which includes a blog posts widget. To learn more about how sections / widgets work together please refer to links at footer.

Notes for further work:  

1) JS can be troublesome. If nothing worked encode it or put the whole content inside script into CDATA.
2) Images needs to be hosted. 

3) All CSS needs to be in one page or host it somewhere separately.
4) All JS needs to be in one page or host it somewhere separately.
5) Imagine different kind of "page" types and different kind of layout / templates you'd like to render depending upon different URLs, and imagine all of this to be done in single page XML file. Holy Shit ! There sure gonna be loads of if and else blocks if this has to be achieved in one page.

Enjoy. And if this work helped you get started in developing/designing blogger templates, don't forget to link my gist or this post in your website somewhere :) i'd be glad.




Grab code from gits: https://gist.github.com/bhu1st/6105200
Template Code Below:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html expr:dir='data:blog.languageDirection' xmlns='http://www.w3.org/1999/xhtml' xmlns:b='http://www.google.com/2005/gml/b' xmlns:data='http://www.google.com/2005/gml/data' xmlns:expr='http://www.google.com/2005/gml/expr'>
<head>

<b:include data='blog' name='all-head-content'/>
<link expr:href='data:blog.url' rel='canonical'/>

<b:if cond='data:blog.pageType == &quot;index&quot;'>
  <title><data:blog.pageTitle/></title>
<b:else/>
<b:if cond='data:blog.pageType != &quot;error_page&quot;'>
 <title><data:blog.pageName/> - <data:blog.title/></title>
<b:else/>
 <title>404 - <data:blog.title/></title>
</b:if>
</b:if>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="keywords" content="Semicolon developers, semicolon languages, semicolon technologies, semicolon software, developers network, network professionals, web development nepal, software development nepal, offshore development nepal, outsourcing nepal, web development kathmandu, software development kathmandu, offshore development kathmandu, outsourcing kathmandu, computer courses in kathmandu, PHP course , JavaScript course, android course, " />
<meta name="description" content="Semicolon developers network pvt. ltd. is an Android and web application development company in Kathmandu, Nepal. We can be your next IT development partner." />
 
<!-- You May Not Share any of these codes unless giving credits to Technolies blog -->
    <b:if cond='data:blog.pageType == &quot;archive&quot;'>
     <meta content='noindex,noarchive' name='robots'/>
    </b:if>  

<b:skin><![CDATA[/*
-----------------------------------------------
Blogger Template: Semicolon Developers
Template By:      Bhupal Sapkota
URL:              http://semicolondev.com
Date:             29 July 2013
----------------------------------------------- */
html, body{
background:#FFF;
margin:0;
padding:0;
}

]]></b:skin>

</head>

<body>


<b:section class='main' id='main' showaddelement='yes'>
<b:widget id='Blog1' title='Blog Posts' type='Blog' locked='false'>

<b:includable id='main' var='main'>

  <!-- blogposts -->

  <div>
    <b:loop values='data:posts' var='post'>
      <b:include data='post' name='post'/>
    </b:loop>      
  </div>

   <!-- navigation -->
  <b:include name='nextprev'/>

</b:includable>


<b:includable id='post' var='post'>
  <div class='post'>
    <a expr:name='data:post.id'/>

    <b:if cond='data:post.title'>
      <h2>
     <b:if cond='data:post.link'>
        <a expr:href='data:post.link'><data:post.title/></a>
     <b:else/>
        <b:if cond='data:post.url'>
          <a expr:href='data:post.url'><data:post.title/></a>
        <b:else/>
          <data:post.title/>
        </b:if>
     </b:if>
      </h2>
    </b:if>

<div class='post-meta'>
Posted by  <data:post.author/>, <data:post.dateHeader/>
</div>

<div>
<data:post.body/>
</div>

  </div>
</b:includable>

<b:includable id='nextprev'>
  <div>
    <b:if cond='data:newerPageUrl'>
      <a expr:href='data:newerPageUrl' expr:id='data:widget.instanceId + &quot;_blog-pager-newer-link&quot;' expr:title='data:newerPageTitle'>&#171; <data:newerPageTitle/></a>    
    </b:if>

    <b:if cond='data:olderPageUrl'>    
      <a expr:href='data:olderPageUrl' expr:id='data:widget.instanceId + &quot;_blog-pager-older-link&quot;' expr:title='data:olderPageTitle'><data:olderPageTitle/>  &#187;</a>    
    </b:if>

    <b:if cond='data:blog.homepageUrl != data:blog.url'>
      <a class='home-link' expr:href='data:blog.homepageUrl'><data:homeMsg/></a>
      <b:else/>
      <b:if cond='data:newerPageUrl'>
        <a class='home-link' expr:href='data:blog.homepageUrl'><data:homeMsg/></a>
      </b:if>
    </b:if>

  </div>

</b:includable>


</b:widget>                  
</b:section>


</body>
</html>



References:

Official Reference from Blogger:
Layouts: https://support.google.com/blogger/topic/12449?hl=en&ref_topic=1697868
Advance Use: https://support.google.com/blogger/topic/1711140?hl=en&ref_topic=1697868
Next Level tips: https://support.google.com/blogger/answer/3059863?hl=en&ref_topic=1697868

Follow these in order:
http://www.thesimplexdesign.com/2011/07/how-to-make-blogger-template-blogger.html
http://www.thesimplexdesign.com/2011/07/how-to-make-blogger-template-body-and.html
http://www.thesimplexdesign.com/2011/07/how-to-make-blogger-template-header.html
http://www.thesimplexdesign.com/2011/07/how-to-make-blogger-template-inside.html
http://www.thesimplexdesign.com/2011/08/how-to-make-blogger-template-how.html
http://www.thesimplexdesign.com/2011/07/how-to-make-blogger-template-body-and.html
http://www.thesimplexdesign.com/2011/07/how-to-make-blogger-template-data-tags.html
http://www.thesimplexdesign.com/2011/07/how-to-make-blogger-template-data-tags_27.html


Wednesday, January 23, 2013

Implementing dual language feature in PyroCMS/CI?


Implementing dual language (multilingual / multi language) feature in CodeIgniter based PyroCMS?
Our Language Requirements : English / Nepali 

Semicolon Developers are in trouble. All clients we have now are requesting websites in Nepali and English language. CodeIgniter and most of all CodeIgniter based PyroCMS has been our choice of development tool since a long time. Check other posts on echo and you’ll know what I am talking about.

PyroCMS or CI as is are designed to support multilingual feature. But we have yet to figure out what is the best and effective way to implement this.

For now, given the urgency of feature request of our client and our commitment to project deadline we did a little hack for supporting two language in PyroCMS as follows:

General UI and widget blocks or different “titles” are easy to translate by using the default CI Language Class refer here and here for CI.


1) We stored default language in session or initially session could be blank.
2) We used two links to switch language in frontend.

{{ if {session:data name="language"} == 'np' }}
<li><a href="{{ url:site }}language/en">EN</a></li>
{{ else }}
<li><a href="{{ url:site }}language/np">NP</a></li>
{{ endif }}

the /language controller does the magic !

3) Now for the navigation links we created two navigation groups and switched depending upon the language value stored in session.

{{ if {session:data name="language"} == 'np' }}
{{ navigation:links group="header_np" }}
{{ else }}
{{ navigation:links group="header" }}
{{ endif }}   



4)  /language/en or /language/np  can be routed to a function through routes. A function can be used to get specific segment of the url . When it is fetched the necessary session modification can be done on function as:

This modification is done on the session variable (here language)
Finally routing to the base url page as per required

//...controller code
public function language($lang){

if($lang=="en" || $lang=="np") {
$this->session->set_userdata(array('language' => $lang));
}
redirect(base_url());
}

This operation is intended for dual language and can be extended further with required conditional statements.

FYI, this is not a perfect way to build multilingual feature. Problem can arise while dealing with more than two languages. If you have better solution let us know.



Sunday, November 18, 2012

My First take on PyroCMS


What is PyroCMS ?

PyroCMS is a open source framework for content management system created with standard PHP/MVC framework CodeIgniter. It is light and simple to use and is for both the developers and the end users. Generally it is used for websites which contains large amount of content/articles. The content should be well presented to the user for displaying as per requirement . This is where pyrocms comes which can manage the display of those content as per requirement.


How PyroCMS can be customized to develop websites on it ?

PyroCMS provide the dashboard for administration section to be used for developing big content based websites easily.
As it provides various tools/modules for implementing the website design and functionality which are very necessary for the a perfect websites.

Modules such as:

Navigation: It is used for the navigate through out website links.
Blog: This is used for the articles to be posted like blogs, also they can be well surfed by the end users.
Comment: Users and guests can write comments for content published and share their views.
Pages: Add pages to the site with content that are mostly static or vary in time.There are many other modules that can used


Why PyroCMS is better than Wordpress, Drupal and other existing CMSes ?

All of the CMSes have not any fixed and standard framework for using it. Therefore it will be difficult for different developers to interact with various created sites. With pyro we are developing a cms with customized outlook and standard framwork which can be very developer friendly.

What can we do with PyroCMS ?

Being small and flexible, PyroCMS can be very usefull to small and to large content based sites.


What are PyroCMS Themes ? 

Themes are the outlook that are presented to users. It contains the design that can be navigated by the users. PyroCMS provides suitable method to develop the themes. PyroCMS contains main layout and the partials files that make up the single website theme.


How to build PyroCMS themes ?

In PyroCMS Theme are structured in different folders like css for stylesheets files, js for javascripts and views for overall structure of the website. In views folder the main design is kept inside layouts which is the central look . The designs are splitted within the folder called partials which contains the design units like header, footer, sidebar etc.  Also necessary information about the theme and the screenshot is also included for informations.


Lastly, using Pyrocms was very fun to use. It is more similar to CodeIgniter therefore people comfortable with codeIgniter may find it very easy to use. Also it is very useful for customizing our desired look and functionality. Also we should use it very calmly. Despite of few documentations and support i am sure user/develop would find it very handy. 
 

Monday, November 12, 2012

Android asynchronous/synchronous HTTP request

 

////////////////////////OBHttpClient.java /////////////////

package com.semicolondev.baghchal;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.util.ArrayList;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import android.os.Handler;
import android.util.Log;

public class OBHttpClient {
    /** The time it takes for our client to timeout */
    public static final int HTTP_TIMEOUT = 60 * 1000; // milliseconds

    /** Single instance of our HttpClient */
    private HttpClient mHttpClient;
    /** Asynchronous request handler */
    private Handler mHandler;
    public static int METHOD_GET = 1;
    public static int METHOD_POST = 2;
    /**
     * Get our single instance of our HttpClient object.
     *
     * @return an HttpClient object with connection parameters set
     */
    private HttpClient getHttpClient() {
        if (mHttpClient == null) {
            mHttpClient = new DefaultHttpClient();
            final HttpParams params = mHttpClient.getParams();
            HttpConnectionParams.setConnectionTimeout(params, HTTP_TIMEOUT);
            HttpConnectionParams.setSoTimeout(params, HTTP_TIMEOUT);
            ConnManagerParams.setTimeout(params, HTTP_TIMEOUT);
        }
        return mHttpClient;
    }

    /**
     * Performs an HTTP synchronous request to the specified url with the
     * specified parameters of get or post.
     * @param method GET or POST method
     * @param url The web address to post the request to
     * @param postParameters The parameters to send via the request for POST request – null for GET request
     * @return The result of the request as a string
     * @throws Exception
     */
    public String OBrequestHttp(int method, String url, ArrayList<NameValuePair> postParameters) throws Exception {
        BufferedReader in = null;
        try {
            HttpClient client = getHttpClient();
            if(method == METHOD_GET){
                HttpGet request = new HttpGet();
                request.setURI(new URI(url));
                HttpResponse response = client.execute(request);
                in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            }
            else if(method == METHOD_POST){
                HttpPost postrequest = new HttpPost(url);
                UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
                postrequest.setEntity(formEntity);
                HttpResponse postresponse = client.execute(postrequest);
                in = new BufferedReader(new InputStreamReader(postresponse.getEntity().getContent()));
            }
            else{
                return "INVALID METHOD";
            }
            StringBuffer sb = new StringBuffer("");
            String line = "";
            String NL = System.getProperty("line.separator");
            while ((line = in.readLine()) != null) {
                sb.append(line + NL);
            }
            in.close();

            String result = sb.toString();
            //Log.d("Login Response", result);
            return result;
        } catch(Exception e){
            return "REQUEST ERROR";
        }
            finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

/**
     * Performs an HTTP asynchronous request to the specified url with the
     * specified parameters of get or post.
     * @param method GET or POST method
     * @param url The web address to post the request to
     * @param postParameters The parameters to send via the request for POST request – null for GET request
     * @type which url the request has suggested

     * @obaction result send back to the activity

    * @return The result of the request as a string
     * @throws Exception


     */


    public void OBrequestAsyncHttp(final int method, final String urls,final OnlineGameView.url_enumb type,final ArrayList<NameValuePair> formParams,final OBActionResult obaction) {
        if (mHandler == null){
            mHandler = new Handler();
        }
        //Log.i("OB","Thread started for url = " + urls);
        new Thread(new Runnable() {
            public void run() {
                final String restResponse;
                restResponse = requestposturl(method, urls, formParams);
                mHandler.post(new Runnable() {
                    public void run() {
                        obaction.completedWithResult(type, restResponse);
                        //Log.i("OB","Result sent");
                    }
                });
            }

            private String requestposturl(int method, String urls, ArrayList<NameValuePair> formParams) {
                try{
                    //Log.i("OB","Url = " + urls);
                    String response = OBrequestHttp(method,urls, formParams);
                    return response;
                }
                catch(Exception e){Log.i("OB","Something error");return "";}
            }
        }).start();
}
}

 

///////////////OOActionResult.java ///////////////////

package com.semicolondev.baghchal;

public interface OBActionResult {
    public void completedWithResult(String type, String response);   
}

 

////////////////////////mainActivity.java/////////////

public class mainActivity extends Activity implements OBActionResult{

//the request should be done by

OBHttpClient obclient = new OBHttpClient();
        obclient.OBrequestAsyncHttp(OBHttpClient.METHOD_GET, “http://localhost/query”, “login”, null, this);

// and the result will be collected in

@Override
    public void completedWithResult(String urlfrom, String response) {
        Log.i("OB","url = "+urlfrom+" data = " + response);

}

}

Wednesday, November 7, 2012

Android Simple Login Dialogue Box

package com.semicolondev.baghchal;

import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public abstract class test extends Activity
{

protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
LayoutInflater factory = LayoutInflater.from(this);
final View textEntryView = factory.inflate(R.layout.login, null);
final EditText userText = (EditText) textEntryView.findViewById(R.id.login_userID);
final EditText passText = (EditText) textEntryView.findViewById(R.id.login_password);
AlertDialog.Builder builder = new AlertDialog.Builder(this);  
AlertDialog alert;
builder.setMessage("Enter Username and Password")
.setCancelable(true)
.setView(textEntryView)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Log.i("OB","Logging in ..");
try{
String url = "http://192.168.1.16/api/login?userID="+userText.getText().toString().trim()+"&password="+passText.getText().toString().trim();
Log.i("OB","url= "+url);
String response = OBHttpClient.executeHttpGet(url);
Log.i("OB","Response="+response);              // if valid login response ={"res":"success"}
JSONObject resObj = new JSONObject(response);
String resServer = resObj.getString("res");
if(resServer.equals("success")){
Toast.makeText(this,"Login Success", Toast.LENGTH_LONG).show();
Log.i("OB","Success");
}
else{
Toast.makeText(this,"Login Failed", Toast.LENGTH_LONG).show();
Log.i("OB","Invalid");
}
}catch(Exception e){Toast.makeText(this,"Sorry", Toast.LENGTH_LONG).show();}
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {                                                 
}
});
alert = builder.create();
alert.show();

}
}

.... login.xml ....
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dip">
<!--  Email Label -->
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#372c24"
android:text="Username"/>
<EditText android:id="@+id/login_userID"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:layout_marginBottom="20dip"
android:singleLine="true"/>
<!--  Password Label -->
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#372c24"
android:text="Password"/>
<EditText android:id="@+id/login_password"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:singleLine="true"
android:password="true"/>
</LinearLayout>

Tuesday, November 6, 2012

Android HttpClient- Parse JSON


JSON from server:

{"res":"success","click":{"value":[0,2,1,1,1,1,0,2,1,1,1,1,1,0,5,2,1,1,0,0,1,1,1,1,7],"gameID":"5098fac4c96d664f690079d2","turn":"winBagh","goat_count":20,"dead_goat":5,"timestamp":"1352203321097","_id":"5098fc39c96d664f69007a41"}}

try{
postParameters= new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("gameID", online_gameID));
String response = OBHttpClient.executeHttpPost("http://192.168.135.136/json", postParameters);

JSONObject resObj = new JSONObject(response);
Log.i("OB","resObj = " + resObj  );
String resServer = resObj.getString("res");
Log.i("OB","resServer = " + resServer  );

if(resServer.equals("error")){
Toast.makeText(ctx,"Wait for other user move", Toast.LENGTH_LONG).show();
    return false;
}
else{

JSONObject clickObj = resObj.getJSONObject("click");
Log.i("OB","clickObj = " + clickObj  );
String value = clickObj.getString("value").replace("[", "").replace("]", "");
String[] coord = value.split(",");
int[] orgval = new int[25];
for(int i=0; i<25 ; i++)
orgval[i] = Integer.parseInt(coord[i]);
//click.setGameValue(orgval);
click.setClicks(orgval, ((clickObj.getString("turn") == "goat")? 1 : 2), clickObj.getInt("dead_goat"), clickObj.getInt("goat_count"));//, clickObj.getString("timestamp"), clickObj.getString("gameID"));
return true;

}
}
catch(Exception e){
    Toast.makeText(ctx,"Error", Toast.LENGTH_LONG).show();
}

 

© 2013 Echo "Semicolon Developers"; Kathmandu. All rights resevered @ Semicolon Developers Network Pvt. Ltd.. Designed by Templateism

Back To Top