Showing posts with label by. Show all posts
Showing posts with label by. Show all posts

The new Training Center professional development by and for educators

| 0 comments |


(Cross-posted on the Google for Education Blog.)

Editors note: Twenty thousand educators from around the world will share ideas, tips, and trends for the upcoming year when they gather at ISTE, one of the largest education technology conferences in the world. If you’ll be in Philadelphia, come visit us in the Expo Hall at #1808. You can learn more about the new Training Center and check out any of over 50 short sessions that will share more ways to engage and inspire students.

Technology can transform education, but only when it enables and supports amazing educators. Effective professional development is thus a crucial part of creating real positive change and preparing students for the future. For this reason, we’re proud to introduce the new Google for Education Training Center, a free, interactive, online platform that helps educators apply Google’s tools in the classroom and beyond.


Professional development has long been a challenge for educators and administrators. A 2015 survey by the American Federation of Teachers found that the "adoption of new initiatives without proper training or professional development" was the primary reason for workplace stress, with 71% of respondents citing it. This is why we worked closely alongside educators to design professional development tools that fit the needs of their peers.

“We didn’t need another help center with how-to articles; we needed to start where teachers start, with learning objectives, classroom tasks and teaching strategies,” said Jay Atwood, EdTech coordinator at Singapore American School and project lead for the Training Center’s lesson creation. “With the new Training Center, we do just that.”

The Training Center provides interactive lessons with a practical classroom focus, allowing educators and administrators to customize their learning paths by choosing fundamental or advanced courses. Each course is organized around three themes:


Educators can access different units and lessons in any order they prefer. After completing either the fundamentals or advanced course, educators can then distinguish themselves as Google Certified Educators, Level 1 or Level 2.

The lessons support different skill sets, grade levels, content specialties, capacities and interests. “I thought I was pretty knowledgeable about Google, but in each session I learned something new,” says Carla Jones, a teacher at Cook Elementary School in Chicago, IL who previewed the Training Center content. “I learned tips and strategies that I could immediately use in my classroom, and each session got me super excited about how to make my classroom more tech integrated.”

Chicago Public Schools (CPS), the third largest school district in the United States with more than 600 schools and 400,000 students, worked with Google for Education as a launch partner for the new Training Center. CPS will use the Training Center as an integral part of its technology professional development program, and teachers’ time spent on Training Center courses will count toward their professional development hours.

“The new Google for Education Training Center empowers teachers to drive their own learning and track their progress,” says Donna Román, EdTech instructional specialist at CPS. “It combines differentiated content, flexible pace and application with the collaborative magic of Google Apps for Education in a supportive learning environment.”

The Training Center reflects what we value most about education, focusing on the process of learning rather than the tools themselves. “The Training Center was carefully designed around good pedagogy and instructional practices,” explains Mark Hammons, EdTech coordinator at the Fresno County Office of Education and a contributor to the platform. “Not only will teachers learn how to use Google Apps, but they will also learn how to apply them meaningfully in the classroom.”

To learn more about the Training Center, visit g.co/edutrainingcenter and try out a lesson or two.
Read More..

Lookup manufacturer info by MAC address using www macvendorlookup com API

| 0 comments |
Last post show how to "Retrieve IP and MAC addresses of Android WiFi tethering clients from /proc/net/arp". This example show how to get vendor/manufacturer info of the associated MAC addresses.

(You can download runnable APK from link on bottom)


http://www.macvendorlookup.com/api provide API to lookup MAC Address Vendor/Manufacturer info.

Notice that this example havent handle error condition.


MainActivity.java
package com.blogspot.android_er.androidlistclient;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

Button btnRead;
TextView textResult;

ListView listViewNode;
ArrayList<Node> listNote;
ArrayAdapter<Node> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnRead = (Button)findViewById(R.id.readclient);
textResult = (TextView)findViewById(R.id.result);

listViewNode = (ListView)findViewById(R.id.nodelist);
listNote = new ArrayList<>();
ArrayAdapter<Node> adapter =
new ArrayAdapter<Node>(
MainActivity.this,
android.R.layout.simple_list_item_1,
listNote);
listViewNode.setAdapter(adapter);

