1 package org.coolreader.crengine;
2 
3 import android.content.ActivityNotFoundException;
4 import android.content.Intent;
5 import android.net.Uri;
6 import android.util.Log;
7 import android.view.LayoutInflater;
8 import android.view.View;
9 import android.widget.Button;
10 import android.widget.TabHost;
11 import android.widget.TabHost.TabContentFactory;
12 import android.widget.TextView;
13 
14 import org.coolreader.CoolReader;
15 import org.coolreader.R;
16 
17 import java.util.ArrayList;
18 import java.util.Iterator;
19 import java.util.Random;
20 
21 public class AboutDialog extends BaseDialog implements TabContentFactory {
22 	final CoolReader mCoolReader;
23 
24 	private View mAppTab;
25 	private View mDirsTab;
26 	private View mLicenseTab;
27 	private View mDonationTab;
28 
isPackageInstalled( String packageName )29 	private boolean isPackageInstalled( String packageName ) {
30 		try {
31 			mCoolReader.getPackageManager().getApplicationInfo(packageName, 0);
32 			return true;
33 		} catch ( Exception e ) {
34 			return false;
35 		}
36 	}
37 
installPackage( String packageName )38 	private void installPackage( String packageName ) {
39 		Log.i("cr3", "installPackageL " + packageName);
40 		try {
41 			mCoolReader.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + packageName)));
42 		} catch ( ActivityNotFoundException e ) {
43 			mCoolReader.showToast("Cannot run Android Market application");
44 		}
45 	}
46 
setupDonationButton( final Button btn, final String packageName )47 	private void setupDonationButton( final Button btn, final String packageName ) {
48 		if ( isPackageInstalled(packageName)) {
49 			btn.setEnabled(false);
50 			btn.setText(R.string.dlg_about_donation_installed);
51 		} else {
52 			btn.setOnClickListener(v -> installPackage(packageName));
53 		}
54 	}
55 
setupInAppDonationButton( final Button btn, final double amount )56 	private void setupInAppDonationButton( final Button btn, final double amount ) {
57 		btn.setText("$" + amount);
58 		btn.setOnClickListener(v -> mCoolReader.makeDonation(amount));
59 	}
60 
updateTotalDonations()61 	private void updateTotalDonations() {
62 		double amount = mCoolReader.getTotalDonations();
63 		if (isPackageInstalled("org.coolreader.donation.gold"))
64 			amount += 10.0;
65 		if (isPackageInstalled("org.coolreader.donation.silver"))
66 			amount += 3.0;
67 		if (isPackageInstalled("org.coolreader.donation.bronze"))
68 			amount += 1.0;
69 		TextView text = ((TextView)mDonationTab.findViewById(R.id.btn_about_donation_total));
70 		if (text != null)
71 			text.setText(mCoolReader.getString(R.string.dlg_about_donation_total) + " $" + amount);
72 	}
73 
AboutDialog( CoolReader activity)74 	public AboutDialog( CoolReader activity)
75 	{
76 		super(activity);
77 		mCoolReader = activity;
78 
79 		setTitle(R.string.dlg_about);
80 		LayoutInflater inflater = LayoutInflater.from(getContext());
81 		TabHost tabs = (TabHost)inflater.inflate(R.layout.about_dialog, null);
82 		mAppTab = inflater.inflate(R.layout.about_dialog_app, null);
83 		((TextView)mAppTab.findViewById(R.id.version)).setText("Cool Reader " + mCoolReader.getVersion());
84 
85 		mDirsTab = inflater.inflate(R.layout.about_dialog_dirs, null);
86 		TextView fonts_dir = mDirsTab.findViewById(R.id.fonts_dirs);
87 
88 		ArrayList<String> fontsDirs = Engine.getFontsDirs();
89 		StringBuilder sbuf = new StringBuilder();
90 		Iterator<String> it = fontsDirs.iterator();
91 		while (it.hasNext()) {
92 			String s = it.next();
93 			sbuf.append(s);
94 			if (it.hasNext()) {
95 				sbuf.append("\n");
96 			}
97 		}
98 		fonts_dir.setText(sbuf.toString());
99 
100 		ArrayList<String> testuresDirs = Engine.getDataDirs(Engine.DataDirType.TexturesDirs);
101 		sbuf = new StringBuilder();
102 		it = testuresDirs.iterator();
103 		while (it.hasNext()) {
104 			String s = it.next();
105 			sbuf.append(s);
106 			if (it.hasNext()) {
107 				sbuf.append("\n");
108 			}
109 		}
110 		TextView textures_dir = mDirsTab.findViewById(R.id.textures_dirs);
111 		textures_dir.setText(sbuf.toString());
112 
113 		ArrayList<String> backgroundsDirs = Engine.getDataDirs(Engine.DataDirType.BackgroundsDirs);
114 		sbuf = new StringBuilder();
115 		it = backgroundsDirs.iterator();
116 		while (it.hasNext()) {
117 			String s = it.next();
118 			sbuf.append(s);
119 			if (it.hasNext()) {
120 				sbuf.append("\n");
121 			}
122 		}
123 		TextView backgrounds_dir = mDirsTab.findViewById(R.id.backgrounds_dirs);
124 		backgrounds_dir.setText(sbuf.toString());
125 
126 		ArrayList<String> hyphDirs = Engine.getDataDirs(Engine.DataDirType.HyphsDirs);
127 		sbuf = new StringBuilder();
128 		it = hyphDirs.iterator();
129 		while (it.hasNext()) {
130 			String s = it.next();
131 			sbuf.append(s);
132 			if (it.hasNext()) {
133 				sbuf.append("\n");
134 			}
135 		}
136 		TextView hyph_dir = mDirsTab.findViewById(R.id.hyph_dirs);
137 		hyph_dir.setText(sbuf.toString());
138 
139 		mLicenseTab = inflater.inflate(R.layout.about_dialog_license, null);
140 		String license = Engine.getInstance(mCoolReader).loadResourceUtf8(R.raw.license);
141 		((TextView)mLicenseTab.findViewById(R.id.license)).setText(license);
142 		boolean billingSupported = mCoolReader.isDonationSupported();
143 		mDonationTab = inflater.inflate(billingSupported ? R.layout.about_dialog_donation2 : R.layout.about_dialog_donation, null);
144 
145 		if (billingSupported) {
146 			setupInAppDonationButton(mDonationTab.findViewById(R.id.btn_about_donation_install_vip), 100);
147 			setupInAppDonationButton(mDonationTab.findViewById(R.id.btn_about_donation_install_platinum), 30);
148 			setupInAppDonationButton(mDonationTab.findViewById(R.id.btn_about_donation_install_gold), 10);
149 			setupInAppDonationButton(mDonationTab.findViewById(R.id.btn_about_donation_install_silver), 3);
150 			setupInAppDonationButton(mDonationTab.findViewById(R.id.btn_about_donation_install_bronze), 1);
151 			setupInAppDonationButton(mDonationTab.findViewById(R.id.btn_about_donation_install_iron), 0.3);
152 			updateTotalDonations();
153 			mCoolReader.setDonationListener(total -> updateTotalDonations());
154 			setOnDismissListener(dialog -> mCoolReader.setDonationListener(null));
155 		} else {
156 			setupDonationButton(mDonationTab.findViewById(R.id.btn_about_donation_install_gold), "org.coolreader.donation.gold");
157 			setupDonationButton(mDonationTab.findViewById(R.id.btn_about_donation_install_silver), "org.coolreader.donation.silver");
158 			setupDonationButton(mDonationTab.findViewById(R.id.btn_about_donation_install_bronze), "org.coolreader.donation.bronze");
159 		}
160 
161 		tabs.setup();
162 		TabHost.TabSpec tsApp = tabs.newTabSpec("App");
163 		tsApp.setIndicator("",
164 				getContext().getResources().getDrawable(R.drawable.cr3_menu_link));
165 		tsApp.setContent(this);
166 		tabs.addTab(tsApp);
167 
168 		TabHost.TabSpec tsDirectories = tabs.newTabSpec("Directories");
169 		tsDirectories.setIndicator("",
170 				getContext().getResources().getDrawable(R.drawable.ic_menu_archive));
171 		tsDirectories.setContent(this);
172 		tabs.addTab(tsDirectories);
173 
174 		TabHost.TabSpec tsLicense = tabs.newTabSpec("License");
175 		tsLicense.setIndicator("",
176 				getContext().getResources().getDrawable(R.drawable.ic_menu_star));
177 		tsLicense.setContent(this);
178 		tabs.addTab(tsLicense);
179 
180 		TabHost.TabSpec tsDonation = tabs.newTabSpec("Donation");
181 		tsDonation.setIndicator("",
182 				getContext().getResources().getDrawable(R.drawable.ic_menu_emoticons));
183 		tsDonation.setContent(this);
184 		tabs.addTab(tsDonation);
185 
186 		setView( tabs );
187 
188 		// 25% chance to show Donations tab
189 		if ((rnd.nextInt() & 3) == 3)
190 			tabs.setCurrentTab(3);
191 
192 	}
193 	private static Random rnd = new Random(android.os.SystemClock.uptimeMillis());
194 
195 
196 	@Override
createTabContent(String tag)197 	public View createTabContent(String tag) {
198 
199 		if ( "App".equals(tag) )
200 			return mAppTab;
201 		else if ( "Directories".equals(tag) )
202 			return mDirsTab;
203 		else if ( "License".equals(tag) )
204 			return mLicenseTab;
205 		else if ( "Donation".equals(tag) )
206 			return mDonationTab;
207 		return null;
208 	}
209 
210 }
211