/*
* Copyright (C) 2014 Saravan Pantham
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.jams.music.player.LauncherActivity;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Map;
import org.apache.commons.io.FileUtils;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.analytics.tracking.android.EasyTracker;
import com.google.analytics.tracking.android.Fields;
import com.google.analytics.tracking.android.MapBuilder;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.jams.music.player.R;
import com.jams.music.player.Helpers.TypefaceHelper;
import com.jams.music.player.InAppBilling.IabHelper;
import com.jams.music.player.InAppBilling.IabResult;
import com.jams.music.player.InAppBilling.Inventory;
import com.jams.music.player.InAppBilling.Purchase;
import com.jams.music.player.MainActivity.MainActivity;
import com.jams.music.player.MiscFragments.TrialFragment;
import com.jams.music.player.Services.BuildMusicLibraryService;
import com.jams.music.player.Utils.Common;
import com.jams.music.player.WelcomeActivity.WelcomeActivity;
public class LauncherActivity extends FragmentActivity {
public Context mContext;
private Common mApp;
public Activity mActivity;
public static String mAccountName;
static final int REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR = 1002;
public static IabHelper mHelper;
protected static final String ITEM_SKU = "com.jams.music.player.unlock";
protected static final String ITEM_SKU_PROMO = "com.jams.music.player.unlock.promo";
private static final String CAMPAIGN_SOURCE_PARAM = "utm_source";
protected boolean mPurchased;
protected boolean mPurchasedPromo;
private boolean mExplicitShowTrialFragment;
public static TextView buildingLibraryMainText;
public static TextView buildingLibraryInfoText;
private RelativeLayout buildingLibraryLayout;
private Handler mHandler;
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppThemeNoActionBar);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_launcher);
mContext = this;
mActivity = this;
mApp = (Common) mContext.getApplicationContext();
mHandler = new Handler();
//Increment the start count. This value will be used to determine when the library should be rescanned.
int startCount = mApp.getSharedPreferences().getInt("START_COUNT", 1);
mApp.getSharedPreferences().edit().putInt("START_COUNT", startCount+1).commit();
//Save the dimensions of the layout for later use on KitKat devices.
final RelativeLayout launcherRootView = (RelativeLayout) findViewById(R.id.launcher_root_view);
launcherRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
try {
int screenDimens[] = new int[2];
int screenHeight = 0;
int screenWidth = 0;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
//API levels 14, 15 and 16.
screenDimens = getTrueDeviceResolution();
screenWidth = screenDimens[0];
screenHeight = screenDimens[1];
} else {
//API levels 17+.
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
display.getRealMetrics(metrics);
screenHeight = metrics.heightPixels;
screenWidth = metrics.widthPixels;
}
int layoutHeight = launcherRootView.getHeight();
int layoutWidth = launcherRootView.getWidth();
int extraHeight = screenHeight - layoutHeight;
int extraWidth = screenWidth = layoutWidth;
mApp.getSharedPreferences().edit().putInt("KITKAT_HEIGHT", layoutHeight).commit();
mApp.getSharedPreferences().edit().putInt("KITKAT_WIDTH", layoutWidth).commit();
mApp.getSharedPreferences().edit().putInt("KITKAT_HEIGHT_LAND", layoutWidth - extraHeight).commit();
mApp.getSharedPreferences().edit().putInt("KITKAT_WIDTH_LAND", screenHeight).commit();
} catch (Exception e) {
e.printStackTrace();
}
}
});
//Build the music library based on the user's scan frequency preferences.
int scanFrequency = mApp.getSharedPreferences().getInt("SCAN_FREQUENCY", 5);
int updatedStartCount = mApp.getSharedPreferences().getInt("START_COUNT", 1);
//Launch the appropriate activity based on the "FIRST RUN" flag.
if (mApp.getSharedPreferences().getBoolean(Common.FIRST_RUN, true)==true) {
//Create the default Playlists directory if it doesn't exist.
File playlistsDirectory = new File(Environment.getExternalStorageDirectory() + "/Playlists/");
if (!playlistsDirectory.exists() || !playlistsDirectory.isDirectory()) {
playlistsDirectory.mkdir();
}
//Disable equalizer for HTC devices by default.
if (mApp.getSharedPreferences().getBoolean(Common.FIRST_RUN, true)==true &&
Build.PRODUCT.contains("HTC")) {
mApp.getSharedPreferences().edit().putBoolean("EQUALIZER_ENABLED", false).commit();
}
//Send out a test broadcast to initialize the homescreen/lockscreen widgets.
sendBroadcast(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME));
Intent intent = new Intent(this, WelcomeActivity.class);
startActivity(intent);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
} else if (mApp.isBuildingLibrary()) {
buildingLibraryMainText = (TextView) findViewById(R.id.building_music_library_text);
buildingLibraryInfoText = (TextView) findViewById(R.id.building_music_library_info);
buildingLibraryLayout = (RelativeLayout) findViewById(R.id.building_music_library_layout);
buildingLibraryInfoText.setTypeface(TypefaceHelper.getTypeface(mContext, "RobotoCondensed-Light"));
buildingLibraryInfoText.setPaintFlags(buildingLibraryInfoText.getPaintFlags() |
Paint.ANTI_ALIAS_FLAG |
Paint.SUBPIXEL_TEXT_FLAG);
buildingLibraryMainText.setTypeface(TypefaceHelper.getTypeface(mContext, "RobotoCondensed-Light"));
buildingLibraryMainText.setPaintFlags(buildingLibraryMainText.getPaintFlags() |
Paint.ANTI_ALIAS_FLAG |
Paint.SUBPIXEL_TEXT_FLAG);
buildingLibraryMainText.setText(R.string.jams_is_building_library);
buildingLibraryLayout.setVisibility(View.VISIBLE);
//Initialize the runnable that will fire once the scan process is complete.
mHandler.post(scanFinishedCheckerRunnable);
} else if (mApp.getSharedPreferences().getBoolean("RESCAN_ALBUM_ART", false)==true) {
buildingLibraryMainText = (TextView) findViewById(R.id.building_music_library_text);
buildingLibraryInfoText = (TextView) findViewById(R.id.building_music_library_info);
buildingLibraryLayout = (RelativeLayout) findViewById(R.id.building_music_library_layout);
buildingLibraryInfoText.setTypeface(TypefaceHelper.getTypeface(mContext, "RobotoCondensed-Light"));
buildingLibraryInfoText.setPaintFlags(buildingLibraryInfoText.getPaintFlags() |
Paint.ANTI_ALIAS_FLAG |
Paint.SUBPIXEL_TEXT_FLAG);
buildingLibraryMainText.setTypeface(TypefaceHelper.getTypeface(mContext, "RobotoCondensed-Light"));
buildingLibraryMainText.setPaintFlags(buildingLibraryMainText.getPaintFlags() |
Paint.ANTI_ALIAS_FLAG |
Paint.SUBPIXEL_TEXT_FLAG);
buildingLibraryMainText.setText(R.string.jams_is_caching_artwork);
initScanProcess(0);
} else if ((mApp.getSharedPreferences().getBoolean("REBUILD_LIBRARY", false)==true) ||
(scanFrequency==0 && mApp.isScanFinished()==false) ||
(scanFrequency==1 && mApp.isScanFinished()==false && updatedStartCount%3==0) ||
(scanFrequency==2 && mApp.isScanFinished()==false && updatedStartCount%5==0) ||
(scanFrequency==3 && mApp.isScanFinished()==false && updatedStartCount%10==0) ||
(scanFrequency==4 && mApp.isScanFinished()==false && updatedStartCount%20==0)) {
buildingLibraryMainText = (TextView) findViewById(R.id.building_music_library_text);
buildingLibraryInfoText = (TextView) findViewById(R.id.building_music_library_info);
buildingLibraryLayout = (RelativeLayout) findViewById(R.id.building_music_library_layout);
buildingLibraryInfoText.setTypeface(TypefaceHelper.getTypeface(mContext, "RobotoCondensed-Light"));
buildingLibraryInfoText.setPaintFlags(buildingLibraryInfoText.getPaintFlags() |
Paint.ANTI_ALIAS_FLAG |
Paint.SUBPIXEL_TEXT_FLAG);
buildingLibraryMainText.setTypeface(TypefaceHelper.getTypeface(mContext, "RobotoCondensed-Light"));
buildingLibraryMainText.setPaintFlags(buildingLibraryMainText.getPaintFlags() |
Paint.ANTI_ALIAS_FLAG |
Paint.SUBPIXEL_TEXT_FLAG);
initScanProcess(1);
} else {
//Check if this activity was called from Settings.
if (getIntent().hasExtra("UPGRADE")) {
if (getIntent().getExtras().getBoolean("UPGRADE")==true) {
mExplicitShowTrialFragment = true;
} else {
mExplicitShowTrialFragment = false;
}
}
//initInAppBilling();
launchMainActivity();
}
//Fire away a report to Google Analytics.
try {
if (mApp.isGoogleAnalyticsEnabled()==true) {
EasyTracker easyTracker = EasyTracker.getInstance(this);
easyTracker.send(MapBuilder.createEvent("Jams startup.", // Event category (required)
"User started Jams.", // Event action (required)
"User started Jams.", // Event label
null) // Event value
.build());
}
} catch (Exception e) {
e.printStackTrace();
}
}
private int[] getTrueDeviceResolution() {
int[] resolution = new int[2];
try {
Display display = getWindowManager().getDefaultDisplay();
Method mGetRawH = Display.class.getMethod("getRawHeight");
Method mGetRawW = Display.class.getMethod("getRawWidth");
int rawWidth = (Integer) mGetRawW.invoke(display);
int rawHeight = (Integer) mGetRawH.invoke(display);
resolution[0] = rawWidth;
resolution[1] = rawHeight;
} catch (Exception e) {
e.printStackTrace();
}
return resolution;
}
private void initScanProcess(int scanCode) {
//Start the service that will start scanning the user's library/caching album art.
mApp.setIsBuildingLibrary(true);
buildingLibraryLayout.setVisibility(View.VISIBLE);
if (scanCode==0) {
Intent intent = new Intent(this, BuildMusicLibraryService.class);
intent.putExtra("SCAN_TYPE", "RESCAN_ALBUM_ART");
startService(intent);
mApp.getSharedPreferences().edit().putBoolean("RESCAN_ALBUM_ART", false).commit();
} else if (scanCode==1) {
Intent intent = new Intent(this, BuildMusicLibraryService.class);
intent.putExtra("SCAN_TYPE", "FULL_SCAN");
startService(intent);
mApp.getSharedPreferences().edit().putBoolean("REBUILD_LIBRARY", false).commit();
}
//Initialize the runnable that will fire once the scan process is complete.
mHandler.post(scanFinishedCheckerRunnable);
}
private Runnable scanFinishedCheckerRunnable = new Runnable() {
@Override
public void run() {
if (mApp.isBuildingLibrary()==false) {
launchMainActivity();
} else {
mHandler.postDelayed(this, 100);
}
}
};
/*private void initInAppBilling() {
String base64EncodedPublicKey = "";
base64EncodedPublicKey = Common.uid4 +
Common.uid2 +
Common.uid6 +
Common.uid1 +
Common.uid3 +
Common.uid5;
mHelper = new IabHelper(this, base64EncodedPublicKey);
try {
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
//In-app billing could not be initialized.
mApp.getSharedPreferences().edit().putBoolean("TRIAL", true).commit();
checkTrialStatus();
} else {
//In-app billing was initialized successfully.
mHelper.queryInventoryAsync(mGotInventoryListener);
}
}
});
} catch (Exception e) {
e.printStackTrace();
checkTrialStatus();
}
}*/
/*IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
if (result.isFailure()) {
//Couldn't query in-app purchases.
checkTrialStatus();
mApp.getSharedPreferences().edit().putBoolean("TRIAL", true).commit();
} else {
//Check if the user bought the unlocker.
mPurchased = inventory.hasPurchase(ITEM_SKU);
mPurchasedPromo = inventory.hasPurchase(ITEM_SKU_PROMO);
}
//If the developer (yours truly) is using the app, skip the trial process.
final AccountManager accountManager = AccountManager.get(mContext);
final Account[] accounts = accountManager.getAccountsByType("com.google");
boolean developerEdition = false;
for (int i=0; i < accounts.length; i++) {
if (accounts[i].name.equals("jamsmusicplayer@gmail.com")) {
developerEdition = true;
}
}
if (mPurchased==true || mPurchasedPromo==true || developerEdition==true) {
//The user bought the app.
mApp.getSharedPreferences().edit().putBoolean("TRIAL", false).commit();
launchMainActivity();
} else {
//The user is still running the trial version.
checkTrialStatus();
mApp.getSharedPreferences().edit().putBoolean("TRIAL", true).commit();
}
}
};
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
if (result.isFailure()) {
Toast.makeText(mContext, R.string.unable_to_purchase, Toast.LENGTH_LONG).show();
mApp.getSharedPreferences().edit().putBoolean("TRIAL", true).commit();
return;
} else if (purchase.getSku().equals(ITEM_SKU)) {
Toast.makeText(mContext, R.string.jams_trial_time_removed, Toast.LENGTH_LONG).show();
mApp.getSharedPreferences().edit().putBoolean("TRIAL", false).commit();
launchMainActivity();
}
}
};*/
/* Checks the trial version status of the app. The first install time of the app is
* retrieved and then compared against the current time. If the current time is more
* than 7 days away from the first install time, the trial version has expired and the
* user will be prompted to buy the full version unlocker. If the current time is less
* than 7 days away from the first install time of the app, the trial version is still
* valid and the app will continue running normally.
*
* This approach has a major drawback: The user can simply uninstall the app at the end
* of the trial period, reinstall it, and he/she will get a full 7 day trial again. To
* avoid this issue, we'll create a hidden file called ".jams_info" in the user's external
* storage directory (Environment.getExternalStorageDir()). The file will contain one
* line: The time in millis that is 10 days in the future from the first install time.
* The trial expires in 7 days, so the extra 3 days will be a "buffer" time period that
* will discourage free-loaders from simply reinstalling the app and reusing it. If a
* user wants to try the app again, they can do so 3 days after their trial expires.
*
* Every time the app starts up, it will first check for the ".jams_info" file. If it exists,
* Jams will check to make sure that the current time is earlier/before the time that has
* just been read in. If it is, the app will open up. If it isn't, the user will get the
* trial expiry dialog.
*/
/*public void checkTrialStatus() {
PackageManager pm = mContext.getPackageManager();
PackageInfo packageInfo = null;
try {
packageInfo = pm.getPackageInfo("com.jams.music.player", PackageManager.GET_ACTIVITIES);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long firstInstallTime = packageInfo.firstInstallTime;
long currentTime = System.currentTimeMillis();
long expiryTime = firstInstallTime + 604800000l;
long numDaysRemainingMillis = expiryTime - currentTime;
if (currentTime >= expiryTime) {
//The trial version has expired.
//Write a file to the sdcard that stores the trial's reactivation time (3 days in the future).
long trialReactivationTime = System.currentTimeMillis() + 259200000l;
File file = new File(Environment.getExternalStorageDirectory() + "/.jams_info");
try {
if (file.exists()) {
file.delete();
}
FileUtils.write(file,
"" + trialReactivationTime,
false);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
//Prompt the user to buy the full version of the app.
showTrialFragment(true, 0);
//showTrialDialog(true, 0);
} else {
//The trial version is still valid.
boolean trialValid = checkTrialReactivationTime();
if (trialValid) {
//The trial is still valid. Show the trial dialog every 5 startups.
long numDaysRemaining = (long) (numDaysRemainingMillis / (1000*60*60*24));
float updatedStartCount = mApp.getSharedPreferences().getInt("START_COUNT", 1);
if ((updatedStartCount/5)==(Math.round(updatedStartCount/5)) || mExplicitShowTrialFragment) {
showTrialFragment(false, (int) numDaysRemaining);
//showTrialDialog(false, (int) numDaysRemaining);
} else {
launchMainActivity();
}
} else {
//The trial has expired.
showTrialFragment(true, 0);
//showTrialDialog(true, 0);
}
}
}*/
/* This method checks for the /sdcard/.jams_info file. If it exists,
* it tries to read the reactivation time from the file.
* Checks if the current time is 3 days (or more) in the future
* than the time that was just read. If so, returns true. If not,
* returns false.
*/
private boolean checkTrialReactivationTime() {
File file = new File(Environment.getExternalStorageDirectory() + "/.jams_info");
if (file.exists()) {
//The file exists. Try reading the reactivation time from it.
String time = null;
long reactivationTime = -1;
try {
time = FileUtils.readFileToString(file);
reactivationTime = Long.parseLong(time);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
reactivationTime = -1;
} catch (Exception e) {
e.printStackTrace();
reactivationTime = -1;
}
if (reactivationTime!=-1) {
//Check if the current time is later than the reactivation time.
long currentTime = System.currentTimeMillis();
if (currentTime >= reactivationTime) {
//Yeap, the trial's been reactivated.
return true;
} else {
//Nope, the trial's still in the expired state.
return false;
}
} else {
//We were unable to read the activation time. Continue the trial.
return true;
}
} else {
//The file doesn't exist, so the trial is active.
return true;
}
}
private void showTrialFragment(final boolean expired, int numDaysRemaining) {
//Load the trial fragment into the activity.
TrialFragment fragment = new TrialFragment();
Bundle bundle = new Bundle();
bundle.putInt("NUM_DAYS_REMAINING", numDaysRemaining);
bundle.putBoolean("EXPIRED", expired);
fragment.setArguments(bundle);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.launcher_root_view, fragment, "trialFragment");
transaction.commit();
}
private void showUpgradeFragmentWithPromo() {
/*SpecialUpgradeOfferFragment fragment = new SpecialUpgradeOfferFragment();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.launcher_root_view, fragment, "specialUpgradeOfferFragment");
transaction.commit();*/
}
public void showTrialDialog(final boolean expired, int numDaysRemaining) {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setTitle(R.string.app_name);
builder.setCancelable(false);
View view = this.getLayoutInflater().inflate(R.layout.trial_expiry_dialog, null);
TextView trialExpiredText = (TextView) view.findViewById(R.id.trial_message);
TextView trialDaysRemaining = (TextView) view.findViewById(R.id.trial_days_remaining);
TextView trialDaysCaps = (TextView) view.findViewById(R.id.days_caps);
trialExpiredText.setTypeface(TypefaceHelper.getTypeface(mContext, "RobotoCondensed-Light"));
trialExpiredText.setPaintFlags(trialExpiredText.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
trialDaysRemaining.setTypeface(TypefaceHelper.getTypeface(mContext, "RobotoCondensed-Light"));
trialDaysCaps.setTypeface(TypefaceHelper.getTypeface(mContext, "RobotoCondensed-Light"));
trialDaysCaps.setPaintFlags(trialDaysCaps.getPaintFlags() | Paint.ANTI_ALIAS_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
if (expired) {
trialDaysRemaining.setText(R.string.expired);
trialExpiredText.setText(R.string.trial_expired);
trialDaysRemaining.setTextColor(0xFFFF8800);
trialDaysCaps.setVisibility(View.GONE);
trialDaysRemaining.setTextSize(36);
trialDaysRemaining.setPaintFlags(trialDaysRemaining.getPaintFlags()
| Paint.ANTI_ALIAS_FLAG
| Paint.SUBPIXEL_TEXT_FLAG);
} else {
trialExpiredText.setText(R.string.trial_running);
trialDaysRemaining.setText("" + numDaysRemaining);
trialDaysCaps.setVisibility(View.VISIBLE);
trialDaysRemaining.setTextColor(0xFF0099CC);
trialDaysRemaining.setPaintFlags(trialDaysRemaining.getPaintFlags()
| Paint.ANTI_ALIAS_FLAG
| Paint.SUBPIXEL_TEXT_FLAG
| Paint.FAKE_BOLD_TEXT_FLAG);
}
builder.setView(view);
builder.setPositiveButton(R.string.upgrade, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showUpgradeFragmentWithPromo();
}
});
builder.setNegativeButton(R.string.later, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (expired) {
finish();
} else {
launchMainActivity();
}
}
});
builder.create().show();
}
private void launchMainActivity() {
Intent intent = new Intent(mContext, MainActivity.class);
int startupScreen = mApp.getSharedPreferences().getInt("STARTUP_SCREEN", 0);
switch (startupScreen) {
case 0:
intent.putExtra("TARGET_FRAGMENT", "ARTISTS");
break;
case 1:
intent.putExtra("TARGET_FRAGMENT", "ALBUM_ARTISTS");
break;
case 2:
intent.putExtra("TARGET_FRAGMENT", "ALBUMS");
break;
case 3:
intent.putExtra("TARGET_FRAGMENT", "SONGS");
break;
case 4:
intent.putExtra("TARGET_FRAGMENT", "PLAYLISTS");
break;
case 5:
intent.putExtra("TARGET_FRAGMENT", "GENRES");
break;
case 6:
intent.putExtra("TARGET_FRAGMENT", "FOLDERS");
break;
}
startActivity(intent);
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
finish();
}
public void showErrorDialog(final int code) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Dialog d = GooglePlayServicesUtil.getErrorDialog(
code,
LauncherActivity.this,
REQUEST_CODE_RECOVER_FROM_PLAY_SERVICES_ERROR);
d.show();
}
});
}
/** Given a URI, returns a map of campaign data that can be sent with
* any GA hit.
*
* @param uri A hierarchical URI that may or may not have campaign data
* stored in query parameters.
*
* @return A map that may contain campaign or referrer
* that may be sent with any Google Analytics hit.
*/
private Map<String,String> getReferrerMapFromUri(Uri uri) {
MapBuilder paramMap = new MapBuilder();
//If no URI, return an empty Map.
if (uri==null) {
return paramMap.build();
}
/* Source is the only required campaign field. No need to continue if not
* present. */
if (uri.getQueryParameter(CAMPAIGN_SOURCE_PARAM)!=null) {
/* MapBuilder.setCampaignParamsFromUrl parses Google Analytics campaign
* ("UTM") parameters from a string URL into a Map that can be set on
* the Tracker. */
paramMap.setCampaignParamsFromUrl(uri.toString());
/* If no source parameter, set authority to source and medium to
* "referral". */
} else if (uri.getAuthority()!=null) {
paramMap.set(Fields.CAMPAIGN_MEDIUM, "referral");
paramMap.set(Fields.CAMPAIGN_SOURCE, uri.getAuthority());
}
return paramMap.build();
}
@Override
public void onPause() {
super.onPause();
try {
if (isFinishing() && mHelper!=null) {
mHelper.dispose();
mHelper = null;
}
finish();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
try {
if (mHelper!=null) {
mHelper.dispose();
mHelper = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onStart() {
super.onStart();
//GAnalytics.
try {
if (mApp.isGoogleAnalyticsEnabled()==true) {
EasyTracker.getInstance(this).activityStart(this);
//Get the intent that started this Activity.
Intent intent = this.getIntent();
Uri uri = intent.getData();
//Send a screenview using any available campaign or referrer data.
MapBuilder.createAppView().setAll(getReferrerMapFromUri(uri));
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onStop() {
super.onStop();
//GAnalytics.
try {
if (mApp.isGoogleAnalyticsEnabled()==true) {
EasyTracker.getInstance(this).activityStop(this);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}