listViewNode.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Node node = (Node) parent.getAdapter().getItem(position);
Toast.makeText(MainActivity.this,
"MAC: " + node.mac + " " +
"IP: " + node.ip + " " +
"company: " + node.company + " " +
"country: " + node.country + " " +
"addressL1: " + node.addressL1 + " " +
"addressL2: " + node.addressL2 + " " +
"addressL3: " + node.addressL3 + " " +
"type: " + node.type + " " +
"startHex: " + node.startHex + " " +
"endHex: " + node.endHex + " " +
"startDec: " + node.startDec + " " +
"endDec: " + node.endDec,
Toast.LENGTH_SHORT).show();
}
});

btnRead.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new TaskReadAddresses(listNote, listViewNode).execute();
}
});
}



class Node {
String ip;
String mac;

String jsonBody;
String startHex;
String endHex;
String startDec;
String endDec;
String company;
String addressL1;
String addressL2;
String addressL3;
String country;
String type;

String remark;

String queryString = "http://www.macvendorlookup.com/api/v2/";

Node(String ip, String mac){
this.ip = ip;
this.mac = mac;
queryMacVendorLookup();
}

@Override
public String toString() {
return "IP: " + ip + " " + "MAC: " + mac + " " + company + " " + remark;
}

private String sendQuery(String qMac) throws IOException{
String result = "";

URL searchURL = new URL(queryString + qMac);

HttpURLConnection httpURLConnection = (HttpURLConnection) searchURL.openConnection();

if(httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK){
InputStreamReader inputStreamReader = new InputStreamReader(httpURLConnection.getInputStream());
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader,
8192);

String line = null;
while((line = bufferedReader.readLine()) != null){
result += line;
}

bufferedReader.close();
}

return result;
}


private void ParseResult(String json){

try {
JSONArray jsonArray = new JSONArray(json);
JSONObject jsonObject = (JSONObject) jsonArray.get(0);
startHex = jsonObject.getString("startHex");
endHex = jsonObject.getString("endHex");
startDec = jsonObject.getString("startDec");
endDec = jsonObject.getString("endDec");
company = jsonObject.getString("company");
addressL1 = jsonObject.getString("addressL1");
addressL2 = jsonObject.getString("addressL2");
addressL3 = jsonObject.getString("addressL3");
country = jsonObject.getString("country");
type = jsonObject.getString("type");
remark = "OK";

} catch (JSONException e) {
e.printStackTrace();
remark = e.getMessage();
}

}

private void queryMacVendorLookup(){
try {
jsonBody = sendQuery(mac);
ParseResult(jsonBody);
} catch (IOException e) {
e.printStackTrace();
}
}
}

