package com.dropbox.chooser.android;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
import android.widget.TextView;
import com.dropbox.chooser.android.R;
class AppStoreInterstitial {
public static final String DIALOG_TAG = "com.dropbox.chooser.android.DIALOG";
private static final String DROPBOX_PACKAGE_NAME = "com.dropbox.android";
@SuppressLint("NewApi") // lint isn't clever enough to figure out that we branched manually :(
public static void showInterstitial(ActivityLike thing) {
if (thing.getSupportFragmentManager() != null) {
SupportFragment frag = SupportFragment.newInstance();
android.support.v4.app.FragmentManager fm = thing.getSupportFragmentManager();
frag.show(fm, DIALOG_TAG);
} else {
NativeFragment frag = NativeFragment.newInstance();
FragmentManager fm = thing.getFragmentManager();
frag.show(fm, DIALOG_TAG);
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class NativeFragment extends DialogFragment {
public static NativeFragment newInstance() {
return new NativeFragment();
}
@Override
public Dialog onCreateDialog(Bundle savedinstanceState) {
final NativeFragment frag = this;
View v = getActivity().getLayoutInflater().inflate(R.layout.app_store_interstitial, null);
setStrings(v, isDropboxInstalled(getActivity()));
Button okButton = (Button) v.findViewById(R.id.dbx_bottom_bar_ok_button);
okButton.setOnClickListener(new OnClickListener() {
public void onClick(View v_clicked) {
frag.dismiss();
launchMarket(frag.getActivity());
}
});
Button cancelButton = (Button) v.findViewById(R.id.dbx_bottom_bar_cancel_button);
cancelButton.setOnClickListener(new OnClickListener() {
public void onClick(View v_clicked) {
frag.dismiss();
}
});
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(v);
return builder.create();
}
@Override
public void onStart() {
super.onStart();
centerWindow(getDialog().getWindow());
}
}
public static class SupportFragment extends android.support.v4.app.DialogFragment {
public static SupportFragment newInstance() {
return new SupportFragment();
}
@Override
public Dialog onCreateDialog(Bundle savedinstanceState) {
final SupportFragment frag = this;
View v = getActivity().getLayoutInflater().inflate(R.layout.app_store_interstitial, null);
setStrings(v, isDropboxInstalled(getActivity()));
Button okButton = (Button) v.findViewById(R.id.dbx_bottom_bar_ok_button);
okButton.setOnClickListener(new OnClickListener() {
public void onClick(View v_clicked) {
frag.dismiss();
launchMarket(frag.getActivity());
}
});
Button cancelButton = (Button) v.findViewById(R.id.dbx_bottom_bar_cancel_button);
cancelButton.setOnClickListener(new OnClickListener() {
public void onClick(View v_clicked) {
frag.dismiss();
}
});
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setView(v);
return builder.create();
}
@Override
public void onStart() {
super.onStart();
centerWindow(getDialog().getWindow());
}
}
private static final int MAX_DIALOG_WIDTH_DP = 590;
private static final int MAX_DIALOG_HEIGHT_DP = 700;
private static final int DLG_PADDING_DP = 10;
private static final int APPROX_STATUSBAR_HEIGHT_DP = 25; // TODO: be better to have the right one and know if it's on top or bottom
private static void centerWindow(Window w) {
DisplayMetrics metrics = new DisplayMetrics();
Display display = w.getWindowManager().getDefaultDisplay();
display.getMetrics(metrics);
int width = Math.min(metrics.widthPixels - (int)(2 * DLG_PADDING_DP * metrics.density),
(int)(MAX_DIALOG_WIDTH_DP * metrics.density));
int height = Math.min(metrics.heightPixels - (int)((2 * DLG_PADDING_DP + APPROX_STATUSBAR_HEIGHT_DP) * metrics.density),
(int)(MAX_DIALOG_HEIGHT_DP * metrics.density));
int x = (metrics.widthPixels - width) / 2;
int y = (metrics.heightPixels - height - ((int) (APPROX_STATUSBAR_HEIGHT_DP * metrics.density))) / 2;
LayoutParams params = w.getAttributes();
params.x = x;
params.y = y;
params.width = width;
params.height = height;
w.setAttributes(params);
w.setGravity(Gravity.LEFT|Gravity.TOP);
}
private static void setStrings(View v, boolean needUpdate) {
TextView title = (TextView) v.findViewById(R.id.dbx_install_title);
TextView main = (TextView) v.findViewById(R.id.dbx_install_main);
TextView sub = (TextView) v.findViewById(R.id.dbx_install_sub);
Button okButton = (Button) v.findViewById(R.id.dbx_bottom_bar_ok_button);
Button cancelButton = (Button) v.findViewById(R.id.dbx_bottom_bar_cancel_button);
if (needUpdate) {
title.setText(R.string.dbx_update);
main.setText(R.string.dbx_update_main);
sub.setText(R.string.dbx_update_sub);
okButton.setText(R.string.dbx_update_button_ok);
} else {
// first-time install
title.setText(R.string.dbx_install);
main.setText(R.string.dbx_install_main);
sub.setText(R.string.dbx_install_sub);
okButton.setText(R.string.dbx_install_button_ok);
}
cancelButton.setText(R.string.dbx_install_button_cancel);
}
private static boolean isDropboxInstalled(Activity act) {
PackageManager pm = act.getPackageManager();
try {
pm.getPackageInfo(DROPBOX_PACKAGE_NAME, PackageManager.GET_ACTIVITIES);
return true;
} catch (PackageManager.NameNotFoundException e) {
return false;
}
}
private static void launchMarket(Activity act) {
Intent intent = new Intent(Intent.ACTION_VIEW);
// Market page for the official Dropbox App.
intent.setData(Uri.parse("market://details?id=" + DROPBOX_PACKAGE_NAME));
act.startActivity(intent);
}
}