New apps!

I think both apps are ready!

Auto Respond:

The only thing I didn’t finish is adding the new settings to individual schedules. To tell the truth, I’ve just been too lazy to do it.

Change Log:

  • Fixed a bug with “Silence Ringer” option
  • Fixed a bug with “Desk Dock Response Message” in “Dock Settings” screen
  • Fixed a bug which caused the “OK” button on the main settings screen to disappear on orientation change
  • Made responding to text messages optional
  • Changed some more “Cancel” buttons to “OK”
  • Added Analytics to learn how users interact with the app
  • Added “Share App” option to menu
Tic Tac Toe:
It’s done! Roughly 36 hours after I started, I have a playable version of Tic Tac Toe with 3 difficulties:
  • Easy – chooses a random number, and if the spot is free, it moves there. If not, it chooses again until it finds an empty spot
  • Medium – If it can win, it wins. If it can block, it blocks. Otherwise, same random number scheme
  • Impossible – If you can win (not tie, actually win) I did something wrong.
I have a very simple icon for it, and some basic graphics… nothing too amazing it’s Tic Tac Toe!
I do still need to add some advertisements to it, just to attempt to bring in some small amounts of cash, but that’s quick and easy.
Neither of these have been released yet, but I will likely upload them late tonight or early tomorrow.

New App: Tic-Tac-Toe

Yesterday I started some initial work on a new app. This is actually something that I already have programmed as a DOS based C++ program, I just need to build a GUI and translate the code from C++ to Java.

Background
In college I received a project to build a Tic-Tac-Toe game. That was the only requirement… build a working Tic-Tac-Toe game. There was extra credit involved if you were able to make your game unbeatable. For those who don’t know, by using the correct logic while playing, it is possible to never allow your opponent to win a game of Tic-Tac-Toe, their only choices are lose or tie.

After completing the project, our professor told us that had we even made a working game that was  two human players, without a computer player aspect, we still would have gotten full credit, due to the vague requirement specification of the project.

I didn’t need the extra credit (I already had above 100% in the class due to all of the extra credit he offered) but I was bored and wanted the challenge, so I made my game unbeatable. I later ended up modifying it to give it 3 difficulties: Easy, Medium, and Impossible.

Difficulties
Easy simply picks a random spot to move into. If that spot is already taken, it generates another random spot, and so on until it finds one that’s empty and moves into it.

Medium checks to see if it can win, or if you can win. If it can win, it wins. If you can win, it attempts to block you. If neither player is in a position to win, it falls back to the random location.

Impossible uses a HUGE amount of nested if statements (72 if I recall correctly) (correction – the 72 nested if statements were for a different game. This one actually only has about 20 if statements for the computer logic) to make sure that either the computer wins or the game ends as a tie. You cannot defeat impossible difficulty. (At least, not that I know of. Feel free to try to prove me wrong when I release the app!)

Where I am Now
So far I have only begun work on this. I spent some time yesterday working on the initial user interface. It starts with a selection of 1 player or 2 players, if you select 1 player it takes you to a selection of difficulty.

After that, so far nothing happens. I haven’t even looked at my old code yet to start implementing game play.

I will begin working on this as well as Auto Respond, and will hopefully have a product available soon(ish)! (I still need to work on the graphics even. You know, the icon and whatnot.)

More Progress

Unfortunately, I wasn’t able to program at all this weekend. I wasn’t feeling well, and had a lot to do on top of that. (The hockey game sucked, but my brother’s gf threw him a surprise 30th birthday and that was fun.)

I did however get to do some programming last night. I was able to build in the optional text response. The former “Phone Options” menu is now called “Main Options”, and has the added option of “Respond to Text Messages”. This new option defaults on, as that is the main function of the app for the majority of users.

As I stated earlier, one of the three options on that page MUST be enabled… the app won’t let you leave the screen without having one of them enabled:

  1. Respond to Text Messages
  2. Respond to Calls
  3. Silence Ringer