private class TaskReadAddresses extends AsyncTask<Void, Node, Void> {

ArrayList<Node> array;
ListView listView;

TaskReadAddresses(ArrayList<Node> array, ListView v){
listView = v;
this.array = array;
array.clear();
textResult.setText("querying...");
}

@Override
protected Void doInBackground(Void... params) {
readAddresses();

return null;
}

@Override
protected void onPostExecute(Void aVoid) {
textResult.setText("Done");
}

@Override
protected void onProgressUpdate(Node... values) {
listNote.add(values[0]);
((ArrayAdapter)(listView.getAdapter())).notifyDataSetChanged();

}

private void readAddresses() {

BufferedReader bufferedReader = null;

try {
bufferedReader = new BufferedReader(new FileReader("/proc/net/arp"));

String line;
while ((line = bufferedReader.readLine()) != null) {
String[] splitted = line.split(" +");
if (splitted != null && splitted.length >= 4) {
String ip = splitted[0];
String mac = splitted[3];
if (mac.matches("..:..:..:..:..:..")) {
Node thisNode = new Node(ip, mac);
publishProgress(thisNode);
}
}
}

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}


layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout

android_layout_width="match_parent"
android_layout_height="match_parent"
android_padding="16dp"
android_orientation="vertical"
tools_context="com.blogspot.android_er.androidlistclient.MainActivity">

<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_gravity="center_horizontal"
android_autoLink="web"
android_text="http://android-er.blogspot.com/"
android_textStyle="bold" />

<Button
android_id="@+id/readclient"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_textAllCaps="false"
android_text="Read Ip/MAC addresses"/>

<TextView
android_id="@+id/result"
android_layout_width="match_parent"
android_layout_height="wrap_content"/>

<ListView
android_id="@+id/nodelist"
android_layout_width="match_parent"
android_layout_height="wrap_content"/>
</LinearLayout>


uses-permission of "android.permission.INTERNET" is needed in AndroidManifest.xml

download filesDownload runnable APK .

Next:
- Get HostName of WiFi hotspot clients, and check if it is still connected.

Read More..

The Truth About Kernels and Battery Life by flar2

| 0 comments |
When it comes to Android kernels, the number one topic of discussion these days is battery life. But there are many myths about the relationship between kernel and battery life. At one extreme, there are those who make outrageous claims about radical changes to battery life minutes or hours after installing a kernel. At the other extreme are those who think the kernel makes absolutely no difference at all to battery life. The truth lies somewhere in the middle.

Before we get to the “truth” of the matter, I want to clarify a few things.

First, the kernel does not “drain” battery. Many times, a user installs a kernel and then reports back soon after that the kernel has caused massive battery drain (and probably also something to the effect that the kernel is crap and the dev should burn in hell for his efforts). To prove it, they post screenshots from battery monitoring apps showing “kernel” as the major source of drain. This is very misleading. On Android devices, the kernel provides a mechanism for keeping the phone awake, called a wakelock. Processes running on the device (e.g. apps and services) can ask the kernel for a wakelock, and the kernel will oblige. So yes, the kernel is technically keeping the phone awake, but only because an app or service has asked it to. It is these apps and services that are misbehaving and causing drain, not the kernel.

But that is not to say the kernel does not cause any battery drain. It still uses memory and does work, but the amount it uses is exceedingly small compared to the Android system, apps and services. There are also special hardware cases, such as the sweep2wake feature on the Nexus 5, which requires that the LCD panel remain powered on in order to work. This drains more battery than if the device were suspended normally, but still does not cause “massive” drain. On the Nexus 5, sweep2wake adds roughly 2% per hour drain while the screen is off. Not insignificant, but far less than the phone normally uses while the screen is on. Because of this, a strong myth has developed, claiming that sweep2wake and doubletap2wake cause battery drain. Except for the Nexus 5, it is just that, a myth. On the vast majority of devices, the battery drain from sweep2wake is negligible, usually something zero and 0.5% per hour, which would “cost” no more than 5% battery usage over the course of a workday. A perfectly acceptable trade-off for the convenience.

The second thing I want to clarify pertains to measurement. How do we measure battery life? I like to look at percent usage per hour. Many battery monitoring apps can give you this statistic, but you have to pay attention and set custom time points if you want to distinguish the stats further and really understand battery usage. If you do want to measure and compare, make sure you do so under similar conditions. And you must do so over a reasonable time period, which means days rather than hours. If you have some routines where you use the same apps every day, this would be a good way to test and compare. The battery monitor in EX Kernel Manager automatically provides the two statistics I will now talk about: idle drain and active drain.

Idle drain is battery drain while the screen is off. During screen off, the phone spends most of its time in “deep sleep”. Sometimes, it wakes up to do some background work, like syncing email or checking for updates. These would be examples of the system, apps or services “asking” the kernel to stay awake while they perform their tasks. If all is working correctly, when they finish, the device goes back to sleep. Idle drain should be measured over several hours to get an accurate picture. A good time to measure it is overnight while you aren’t using your device (if you are not a dev and actually get to sleep). On most devices, idle drain ranges from about 0.2% per hour to 0.8% per hour on a stock setup with default options (i.e., with no battery saving measures in place) on a normal WiFi connection. On some devices, kernel optimizations can shave a bit off this number. But only a tiny bit, generally in the range of 0.1% to 0.3% improvement over stock. This is not going to make a huge difference to battery life. As already mentioned, sometimes hardware features like sweep2wake can eat up about the same amount. So as we can see, a kernel offers relatively little improvement here, but then again, every bit counts. Another factor that influences idle drain is your network connection, particularly cellular connection. A poor signal will often result in a bit of extra drain. But this should not cause excessive drain during idle, and will mostly make a difference while you are using the data connection. I should add that many of the battery saving measures people take also make little difference here. As long as your idle drain is below 1% per hour, don’t even worry about it. If it’s more than 1% per hour, look at your apps and services. Occasionally, there will be a big batch of updates that cause a bit of extra drain. It happens.

Active drain is the amount of battery used while the screen is on. That is, while you are using your device. Active drain is obviously much greater than idle drain. The phone is on, the screen is on, and it is doing work using the CPU, GPU, memory, modem, wifi, disk, etc. Active drain varies quite a bit from device to device. A lot of times we hear about “screen-on time”. Active drain, measured in % per hour can be translated easily into screen-on time. Active drain of 12.5% per hour is extremely good and will equate to about 8 hours of screen time. Drain of 25% per hour will get you about 4 hours of screen time. See how that works?

Screen-on time (hours) = 100 / Active drain (% per hour)

This does not take into account the small amount of battery use while the screen is off. Assuming idle drain is about 0.6% per hour, you would lose about 6% in ten hours, or around 14% in a 24 hour period. You can subtract that from 100 in the equation above.

Now we’re getting into the truth of the matter. What influences active drain? Many
things. Network (especially cellular) connection makes a difference. Poor signal means it has to work harder to transmit and receive data. The type of apps you are using makes a difference. Obviously playing a graphics-intensive game will use far more battery than reading some email. Using the camera, especially flash, will cause more drain than texting. The point is, what you do with your device has, by far, the biggest influence on battery life. Something like changing your web browser could have a significant impact on battery life, perhaps a greater impact than any kernel or battery saving tweaks floating around on the Internet. Bottom line: Active drain will vary from user to user, even with the same device!

There is, however, one part of the kernel that has a significant influence on active drain, and therefore can have a big impact on screen-on time. This is the CPU governor. This is why kernel developers spend a lot of time tweaking governors. It’s about frequency usage, which you can measure with an app like CPU Times. The CPU governor controls frequency scaling according to system load. While not busy, the CPU will stay at its lowest frequency, which uses the least energy. When there is work to do, the CPU governor ramps up the frequency so the work can be completed faster and the user can enjoy a smooth experience. A good governor is responsive, quickly responding to changes in system load, to prevent lag, but also quickly returning to the lowest frequency to save energy.


There is an idea called “race to idle” which suggests the governor should immediately ramp up to the highest frequency so tasks can be completed as quickly as possible, and consequently, the CPU can more quickly return to a lower power state. This logic is generally sound, but with modern processors, there may be a negligible time difference for completing a task using the highest frequency available compared to a frequency somewhere in the middle. In other words, it may be a waste of energy to ramp up to the highest frequency when a somewhat lower frequency may complete the task in essentially the same amount of time, and return to an idle state. The highest frequency will use more energy than the moderate frequency, and there may be very real battery savings when this is repeated thousands or millions of times per day. The trick is to find frequencies that are “fast enough” to create a feeling of snappiness for the user, without constantly ramping up to the highest frequency. I could write a whole other essay on governors, so for now I will leave it at that. It will suffice to say that different governors will behave differently, and have different battery use characteristics. Therefore, the kernel really does have an impact on battery life.

There are other aspects of the kernel that impact battery life too. Chief among these is task scheduling, particularly the aspect where tasks are assigned to one CPU core or another. This means a CPU may be “woken up” to perform a task, or tasks may be packed onto the same core. Another is hotplugging. There is an energy cost to put CPU cores on or offline. On many devices, you will hear about the evils of mpdecision, a closed-source binary from Qualcomm that controls hotplugging and often includes a “touchboost” feature that overrides the CPU governor. Many custom kernels disable mpdecision and implement a custom hotplugging driver. My own testing has found that mpdecision and its excessive touchboosting generally do not have a major impact on battery life, and I have left it enabled in most of my kernels. In some recent devices, such as the Nexus 6 and the HTC One m9, there is no hotplugging during normal use. All CPU cores are online. It can’t be said that task scheduling, hotplugging and touchboost have no impact on battery life. They clearly do. It’s just not going to make a huge difference. If we think of the impact of these optimizations in terms of active drain (% per hour), the change will be relatively small, probably less than one percent per hour, which would be measured in minutes of screen-on time over the course of a day. I think the impact of these optimizations is more apparent on older devices that are less power efficient and have smaller batteries.

I will mention quickly one more topic that always comes up in discussions of battery life: undervolting. Again, undervolting probably made a bigger difference on older devices. Devices released in the past year or two have become considerably more power efficient, some even have automatic fine tuning and scaling of voltages. I remember working on msm8960 devices that used the same voltage for every CPU frequency. In a case like that, undervolting could make quite a difference. Recent devices run with much lower voltages, and chips are binned with tighter tolerances, leaving less headroom for undervolting and reducing the battery impact of undervolting. On some devices I offered automatic undervolting, but only for the lowest frequency, which is the most-used frequency.

Much more could be said on this topic, but the main point I wanted to make is that the kernel does, indeed, make a difference in battery life, but the difference is often not as dramatic as some like to think. From the kernel’s perspective, the CPU governor will have the biggest impact on battery life. Many of the things that people obsess about do not make a big difference in battery life. Finally, if you want to judge battery life, take a scientific approach. Try to use the same conditions when making comparisons, measure carefully, and give it some time.

- flar2

This article was originally posted by its author on elementalx.org and Android Revolution blog has been given a permission to re-publish the article.

Do you have any questions or comments? Feel free to share! Also, if you like this article, please use media sharing buttons (Twitter, G+, Facebook) below this post!


For latest news follow Android Revolution HD on popular social platforms:

Read More..

Display WiFi Hotspot clients by cat proc net arp

| 0 comments |
This example display WiFi Hotspot connected clients (with IP and MAC address) by Linux command "cat /proc/net/arp", using ProcessBuilder.

(You can download runnable APK from link on bottom)

Tethering OFF, as WiFi client.

Tethering ON, with no client connected.

Tethering ON, with two clients connected; Nexus 7 and Raspberry Pi + WiFi dongle.

But, after any client disconnected, the /proc/net/arp will not updated immediately; I dont know how long it will refresh. One way to update arp is turn OFF and ON tethering again.

Tested on unrooted Xiaomi Redmi 2 running Android 4.4.4.

MainActivity.java
package com.blogspot.android_er.androidlistclient;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.IOException;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity {

Button btnRead;
TextView textResult;

//String[] args = {"/system/bin/cat", "/proc/net/arp"};
String[] args = {"cat", "/proc/net/arp"};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnRead = (Button)findViewById(R.id.readclient);
textResult = (TextView)findViewById(R.id.result);

btnRead.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textResult.setText(toRead());
}
});
}

