In Phimpme Android application, users can edit their pictures and share them to a number of platforms ranging from social networking sites like Facebook, Twitter etc to cloud storage and image hosting sites like Box, Dropbox, Imgur etc.
Desired flow of the application
According to the flow of the application, the user has to add an account first i.e. log in to the particular account that needs to be connected to the application. After that when the user enters the share page for sharing the image, a button corresponding to the connected account is visible in that page which on clicking will share the image to that platform directly.
What was happening previously?
The list of accounts which is present in the account manager of Phimpme Android application is also getting displayed in the share image page. As the list is large, it is difficult for the user to find the connected account from the list. There is not even an indicator whether a particular account is connected or not. On clicking the button corresponding to the non-connected account, an error dialog instructing the user to log in from the account manager first, will get displayed.
How we solved it?
We first thought of just adding an indicator on the buttons in the accounts page to show whether it is connected or not. But this fix solves only a single issue. Find the connected account in that large list will be difficult for the user even then. So we decided to remove the whole list and show only the accounts which are connected previously in account manager. This cleans the flow of the accounts and share in Phimpme Android application
When a user logins from the account manager, the credentials, tokens and other details corresponding to that accounts gets saved in database. We used realm database for saving the details in our application. As the details are present in this database, the list can be dynamically generated when the user opens share image page. We implemented a function in Utils class for getting the list of logged in accounts. Its implementation is shown below.
public static boolean checkAlreadyExist(AccountDatabase.AccountName s) { Realm realm = Realm.getDefaultInstance(); RealmQuery<AccountDatabase> query = realm.where(AccountDatabase.class); query.equalTo("name", s.toString()); RealmResults<AccountDatabase> result1 = query.findAll(); return (result1.size() > 0); } public static ArrayList<AccountDatabase.AccountName> getLoggedInAccountsList(){ ArrayList<AccountDatabase.AccountName> list = new ArrayList<>(); for (AccountDatabase.AccountName account : AccountDatabase.AccountName.values()){ if (checkAlreadyExist(account)) list.add(account); } return list; }
Additional changes
There are few accounts which don’t need authentication. Those accounts need their respective application to be installed in the user’s device. So for adding those accounts to the list, we added another function which checks whether a particular package is installed in user’s device or not. Using that it adds the account to the list. The implementation for checking whether a package is installed or not is shown below.
public static boolean isAppInstalled(String packageName, PackageManager pm) { boolean installed; try { pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES); installed = true; } catch (PackageManager.NameNotFoundException e) { installed = false; } return installed; }
Resources:
- Official documentation about Realm queries https://realm.io/docs/java/latest/
- StackOverFlow discussion on checking if a package is installed or not https://stackoverflow.com/questions/11392183/how-to-check-programmatically-if-an-application-is-installed-or-not-in-android