One of those MUST be active, otherwise the app is basically useless.

In other news, I’ve squashed a couple more bugs (that I didn’t know existed until last night when I was coding):

  • Fixed a bug with “Silence Ringer” option
  • Fixed a bug with “Desk Dock Response Message” in “Dock Settings” screen
  • Fixed a bug which caused the “OK” button on the main settings screen to disappear on orientation change
These are documented in the full changelog, which is linked in the Play Store listing.
I still have a few things to finish before I release a new version. Here’s what I would like to accomplish before releasing a new version:
  • Add some more settings to schedules
    • ringer settings (silent/vibrate/app default)
    • response settings (respond to text/call/both/neither/app default)
  • Add analytics to Pro version
These are relatively small changes and shouldn’t take long to complete. I should be able to finish them up tonight.
I realize these are both changes that only apply to the pro version, but I don’t want to release the update to the free version prior to release an updated pro version. Also (as I did yesterday) I sometimes find, and fix, bugs in code that I’m not necessarily actively working on. So if I find such a bug while working on code for the pro version, I can fix it in the free version before releasing it.
Bottom line: a new version should only be a couple days away! 🙂

App Idea

I was going to pitch a new app idea to you guys, but as I was writing I realized I could actually just build it into Auto Respond instead.

I said last post that this app would be useless if both “Respond to texts” and “Respond to calls” were disabled…. but that’s not entirely true. I also have an option to “Silence Ringer”. If both respond options are turned off, Auto Respond could act like a “Quiet Hours” app.

After realizing this, I have decided that I AM going to allow the user to turn off both response settings, but only if the silence option is active. Basically, at least one of the 3 of those options (respond to texts, respond to calls, or silence ringer) has to be enabled… and if none of them are, THEN the app would be useless.

I am also going to add some new things to schedules also… you will be able to set each individual schedule to use the default app ringer options (set in the app settings), make no changes to the ringer, or silence/vibrate the ringer. Also, for each schedule I am going to add the options for responding to texts/calls. These will likely have the same kind of choices… use the app default setting, enabled, or disabled.
For new and existing schedules, these will default to “Use app default”, since that’s what they are doing now.

This will make it so that you can actually create a schedule for quiet hours. Don’t want to be disturbed when you’re sleeping? Simple, set up a schedule for when you normally sleep and set it to  silence the ringer when it’s enabled. Don’t sleep at the same time every night/day? Set up a generic schedule with the “silence ringer” option enabled, keep the schedule disabled, and use the manual “start” and “stop” buttons when you go to sleep and wake up.

As a note – I have not written ANY of the code to actually do this yet… it’s just an idea right now. But it shouldn’t be difficult to implement. If it’s easy enough, I may actually have it included in my next update.

Request for Auto Respond

Someone today posted a review with a request that responding to text messages become optional, like responding to phone calls is. I have actually been thinking about doing this for quite some time, and will spend a bit of time making it a reality soon.

I plan on changing around the settings screens a bit, to make it so that the two options are actually on the same page. I want to do this so that you cannot disable BOTH options at the same time. The app is useless if both options are disabled.

If you aren’t following me on Twitter (I’ve actually posted more about it on FB than anything, but w/e) you might not know that I’ve been sick for a few days. I didn’t go to work today, and I actually slept almost all day. I’m feeling much better after a day off, (and MUCH sleep) and I’m hoping to be back to 100% soon. If I do get better I plan on doing some programming this weekend. Unfortunately, this is a busy weekend. I’m going to a hockey game tomorrow night and, because of the playoffs, football is on both Saturday and Sunday this weekend. So I may not spend as much time as a usual weekend session, but this option addition is a simple thing that I should be able to push out in no time. (Sorry, I enjoy my football.)

I still have some other things to finish, like adding analytics to the paid version, but when they are all completed I’ll release an update. Hopefully that update will come this weekend or early next week.