private String toRead()
{
ProcessBuilder cmd;
String result="";

try{
cmd = new ProcessBuilder(args);

Process process = cmd.start();
InputStream in = process.getInputStream();
byte[] re = new byte[1024];
while(in.read(re) != -1){
System.out.println(new String(re));
result = result + new String(re);
}
in.close();
} catch(IOException ex){
ex.printStackTrace();
}
return result;
}
}


layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout

android_layout_width="match_parent"
android_layout_height="match_parent"
android_padding="16dp"
android_orientation="vertical"
tools_context="com.blogspot.android_er.androidlistclient.MainActivity">

<TextView
android_layout_width="wrap_content"
android_layout_height="wrap_content"
android_layout_gravity="center_horizontal"
android_autoLink="web"
android_text="http://android-er.blogspot.com/"
android_textStyle="bold" />

<Button
android_id="@+id/readclient"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_textAllCaps="false"
android_text="Read /proc/net/arp"/>

<TextView
android_id="@+id/result"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_typeface="monospace"
android_textSize="12sp"/>
</LinearLayout>


download filesDownload runnable APK .

This example display arp in human readable format, but not for machine. Next post "Retrieve IP and MAC addresses from /proc/net/arp" get it in more machine readable.

Read More..

Computer respond to this email Introducing Smart Reply in Inbox by Gmail

