LetsTuneup has grown tremendously, and with it, we’ve introduced new features too. We identified that a few of our users couldn’t use the app to it’s full extent because they didn’t have music on their devices.
We’ve solved that. Users can now pick their favourite artists, powered by a location aware scoring algorithm, which recommends popular artists in their area.
Leading the recommendation list in Mumbai is Arjit Singh, followed by Eminem, Linkin Park, Coldplay and Pink Floyd. Honey Singh is #11 on the chart, and some nostalgic users love Akon, making him #28.
Arjit Singh in the lead, with Eminem, Linkin Park, Coldplay and Pink Floyd following close
Stay tuned and look forward to our next big feature, very soon.
There’s no doubt that music defines us. It influences our moods, for example, making us happy by releasing a chemical named dopamine. It can affect what we wear, what we eat, and perhaps even who we enjoy being together with. It affects our thought process too (it’s well known that ambient noise can improve productivity).
In a study conducted amongst couples who were eighteen years old, it’s been found to predict personality traits. According to the same study, it’s what we’re most likely to discuss about when we meet somebody new, within the first few weeks. Psychologically, men and women who listen to similar music tend to be better communicators, and have longer lasting relationships.
It’s probably one of the most important things in our lives. If I were to place music on Maslow’s hierarchy of needs, I’d place it at the physiological stage. It’s a fundamental part of our society. Even the Hollywood movie directors (e.g. the scene from Interstellar) would agree.
Why not extend this to the social discovery apps we use today? None of them base their core on this. One of the most popular apps for social discovery, Tinder, uses Facebook page likes and interests, to match people together.
This is why Matchbox was created. It bridges the gap between “truly anonymous“, and “hey there“. The app shows you the top ten artists that are common between you and the person you’re looking at, giving you a fair knowledge of what that person would be like:
Matchbox showing the top 10 artists
You’re more likely to be at ease knowing that the opposite person is a little similar to you. Matchbox was crafted with the sole intention that music is the key that connects us, and binds us together. It has evolved for over 9 months, before being made available to the world.
As it stands right now, Matchbox has a hundred active users, and is growing slowly.
Go ahead and test drive the app, and see for yourself how Matchbox re-defines the social discovery platform.
“The Library” is a collection of several popular encyclopedias. It is your one stop for popular game guides and TV show trivia. You can search, and bookmark articles from various encyclopedias.
What’s more? Each time the app is launched, it displays a random featured article from the encyclopedia you last viewed! Explore more about your favourite game/TV show each day.
Popular encyclopedias include:
– Doctor Who
– Assassin’s Creed
– Lord of the Rings
– Mass Effect
– and 42 more!
With this app, you can:
– Read more about your favourite character
– Read about movie plots, and further details
– Game level guides and walk-throughs
– and much more!
We[the CardBox developers], have recently launched a brand new app, CardBox, which allows you to create and instantly share greeting cards for almost any occasion!
CardBox allows you to create cards for the following occasions currently:
Birthdays
Anniversaries
Christmas
New Year’s day
Valentine’s day
Women’s day
Mother’s day
Father’s day
Parents’ day
Grandparents’ day
Halloween
Children’s day
Thanksgiving
Here’s a review from one of our fans:
Creating personalized cards has never been this easy! Be it Christmas or New Year's or birthdays and anniversary wishes, CardBox allows you to custom make your own cute little e-card to send to the world. The app contains a bunch of ready-made cards to use for popular events. You can personalize these by adding in your own text and images. If you are more inclined towards the do-it-yourself cards, you can make your own from scratch as well, with the option to use your own photos, and the tons of font and color options available. One of the features that I appreciate most about CardBox is that it auto-syncs with your Facebook friends' information and sends you reminders of their life events such as birthdays and anniversaries. On the whole, this is a great little app to have just to wish someone on their special day in a very different way.
You have a URI to a resource which is placed in the raw directory inside the Android resources directory, res. Say you want to take that raw resource(let’s say it’s an image) and add it to an attachment using FIleBody to a MultiPartEntity. Both these classes are available in the Apache HTTP Components library. FileBody will only allow you to give it a File object in it’s constructor. Certainly, you are stuck as you have the URI to an Android raw resource, and CANNOT create a File object out of it.
So what’s the solution? Reflection.
private File getFileFromRawResource(Uri rUri) {
String uri = rUri.toString();
String fn;
// I've only tested this with raw resources
if (uri.contains("/raw/")) {
// Try to get the resource name
String[] parts = uri.split("/");
fn = parts[parts.length - 1];
} else {
return null;
}
// Notice that I've hard-coded the file extension to .jpg
// I was working with getting a File object of a JPEG image from my raw resources
String dest = Environment.getExternalStorageDirectory() + "/image.jpg";
try {
// Use reflection to get resource ID of the raw resource
// as we need to get an InputStream to it
// getResources(),openRawResource() takes only a resource ID
R.raw r = new R.raw();
Field frame = R.raw.class.getDeclaredField(fn);
frame.setAccessible(true);
int id = (Integer) frame.get(r);
// Get the InputStream
InputStream inputStream = getResources().openRawResource(id);
FileOutputStream fileOutputStream = new FileOutputStream(dest);
// IOUtils is a class from Apache Commons IO
// It writes an InputStream to an OutputStream
IOUtils.copy(inputStream, fileOutputStream);
fileOutputStream.close();
return new File(dest);
} catch (NoSuchFieldException e) {
Log.e("MyApp", "NoSuchFieldException in getFileFromRawResource()");
} catch (IllegalAccessException e) {
Log.e("MyApp", "IllegalAccessException in getFileFromRawResource()");
} catch (FileNotFoundException e) {
Log.e("MyApp", "FileNotFoundException in getFileFromRawResource()");
} catch (IOException e) {
Log.e("MyApp", "IOException in getFileFromRawResource()");
}
return null;
}
The code is pretty much self-explanatory. Drop a comment if you have any questions/doubts.
I’ve decided to open source the Uncyclopedia app for Android, which some of you may remember was available on the Play store during the first quarter this year.
After performing transformations such as rotation of a bitmap about an arbitrary point, the scale is lost. Of course, this makes sense because the bitmap is rotated inside the same bounds.
To get the real scale now, along with the most reliable degree of rotation, I had to follow this method. Hope it saves the rest of you a night or two.
float[] v = new float[9];
matrix.getValues(v);
// translation is simple
float tx = v[Matrix.MTRANS_X];
float ty = v[Matrix.MTRANS_Y];
// calculate real scale
float scalex = values[Matrix.MSCALE_X];
float skewy = values[Matrix.MSKEW_Y];
float rScale = (float) Math.sqrt(scalex * scalex + skewy * skewy);
// calculate the degree of rotation
float rAngle = Math.round(Math.atan2(v[Matrix.MSKEW_X], v[Matrix.MSCALE_X]) * (180 / Math.PI));
Here’s a quick and easy implementation of Android’s multi touch feature – one finger to move, two to zoom, and three to rotate the image.
Assuming you have a basic understanding of 2D matrix transformations, the Matrix class in Android uses a 3×3 matrix to achieve all of the 2D transformations.
The source code and pre -built APK is available. See the end of this post.
Main activity – MultiTouch.java
package com.multitouch.example;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
public class MultiTouch extends Activity implements OnTouchListener {
// these matrices will be used to move and zoom image
private Matrix matrix = new Matrix();
private Matrix savedMatrix = new Matrix();
// we can be in one of these 3 states
private static final int NONE = 0;
private static final int DRAG = 1;
private static final int ZOOM = 2;
private int mode = NONE;
// remember some things for zooming
private PointF start = new PointF();
private PointF mid = new PointF();
private float oldDist = 1f;
private float d = 0f;
private float newRot = 0f;
private float[] lastEvent = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView view = (ImageView) findViewById(R.id.imageView);
view.setOnTouchListener(this);
}
public boolean onTouch(View v, MotionEvent event) {
// handle touch events here
ImageView view = (ImageView) v;
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
mode = DRAG;
lastEvent = null;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
}
lastEvent = new float[4];
lastEvent[0] = event.getX(0);
lastEvent[1] = event.getX(1);
lastEvent[2] = event.getY(0);
lastEvent[3] = event.getY(1);
d = rotation(event);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
lastEvent = null;
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
float dx = event.getX() - start.x;
float dy = event.getY() - start.y;
matrix.postTranslate(dx, dy);
} else if (mode == ZOOM) {
float newDist = spacing(event);
if (newDist > 10f) {
matrix.set(savedMatrix);
float scale = (newDist / oldDist);
matrix.postScale(scale, scale, mid.x, mid.y);
}
if (lastEvent != null && event.getPointerCount() == 3) {
newRot = rotation(event);
float r = newRot - d;
float[] values = new float[9];
matrix.getValues(values);
float tx = values[2];
float ty = values[5];
float sx = values[0];
float xc = (view.getWidth() / 2) * sx;
float yc = (view.getHeight() / 2) * sx;
matrix.postRotate(r, tx + xc, ty + yc);
}
}
break;
}
view.setImageMatrix(matrix);
return true;
}
/**
* Determine the space between the first two fingers
*/
private float spacing(MotionEvent event) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
/**
* Calculate the mid point of the first two fingers
*/
private void midPoint(PointF point, MotionEvent event) {
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
/**
* Calculate the degree to be rotated by.
*
* @param event
* @return Degrees
*/
private float rotation(MotionEvent event) {
double delta_x = (event.getX(0) - event.getX(1));
double delta_y = (event.getY(0) - event.getY(1));
double radians = Math.atan2(delta_y, delta_x);
return (float) Math.toDegrees(radians);
}
}
An important function that is always used is postXx(). This function concats a new matrix of the type Xx to the existing matrix object. Using setXx() will reset the matrix’s Xx property.
Main layout – main.xml