If you have requests, PLEASE let me know. I’d prefer it not be in a review, because I may not see those immediately (or ever, if a lot of people end up leaving reviews simultaneously.) You can leave requests here in my blog or contact me on Twitter, Google+, or by email. My Twitter, Google+ and Email address are all available in the app description on Google Play, and are also in the app under the “Credits” screen in the menu.

One last thing:
All of the reviews that I HAVE received, on both versions, have been 5 stars. THANK YOU for that! I am trying to keep everyone happy (including myself) and sometimes that’s not an easy thing to do. But you guys seem to appreciate the work that I’ve put into this app, and I’m thankful for that. Keep the reviews coming!! 🙂

As always, any requests or issues, please let me know and I will look into it!

What I’ve been working on

As I’ve said before, I’m a casual programmer, and therefore take breaks occasionally. The past week or 2 have been one of those breaks.

Most of my time recently has been on getting my Nexus 10, replacing my N10, rooting my N10… I think you see the trend. (And the holidays just passed, so there was some extra time with family/friends in there too.)

I have done a SMALL amount of programming in that time… I played with Google Analytics a bit to see some of the things that can be done there. So far I have only built it into the free version, but will likely be copying that work into the paid version before I release the next update (and adding to it, since there are parts of the app that are not accessible in the free version.)

With analytics I am collecting the following:

  • Screen views
    • What screens the user views, how many times each screen is viewed, and how much time is spent on each screen
    • This includes basic screens as well as settings screens
  • Clicks
    • How many times each button is clicked
    • How many times list items are clicked
      • List items include your list of preset messages, do-no-respond list contacts, and in the paid versions, schedules.
      • This does not send any information about what information is IN the list item, just the fact that you clicked it, and what type of list item it was (a message, a schedule, etc.)
    • How many times list items are long-clicked
      • See above item
    • How many times list items are edited/deleted from the long-click menu
      • See above item
Things that have not been built in, but likely will be before I release an update:
  • Settings
    • What settings are being changed, and how the settings are being used
  • How often the response message is changed
    • Again, no information about what the message contains will be sent, only the fact that the message has been changed
Things that are NOT collected as part of this process:
  • Any kind of identifying information
    • Things like age, gender, name, account names, passwords, etc. will NOT be collected from analytics, or in any other manner, and never will be.
“Personal” information that IS collected:
  • Location
    • When I was doing my testing Google Analytics was able to tell me what town I was in, probably based on IP address.
    • This is NOT an exact location. I can NOT see that you are using my app in McDonald’s on Main Street in New Orleans (I don’t know if such a thing even exists, it was just a collection of random places) I can only see that the app is being used in New Orleans.
    • I most likely will not do anything with this information, aside from possibly seeing which countries use that app the most.
Just an FYI – this is information that probably 90% of apps out there are collecting, so I am not doing anything that other developers aren’t already doing. The only thing that I’m doing different is that I’m being 100% straight up about the information that I will be collecting. No fine print, it’s all right here in a public blog in an easy to read bullet list.
I have also found an easy way to exclude my own devices from this collection. I don’t care how I interact with the app…. I KNOW how I interact with the app… what I want to know is how my USERS interact with the app, and what features/settings they use the most.
I will use this information to improve the features that are used most often.

Also on the list of changes I have made:

  • changed some more “Cancel” buttons into “OK” buttons
    • I kept some as “Cancel” when it made sense
  • Added a “Share App” option to the menu
    • This will open a share dialog, where you can share a link to the app in the Play Store via any installed app that receives a share intent (Facebook, Twitter, Messaging, email, etc.)
I have not really been working on any new features, just small improvements. The next new feature that I will work on (when I decide to start working on new stuff again) is the ability to send personalized responses to specific individuals. I talked about this in one of my previous posts. It’s the ONLY feature request that I’ve received from users, and I’ve had multiple people ask for it.
Personally, I’d like to get a widget working first. But nobody seems too worried about that right now except me, so I’ll put that on the back burner. (Plus I’ve tried a couple times already, and been unsuccessful with it.)
As usual: Any requests, comments, concerns, etc…. you know where to find me. I’d especially like to get some feedback on what you think of the analytic information I’m going to collect. So if you have anything to say about it, feel free to leave a comment.