| 0 comments |


(Cross-posted on the Gmail Blog.)

With the holidays approaching and emails coming in at a furious pace, we can all use a little help. Inbox is already on hand assisting you with the next step, organizing your trips, and even suggesting reminders.

But when youre checking email on the go, it can be cumbersome and time-consuming to reply to all or even some of them. What if there was a way for your inbox to guess which emails can be answered with a short reply, prepare a few responses on your behalf and present them to you, one tap away?

Well, starting later this week, Inbox will do just that with Smart Reply.
Smart Reply suggests up to three responses based on the emails you get. For those emails that only need a quick response, it can take care of the thinking and save precious time spent typing. And for those emails that require a bit more thought, it gives you a jump start so you can respond right away.
Theres actually a lot going on behind the scenes to make Smart Reply work. Inbox uses machine learning to recognize emails that need responses and to generate the natural language responses on the fly. If youre interested in how Smart Reply works, including how researchers got machine learning to work on a data set that they never saw, you can read more about it on the Google Research Blog.

And much like how Inbox gets better when you report spam, the responses you choose (or dont choose!) help improve future suggestions. For example, when Smart Reply was tested at Google, a common suggestion in the workplace was "I love you." Thanks to Googler feedback, Smart Reply is now SFW :)

Smart Reply will be rolling out later this week on both Google Play and the App Store in English. If youve got a lot of emails on your plate, nows a great time to try Inbox and get through them faster than ever.



