We were looking for an application to get notified when new Amazon Goldbox and Lightning deals were available. After reviewing many deals apps we could not find any the did this, so we created one. Daily Deals will keep you up to date on the latest Amazon Goldbox, Amazon Lightning deals, buy.com deal of the day, Woot deals, and yugster deal of the day.  You can enable notifications for lightning deals and you will be notified when the lightning deals change through out the day. We also created a nice home screen widget for the GoldBox deal. We use this app everyday and it fits our needs perfectly, hopefully it will work for you too. To download the app you can search for goldbox deal in the market app on your phone or install from the market online here

   

 

Post to Twitter Tweet This Post

Receive compressed json with Android app

Posted July 18th, 2011. Filed under Applications

There are times that you want to query a server from your android application and bring back JSON to process, at times this JSON can be large and you want to make the call as quick as possible. The easiest way to do this is to allow the server to compress your JSON response before sending it to you which will extremely reduce the size of the data being sent to the phone. Here is a quick sample of calling a webservice that returns compressed JSON and processing the result

 

public void getUpdates() {
 
    HttpClient httpclient = new DefaultHttpClient();
    HttpGet httpget = new HttpGet("http://yourservice.com/api/stores.json");
 
    // you have to tell the server that you can handle zipped response
    httpget.addHeader("Accept-Encoding", "gzip");
 
    HttpResponse response;
 
    try {
        response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            InputStream instream = entity.getContent();
            String result;
            // check if we got a compressed resonse back
            if (entity.getContentEncoding() != null && "gzip".equalsIgnoreCase(entity.getContentEncoding().getValue())){
                result =  uncompressInputStream(instream);
            } else {
                result = convertStreamToString(instream);
            }
 
            ObjectMapper mapper = new ObjectMapper(); 
            mapper.getSerializationConfig().setDateFormat(sdf);
            JsonStoreResult jsonResult = mapper.readValue(result, JsonStoreResult.class);
 
            for (JsonStore e : jsonResult.getStores()) {
                // store this object or do something with it
 
            }
        }
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
 
private String uncompressInputStream(InputStream inputStream) throws IOException {
    StringBuilder value = new StringBuilder();
 
    GZIPInputStream gzipIn = null;
    InputStreamReader inputReader = null;
    BufferedReader reader = null;
 
    try {
        gzipIn = new GZIPInputStream(inputStream);
        inputReader = new InputStreamReader(gzipIn, "UTF-8");
        reader = new BufferedReader(inputReader);
 
        String line = "";
        while ((line = reader.readLine()) != null) {
            value.append(line + "\n");
        }
    } finally {
        try {
            if (gzipIn != null) {
                gzipIn.close();
            }
 
            if (inputReader != null) {
                inputReader.close();
            }
 
            if (reader != null) {
                reader.close();
            }
 
        } catch (IOException io) {
 
            io.printStackTrace();
        }
 
    }
 
    return value.toString();
}
 
private String convertStreamToString(InputStream is) {
   BufferedReader reader = new BufferedReader(new InputStreamReader(is));
   StringBuilder sb = new StringBuilder();
 
   String line = null;
   try {
       while ((line = reader.readLine()) != null) {
           sb.append(line + "\n");
       }
   } catch (IOException e) {
       e.printStackTrace();
   } finally {
       try {
           is.close();
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
   return sb.toString();
}

Post to Twitter Tweet This Post

We have put an update out today that adds favorites to our FREE Mall of America app called MegaMall MN. Now you can mark any store as your favorite for quick access from the store list. On the store list you can easily switch between viewing all stores and your favorite stores. The update was submitted today so we expect it will be approved and available tomorrow or Tuesday. Here are a few screen shots of the new features

 

Post to Twitter Tweet This Post

Bank It! FREE Game for Android

Posted February 20th, 2011. Filed under Applications

Bank It! is a FREE, fun and challenging game to test your ability to bank a disc in the goal. Use your geometry skills to figure out the best angle to throw the disc so it hits 3 banks before going in the goal, but watch out 4 banks and your disc will explode!!. Awesome graphics, blazing lights, and lots of fun. Openfeint game network is built in so you can compare your high score with your friends and unlock achievements. You can play the classic game or try to beat the clock in ‘time attack’ mode. You get 60 seconds to get as many bankshots as you can. Very addictive game that is hard to put down!! The ultimate bank shot game.

Post to Twitter Tweet This Post

Available just in time for Valentine’s Day!

Conversation Hearts for iPhone and iPod Touch is now available! Standard version is FREE and like the Android version, allows custom messages to be added to a candy heart via a digital confectionery process. You can upgrade the app via in-app purchases to add additional heart options and remove ads. Feel free to contact us to suggest new heart types and possible combinations!

ConversationHearts iphone Available now in App Store!

Post to Twitter Tweet This Post

TwistByte recently released pair of light-hearted application specifically for Valentine’s Day!  Conversation Hearts is a free application and allows you make create custom conversation hearts and share them via a variety of outlets, including social media and image services.  A variety of sizes and colors are available to you for experimentation and fun.  Conversation Hearts Plus (0.99) adds several custom heart options, including rose, crown, dog, bling and more!  In addition Conversation Hearts Plus removes ads and helps support further revisions and future heart options.

So what are you waiting for?  I’m sure there is someone in your life that would LOVE a custom conversation heart right now!  Don’t wait until Valentine’s Day, spread the love today! Go grab “Conversation Hearts” or “Conversation Hearts Plus” in the Android Market today!

Post to Twitter Tweet This Post

We have added one of the most asked for features to our FREE Mega Mall MN Android application, current and upcoming events scheduled at the Mall of America®. Now while shopping at MOA you can browse all the events going on that day (or future) quickly and easily with Mega Mall MN. The list is updated from our server so it will always be current with up to date event information.

Another feature we added is a ‘Special Deals’ section that allows retailers at the mall to make you aware of any special deals they have going on while you are visiting

Search ‘Megamall in MN’ or ‘Mall of America’ in market or scan the following barcode

Post to Twitter Tweet This Post

NEW – Now you can see your current location by choosing the store you are near. This will allow you to see where you are in relation to where you want to go.  We opted for choosing your location because the 3G and GPS are very unreliable in the mall and would not work all the time.

This is a store guide for the Megamall in Bloomington, MN, otherwise known as the Mall Of America. You can filter stores by category, floor, or direction/location. You can tap on a store name and see the location of the store on a map of the Mall along with your current location on the map. This is perfect for finding the stores you are looking for quickly or just discovering new stores in the categories you are interested in. Includes shopping list feature so you can keep track of those Black Friday deals and Holiday gifts!

This is a FREE application and you can grab it now by searching for ‘Mall of America’ in the market or scan the following bar code using bar code scanner

Post to Twitter Tweet This Post

Megamall in MN (Mall Of America) iPhone App

Posted December 16th, 2010. Filed under Applications

“Megamall in MN” is a store guide for the Mall Of America® in Bloomington, MN. Filter stores by category, floor, direction and location. Select store to see where it is located on a map of the mall. Includes shopping list feature so you can keep track of those holiday gift ideas. See it in itunes here

Post to Twitter Tweet This Post

Android ListView with fast scroll and section index

Posted December 3rd, 2010. Filed under Tutorial

This small tutorial will show you how to create a ListView, enable fast scrolling, and create a alphabetical section list that displays the letter as you quickly scroll the list.

First lets create a layout file with a ListView in it list this

<?xml version="1.0" encoding="utf-8"?>
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:background="@drawable/background">
 
    <ListView
            android:id="@+id/thelist"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scrollbars="vertical"
            android:fadingEdge="vertical"
            android:cacheColorHint="#00000000"
            android:fastScrollEnabled="true"
            android:padding="2dp">
    </ListView>
</LinearLayout>

Notice I am putting a background image on the layout and setting the ListView to be transparent with the cacheColorHint. I also set fastScrollEnabled to true.

Now I have a store object to store the attributes about a store

public class Store {
 
    public int id;
    public String name;
    public String direction;
    public int floor;
    public String address;
    public String category;
    public String phone;
}

finally we need to create the Activity. We will assign a custom ArrayAdapter to the list and the custom ArrayAdapter will implement SectionIndexer

/**
 * The Store List Activity
 */
public class StoreListActivity extends Activity {
    private DBAdapter db;
 
    private LinkedList<Store> storeList = new LinkedList<Store>();
    private StoreListAdaptor storeListAdaptor;
 
    private ListView list;
 
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.storelist);
 
        list = (ListView) findViewById(R.id.thelist);
 
        // populate the store list
        storeList = db.getAllStoresOrderByName(storeList);
 
        // create an adaptor with the store list
        storeListAdaptor = new StoreListAdaptor(this,storeList);
 
        // assign the listview an adaptor
        list.setAdapter(storeListAdaptor);
 
    }
 
    /**
     * The List row creator
     */
    class StoreListAdaptor extends ArrayAdapter<Store> implements SectionIndexer{
 
        HashMap<String, Integer> alphaIndexer;
        String[] sections;
 
        public StoreListAdaptor(Context context, LinkedList<Store> items) {
            super(context, R.layout.storerow, items);
 
            alphaIndexer = new HashMap<String, Integer>();
            int size = items.size();
 
            for (int x = 0; x < size; x++) {
                Store s = items.get(x);
 
		// get the first letter of the store
                String ch =  s.name.substring(0, 1);
		// convert to uppercase otherwise lowercase a -z will be sorted after upper A-Z
                ch = ch.toUpperCase();
 
		// HashMap will prevent duplicates
                alphaIndexer.put(ch, x);
            }
 
            Set<String> sectionLetters = alphaIndexer.keySet();
 
	    // create a list from the set to sort
            ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); 
 
            Collections.sort(sectionList);
 
            sections = new String[sectionList.size()];
 
            sectionList.toArray(sections);
        }
 
       public View getView(int position, View convertView, ViewGroup parent) {
            // expand your row xml if you are using custom xml per row
       } 
 
       public int getPositionForSection(int section) {
           return alphaIndexer.get(sections[section]);
       }
 
       public int getSectionForPosition(int position) {
           return 1;
       }
 
       public Object[] getSections() {
            return sections;
       }
    }
}

Hope this helps

Post to Twitter Tweet This Post