Idea for Retail POS Developers

Alright, before we get started here, I know what some of you are thinking… “POS, who are you calling a POS!?”

If you aren’t in the acronym business, and aren’t familiar with the retail world, a POS system in retail is a Point Of Sale system. (Not the more common use of the acronym: Piece Of S#!+)

In retail, the POS system is used for all purchases, returns, price checks, etc. Now on to my point.

When I was looking for my N10, I ran into the issue that, even within the same retailer, there often wasn’t an accurate depiction of stock on the item. I went to one Walmart, and they told me another store had 1 on stock. Luckily, I got there and there was actually 2 there. (I ended up with both eventually… see the story about the N10 replacement for details.)

This got me thinking… I worked in retail for a couple years, and we often had similar issues. Usually it was the other way around though. An item would show available, and it wasn’t there. 90% of the time this meant that there had been a return and the item was “in stock” because it had been returned, but it wasn’t able to be put back on the shelf (Much like my N10) or it just hadn’t been restocked yet, and an employee would have to retrieve it from the Customer Service desk (which is a lot less of an issue, at least it’s available for purchase.)

So, here’s a simple solution: (POS programmers, I hope you’re listening!)
When returning an item, make an option for “restock”. I was thinking on my way in to work… what’s the best way to do this? You could make it a checkbox, but the Customer Service representative (CS rep) will likely ignore that box 90% of the time. As a former CS rep, I know that a lot of what you do is habit, so you will eventually get in the habit of seeing the box, knowing that 90% of items will be restocked, and clicking it. So how do you FORCE the CS rep to interact with it properly? I came up with a few ways:

  • Make that box default to on
    • Unfortunately, that makes it still optional. The user is NOT FORCED to interact with it at all. Although 90% of the time it will be correct even if ignored, habit still kicks in.
  • Make it 2 radio buttons, one for “yes”, one for “no”
    • If no choice is made, cannot move forward, FORCING a click
    • again, habit kicks in. 90% of returns will be restocked, so the clerks will most likely click the “yes” box by habit.
  • Make it a Y/N input
    • This will FORCE the user to put something in the box. If the box is empty, you cannot continue.
I have noticed, in my personal life, that clicking seems to be an easier habit to form than typing. Therefore, the Y/N box seems to be the best implementation in my opinion. You have to type something in the box (unlike the checkbox) and you have to think about what key to press, not just instinctively click a mouse button (unlike the radio button.)
I’ll make this even easier for you, developers, and write some sudo code for you:
If (restock)
{
    add item back into inventory

    //the actual code will likely be something like this:
    //getItem(SKU).addInventory(1);

    //where SKU is obtained by scanning the UPC code or manually entering the SKU number

}
else
{
    mark for RMA

    //something like:
    //getItem(SKU).addRMAFlag(1);
    //or
    //getItem(SKU).setRMAFlag(true);

    //in the back end, this will set a boolean flag for RMA, or add a count of RMAs to that item

}
Now, human error still occurs, and habit is still a possibility. Luckily, there is already a part of that system to take something out of inventory if it has been returned or is otherwise damaged (or whatever) and needs to be returned to the manufacturer. Keep that system around, in case it’s needed, and add a flag for your backroom employees for the RMA procedure. If an item was marked for RMA and is actually able to be restocked…. simple, clear the RMA flag. 
The else statement for “mark for RMA” shouldn’t actually DO the RMA procedure, just mark the item that an RMA needs to be done. Clearing that flag needs to be available anyway. After the RMA is processed, you’ll need to clear the flag. So if an RMA is not actually necessary, you can clear the flag the same way.
This all seems so simple to me, but I have not worked with a POS system to date that had this kind of functionality. I have been out of retail for roughly 10 years, so someone MAY have come up with this already but, as far as I can tell from a customer point of view, this seems to still be an issue.
Go ahead POS developers… steal my idea. Use it. PLEASE. I would LOVE it if you gave me credit somewhere for the idea but, since I’ve made this public, I guess that part is optional. But I am not about to go write my own POS system, so feel free to add this to yours.

Nexus 10 Replacement – An underdog story

In case you don’t want to read all of this, I’ll start with the bottom line: honesty is NOT always the best policy.

As most of you know from my previous post(s), I purchased a Nexus 10 from Walmart on Christmas eve. It was the normal $499.99, same as the Play Store would charge. I was having fun with it, playing Grand Theft Auto Vice City, looking at what ROMs are available, etc.

A few days after buying it, I walked in the door to my apartment with the tablet in hand, bent over to take my shoes off, and the tablet slipped out of my hand. The screen basically shattered. The tablet fell maybe 2 feet, but the problem is that it landed on its side then crashed face down onto a hard floor.

I didn’t do anything immediately, figured I’d take care of it in a few days…. fast forward “a few days”. This past Friday, I wasn’t feeling well. Called into work, called the doctor, made an appointment, and figured “while I’m out, might as well take my tablet back to Walmart and get a replacement.” I was sadly mistaken with that assumption.

Went to the doc, did some tests, found nothing. she said I probably had a virus that starts with a sore throat and ends with a cold, since that’s what’s been going around. OK cool, not totally sick, just not feeling well. Went to Walmart.

Walked into Walmart, told them what happened, it wasn’t the store I had originally purchased it from and I didn’t have the receipt, they claimed it was out of the 15 day return period, so they told me to go through the manufacturer.

When I get home, I go onto the play store to call Google. They say they don’t fix N10s, Samsung does. They gave me a number to call Samsung. Their tech support says, we don’t do replacements. Let me transfer you. He transfers me.
“This department only handles phones. Let me transfer you to tablets.”
“Oh, this is carrier tablets, let me transfer you to wifi tablets.”
“We don’t support the Nexus, Google does, let me transfer you.”
“That’s a Samsung device, they handle that.”
…I think you see about how this went.

I did this for 2 hours until I got “OK, let me make a repair ticket for you. You will be charged for this repair, because it’s a non-warranty repair.”
I said “That’s fine, I just want it fixed. I’ll pay if I need to.”
“OK, the ticket is created, here’s the ticket number, let me transfer you. Give them your ticket number when they answer and they’ll go from there. *transfer*
*give ticket number* “Oh, this is a wifi tablet, this is the carrier tablet department”…. guess what comes next…. “Let me transfer you.”
*transfer*
*robotic voice* “Please wait.” *15 second pause* “Please wait” *few more seconds* *click*

Now I’m beyond upset. Walmart won’t help, Google won’t help, Samsung won’t help.
Back to Walmart. They say go to the store I got it from, they may be able to do something. On the way to the other store, I realized the receipt is in the bag… which happens to be in my back seat.

I then go into Walmart #2, tell them what happened, show them the receipt, we realize it’s only been 11 days, not 15… they’re about to exchange it! Until they realize the charger is not in the box. I say “We can just pull the charger out of the other box and you can send me home without a charger”
“I have to check with my manager before I do that”
A bunch of arguing between me and managers… turns out they won’t replace it because it’s “neglect” and their return policy won’t cover that. I offer to buy the replacement plan that they offer. (That nobody offered me with my original purchase, but had been mentioned at this point)
“I’ll even buy it on THIS tablet, do the exchange, and buy it again on THE NEW tablet. That’s $90 in your pocket to do an exchange.” ($45 per plan)
Come to find out, the replacement policy doesn’t cover neglect for items over $150. It’s only an extension of the manufacturer’s warranty, and doesn’t even take effect until AFTER the end of the manufacturer’s warranty. So basically, it’s useless to me.

Went home, bothered Samsung and their support team on Twitter, they asked me for a ticket number, I gave it to them.

ADDENDUM: another customer at Walmart told me to take it to another Walmart and claim that I received it broken, so I went home, flashed a factory image and relocked the bootloader. So if I do make that claim, it appears as if I had never even turned on the tablet.

Saturday – I reached out to Samsung Support via Twitter again, they say “That ticket was closed. Your warranty does not cover physical damage but you can call 1-888-987-4357 to discuss repair options.” Awesome. Did some more back and forth with them and got nowhere.

Called the number, told the guy I want to speak with a supervisor. Told him I am willing to pay for a repair, I just want this issue taken care of. Of course, there is no supervisor available, so I’m stuck. Eventually the guy tells me about their repair place, gives me their number, tells me how to get Google to work with me (he tried contacting Google multiple times, but their phone number continually hangs up after the “Please wait”) and he was actually more helpful than anyone else up to this point.

Call it quits for the day.

Sunday morning – (This is where the honesty part comes in)
Went up to Walmart #3. Took the tablet to Customer Service, told them “I opened the box, and it was cracked like this.” roughly 5 minutes later, walk out with a gift card (WOO HOO! About time!)

Went back to Walmart #2 (original place of purchase) use gift card to get the last N10 in stock.

(I’m sure there’s a few small and semi-important details that I left out, but that’s the majority of the story.)

Lessons learned:

  1. Buying a Nexus device from anywhere other than the play store seems to be a bad idea. Nobody wants to support it. (If I had a Google Play order number I could have done the replacement on-line from the Play Store.)
  2. Samsung support does not know what they are talking about, and enjoys tossing people around their phone support like a hot potato
  3. If you’re going to buy a Nexus 10, buy a case. (I have one on the way from Amazon.)
  4. Walmart’s “replacement plan” is useless on items over $150
  5. And most importantly – honesty is NOT always the best policy. A return policy is the best policy. (I tried being honest and it got me nowhere.)
ADDENDUM: For the record, I will refuse to buy another Samsung product in the future, and will no longer be pushing for others to purchase ANY Samsung device. The lack of customer service that they provided was staggering, and I would not wish that experience upon anyone.
Prior to this experience, I was the main reason that friends and family purchased items such as the SGS3 (my brother, his girlfriend AND a college friend all bought this on my recommendation) and the Nexus 10 (my mom bought one because of my recommendation) and I’m sure there are other examples. Samsung has lost a powerful ally in this battle, and have turned me into a powerful enemy.

Don’t buy a Nexus 10

Just don’t do it. I dropped mine, cracked the screen and have now spent over 2 hours on the phone trying to get the right department to repair/replace the thing.

I first went to Walmart where I bought it. They wouldn’t replace it because it’s been 15 days, and their return policy is 14. Then called Google, but they wouldn’t help me because I bought it at Walmart, not on the Play Store. Then I called Samsung… about 10 times. Transfer, promise to get it taken care of, transfer, promise, transfer, promise, transfer, promise, over and over again.

I have NEVER been this upset about trying to get a product replaced IN MY LIFE. I have LITERALLY lost count of how many people I have spoken to on the phone between Google and Samsung. (I lost count somewhere around 10.)

It has been FIFTEEN DAYS! I should be able to quickly get a replacement for this, or at least quickly get approved for one if there are no replacements immediately available.

Sorry Samsung, I LOVE my Galaxy Nexus, I LOVED my Nexus 10 (for the 10 days or so before the screen cracked) but I will NEVER buy another device from you after this Customer Service fiasco.

UPDATE:
A couple things:
1) Walmart ALMOST replaced it for me, after going there 4 times and realizing somewhere in there that it had only been 11 days, not 15. But in the end they decided not to because I caused the damage.
2) I reached out to Samsung support on Twitter, and THEY responded so maybe they will do something. We’ll see.

At this point I’ll be glad to even PAY to have it repaired, but Samsung pushed me around so much… I ALMOST got a service ticket to pay to get it fixed, but not quite.

Still developing…