Read More..

Server rooms totally eclipsed by the cloud

| 0 comments |

Every day, thousands of companies switch off their on-premise servers and move to the cloud. And more than five million businesses around the world have taken that shift to the cloud by moving to Google Apps, including Woolworths, BBVA, Roche and PwC.

But one big question remains unanswered: what’s going to happen to all those dark, windowless little server rooms?

We teamed up with PDM International, an interior design consultancy, to propose a few ideas for how those rooms could be used today. This is what they envisioned.
Karaoke at lunch anyone?


The salad bar just got real.


Play ALL the games!




The servers are gone. It’s time to reclaim the office.

Read More..

Download Theme Nokia Belle by AJ23 for Nokia 5800 N97 and X6

| 0 comments |
Nothing can beat this new theme called Nokia Belle by AJ23. This theme from AJ23 is for Symbian S60 5th edition based mobiles. This theme is exclusively designed by AJ23 with support of all resolutions. This theme is 100% SVG with nice Anna icons.



This theme works simply great. You will hardly find such good themes for your phones. This theme is beautifully designed with 389 modified icons. Nokia Belle theme by AJ23 is available in both custom and default icons version.



This theme works with Nokia 5800 XpressMusic, 5530 XpressMusic, N97, N97 Mini, X6, 5228, 5230, 5233 and 5235. Get both the versions of this theme with default and custom icons from the following download link.

Theme Nokia Belle by AJ23 for Nokia 5800 XpressMusic and N97 (1.8 MB)
Related Posts:
Read More..

Download Theme Quills by Kallol v5 for Nokia 5800 N97 and X6

| 0 comments |
Quills by Kallol v5 is one of the beautiful theme to have on your Symbian S60 5th edition mobile phones from Nokia such as Nokia 5800 XpressMusic, 5530 XpressMusic, N97, N97 Mini, X6, 5228, 5230, 5233 and 5235. Its a gray color theme with very nice graphics on homescreen.


Quills theme by Kallol comes with beautifully designed custom icons. These custom icons and background graphics matches so well. The theme is lightweight and fully transparent. You can download this theme from the following link.

Theme Quills by Kallol v5 for Nokia 5800 XpressMusic and N97 (3.7 MB)
Related Posts:
Read More..