MainActivity.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. package com.afollestad.materialdialogssample;
  2. import android.content.DialogInterface;
  3. import android.content.Intent;
  4. import android.graphics.Color;
  5. import android.graphics.drawable.ColorDrawable;
  6. import android.os.Build;
  7. import android.os.Bundle;
  8. import android.support.v7.app.ActionBarActivity;
  9. import android.text.Editable;
  10. import android.text.Html;
  11. import android.text.InputType;
  12. import android.text.TextWatcher;
  13. import android.text.method.PasswordTransformationMethod;
  14. import android.view.Menu;
  15. import android.view.MenuItem;
  16. import android.view.View;
  17. import android.webkit.WebView;
  18. import android.widget.AdapterView;
  19. import android.widget.CheckBox;
  20. import android.widget.CompoundButton;
  21. import android.widget.EditText;
  22. import android.widget.ListView;
  23. import android.widget.Toast;
  24. import com.afollestad.materialdialogs.DialogAction;
  25. import com.afollestad.materialdialogs.GravityEnum;
  26. import com.afollestad.materialdialogs.MaterialDialog;
  27. import com.afollestad.materialdialogs.Theme;
  28. import com.afollestad.materialdialogs.ThemeSingleton;
  29. import java.io.File;
  30. /**
  31. * @author Aidan Follestad (afollestad)
  32. */
  33. public class MainActivity extends ActionBarActivity implements FolderSelectorDialog.FolderSelectCallback {
  34. @Override
  35. protected void onCreate(Bundle savedInstanceState) {
  36. super.onCreate(savedInstanceState);
  37. setContentView(R.layout.activity_main);
  38. findViewById(R.id.basicNoTitle).setOnClickListener(new View.OnClickListener() {
  39. @Override
  40. public void onClick(View v) {
  41. showBasicNoTitle();
  42. }
  43. });
  44. findViewById(R.id.basic).setOnClickListener(new View.OnClickListener() {
  45. @Override
  46. public void onClick(View v) {
  47. showBasic();
  48. }
  49. });
  50. findViewById(R.id.basicLongContent).setOnClickListener(new View.OnClickListener() {
  51. @Override
  52. public void onClick(View v) {
  53. showBasicLongContent();
  54. }
  55. });
  56. findViewById(R.id.basicIcon).setOnClickListener(new View.OnClickListener() {
  57. @Override
  58. public void onClick(View v) {
  59. showBasicIcon();
  60. }
  61. });
  62. findViewById(R.id.stacked).setOnClickListener(new View.OnClickListener() {
  63. @Override
  64. public void onClick(View v) {
  65. showStacked();
  66. }
  67. });
  68. findViewById(R.id.neutral).setOnClickListener(new View.OnClickListener() {
  69. @Override
  70. public void onClick(View v) {
  71. showNeutral();
  72. }
  73. });
  74. findViewById(R.id.callbacks).setOnClickListener(new View.OnClickListener() {
  75. @Override
  76. public void onClick(View v) {
  77. showCallbacks();
  78. }
  79. });
  80. findViewById(R.id.list).setOnClickListener(new View.OnClickListener() {
  81. @Override
  82. public void onClick(View v) {
  83. showList();
  84. }
  85. });
  86. findViewById(R.id.listNoTitle).setOnClickListener(new View.OnClickListener() {
  87. @Override
  88. public void onClick(View v) {
  89. showListNoTitle();
  90. }
  91. });
  92. findViewById(R.id.longList).setOnClickListener(new View.OnClickListener() {
  93. @Override
  94. public void onClick(View v) {
  95. showLongList();
  96. }
  97. });
  98. findViewById(R.id.singleChoice).setOnClickListener(new View.OnClickListener() {
  99. @Override
  100. public void onClick(View v) {
  101. showSingleChoice();
  102. }
  103. });
  104. findViewById(R.id.multiChoice).setOnClickListener(new View.OnClickListener() {
  105. @Override
  106. public void onClick(View v) {
  107. showMultiChoice();
  108. }
  109. });
  110. findViewById(R.id.customListItems).setOnClickListener(new View.OnClickListener() {
  111. @Override
  112. public void onClick(View v) {
  113. showCustomList();
  114. }
  115. });
  116. findViewById(R.id.customView).setOnClickListener(new View.OnClickListener() {
  117. @Override
  118. public void onClick(View v) {
  119. showCustomView();
  120. }
  121. });
  122. findViewById(R.id.customView_webView).setOnClickListener(new View.OnClickListener() {
  123. @Override
  124. public void onClick(View v) {
  125. showCustomWebView();
  126. }
  127. });
  128. findViewById(R.id.customView_colorChooser).setOnClickListener(new View.OnClickListener() {
  129. @Override
  130. public void onClick(View v) {
  131. showCustomColorChooser();
  132. }
  133. });
  134. findViewById(R.id.themed).setOnClickListener(new View.OnClickListener() {
  135. @Override
  136. public void onClick(View v) {
  137. showThemed();
  138. }
  139. });
  140. findViewById(R.id.showCancelDismiss).setOnClickListener(new View.OnClickListener() {
  141. @Override
  142. public void onClick(View v) {
  143. showShowCancelDismissCallbacks();
  144. }
  145. });
  146. findViewById(R.id.folder_chooser).setOnClickListener(new View.OnClickListener() {
  147. @Override
  148. public void onClick(View v) {
  149. new FolderSelectorDialog().show(MainActivity.this);
  150. }
  151. });
  152. findViewById(R.id.progress1).setOnClickListener(new View.OnClickListener() {
  153. @Override
  154. public void onClick(View v) {
  155. showProgressDialog(false);
  156. }
  157. });
  158. findViewById(R.id.progress2).setOnClickListener(new View.OnClickListener() {
  159. @Override
  160. public void onClick(View v) {
  161. showProgressDialog(true);
  162. }
  163. });
  164. findViewById(R.id.preference_dialogs).setOnClickListener(new View.OnClickListener() {
  165. @Override
  166. public void onClick(View v) {
  167. startActivity(new Intent(getApplicationContext(), PreferenceActivity.class));
  168. }
  169. });
  170. }
  171. private void showBasicNoTitle() {
  172. new MaterialDialog.Builder(this)
  173. .content(R.string.shareLocationPrompt)
  174. .positiveText(R.string.agree)
  175. .negativeText(R.string.disagree)
  176. .show();
  177. }
  178. private void showBasic() {
  179. new MaterialDialog.Builder(this)
  180. .title(R.string.useGoogleLocationServices)
  181. .content(R.string.useGoogleLocationServicesPrompt)
  182. .positiveText(R.string.agree)
  183. .negativeText(R.string.disagree)
  184. .show();
  185. }
  186. private void showBasicLongContent() {
  187. new MaterialDialog.Builder(this)
  188. .title(R.string.useGoogleLocationServices)
  189. .content(R.string.loremIpsum)
  190. .positiveText(R.string.agree)
  191. .negativeText(R.string.disagree)
  192. .show();
  193. }
  194. private void showBasicIcon() {
  195. new MaterialDialog.Builder(this)
  196. .iconRes(R.drawable.ic_launcher)
  197. .title(R.string.useGoogleLocationServices)
  198. .content(R.string.useGoogleLocationServicesPrompt)
  199. .positiveText(R.string.agree)
  200. .negativeText(R.string.disagree)
  201. .show();
  202. }
  203. private void showStacked() {
  204. new MaterialDialog.Builder(this)
  205. .title(R.string.useGoogleLocationServices)
  206. .content(R.string.useGoogleLocationServicesPrompt)
  207. .positiveText(R.string.speedBoost)
  208. .negativeText(R.string.noThanks)
  209. .forceStacking(true) // this generally should not be forced, but is used for demo purposes
  210. .show();
  211. }
  212. private void showNeutral() {
  213. new MaterialDialog.Builder(this)
  214. .title(R.string.useGoogleLocationServices)
  215. .content(R.string.useGoogleLocationServicesPrompt)
  216. .positiveText(R.string.agree)
  217. .negativeText(R.string.disagree)
  218. .neutralText(R.string.more_info)
  219. .show();
  220. }
  221. private void showCallbacks() {
  222. new MaterialDialog.Builder(this)
  223. .title(R.string.useGoogleLocationServices)
  224. .content(R.string.useGoogleLocationServicesPrompt)
  225. .positiveText(R.string.agree)
  226. .negativeText(R.string.disagree)
  227. .neutralText(R.string.more_info)
  228. .callback(new MaterialDialog.ButtonCallback() {
  229. @Override
  230. public void onPositive(MaterialDialog dialog) {
  231. Toast.makeText(getApplicationContext(), "Positive!", Toast.LENGTH_SHORT).show();
  232. }
  233. @Override
  234. public void onNeutral(MaterialDialog dialog) {
  235. Toast.makeText(getApplicationContext(), "Neutral", Toast.LENGTH_SHORT).show();
  236. }
  237. @Override
  238. public void onNegative(MaterialDialog dialog) {
  239. Toast.makeText(getApplicationContext(), "Negative…", Toast.LENGTH_SHORT).show();
  240. }
  241. })
  242. .show();
  243. }
  244. private void showList() {
  245. new MaterialDialog.Builder(this)
  246. .title(R.string.socialNetworks)
  247. .items(R.array.socialNetworks)
  248. .itemsCallback(new MaterialDialog.ListCallback() {
  249. @Override
  250. public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
  251. Toast.makeText(getApplicationContext(), which + ": " + text, Toast.LENGTH_SHORT).show();
  252. }
  253. })
  254. .show();
  255. }
  256. private void showListNoTitle() {
  257. new MaterialDialog.Builder(this)
  258. .items(R.array.states)
  259. .itemsCallback(new MaterialDialog.ListCallback() {
  260. @Override
  261. public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
  262. Toast.makeText(getApplicationContext(), which + ": " + text, Toast.LENGTH_SHORT).show();
  263. }
  264. })
  265. .show();
  266. }
  267. private void showLongList() {
  268. new MaterialDialog.Builder(this)
  269. .title(R.string.states)
  270. .items(R.array.states)
  271. .itemsCallback(new MaterialDialog.ListCallback() {
  272. @Override
  273. public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
  274. Toast.makeText(getApplicationContext(), which + ": " + text, Toast.LENGTH_SHORT).show();
  275. }
  276. })
  277. .positiveText(android.R.string.ok)
  278. .show();
  279. }
  280. private void showSingleChoice() {
  281. new MaterialDialog.Builder(this)
  282. .title(R.string.socialNetworks)
  283. .items(R.array.socialNetworks)
  284. .itemsCallbackSingleChoice(2, new MaterialDialog.ListCallback() {
  285. @Override
  286. public void onSelection(MaterialDialog dialog, View view, int which, CharSequence text) {
  287. Toast.makeText(getApplicationContext(), which + ": " + text, Toast.LENGTH_SHORT).show();
  288. }
  289. })
  290. .positiveText(R.string.choose)
  291. .show();
  292. }
  293. private void showMultiChoice() {
  294. new MaterialDialog.Builder(this)
  295. .title(R.string.socialNetworks)
  296. .items(R.array.socialNetworks)
  297. .itemsCallbackMultiChoice(new Integer[]{1, 3}, new MaterialDialog.ListCallbackMulti() {
  298. @Override
  299. public void onSelection(MaterialDialog dialog, Integer[] which, CharSequence[] text) {
  300. StringBuilder str = new StringBuilder();
  301. for (int i = 0; i < which.length; i++) {
  302. if (i > 0) str.append('\n');
  303. str.append(which[i]);
  304. str.append(": ");
  305. str.append(text[i]);
  306. }
  307. Toast.makeText(getApplicationContext(), str.toString(), Toast.LENGTH_LONG).show();
  308. }
  309. })
  310. .positiveText(R.string.choose)
  311. .show();
  312. }
  313. private void showCustomList() {
  314. MaterialDialog dialog = new MaterialDialog.Builder(this)
  315. .title(R.string.socialNetworks)
  316. .adapter(new ButtonItemAdapter(this, R.array.socialNetworks))
  317. .build();
  318. ListView listView = dialog.getListView();
  319. if (listView != null) {
  320. listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  321. @Override
  322. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  323. Toast.makeText(MainActivity.this, "Clicked item " + position, Toast.LENGTH_SHORT).show();
  324. }
  325. });
  326. }
  327. dialog.show();
  328. }
  329. private EditText passwordInput;
  330. private View positiveAction;
  331. private void showCustomView() {
  332. MaterialDialog dialog = new MaterialDialog.Builder(this)
  333. .title(R.string.googleWifi)
  334. .customView(R.layout.dialog_customview, true)
  335. .positiveText(R.string.connect)
  336. .negativeText(android.R.string.cancel)
  337. .callback(new MaterialDialog.ButtonCallback() {
  338. @Override
  339. public void onPositive(MaterialDialog dialog) {
  340. Toast.makeText(getApplicationContext(), "Password: " + passwordInput.getText().toString(), Toast.LENGTH_SHORT).show();
  341. }
  342. @Override
  343. public void onNegative(MaterialDialog dialog) {
  344. }
  345. }).build();
  346. positiveAction = dialog.getActionButton(DialogAction.POSITIVE);
  347. passwordInput = (EditText) dialog.getCustomView().findViewById(R.id.password);
  348. passwordInput.addTextChangedListener(new TextWatcher() {
  349. @Override
  350. public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  351. }
  352. @Override
  353. public void onTextChanged(CharSequence s, int start, int before, int count) {
  354. positiveAction.setEnabled(s.toString().trim().length() > 0);
  355. }
  356. @Override
  357. public void afterTextChanged(Editable s) {
  358. }
  359. });
  360. // Toggling the show password CheckBox will mask or unmask the password input EditText
  361. ((CheckBox) dialog.getCustomView().findViewById(R.id.showPassword)).setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  362. @Override
  363. public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  364. passwordInput.setInputType(!isChecked ? InputType.TYPE_TEXT_VARIATION_PASSWORD : InputType.TYPE_CLASS_TEXT);
  365. passwordInput.setTransformationMethod(!isChecked ? PasswordTransformationMethod.getInstance() : null);
  366. }
  367. });
  368. dialog.show();
  369. positiveAction.setEnabled(false); // disabled by default
  370. }
  371. private void showCustomWebView() {
  372. MaterialDialog dialog = new MaterialDialog.Builder(this)
  373. .title(R.string.changelog)
  374. .customView(R.layout.dialog_webview, false)
  375. .positiveText(android.R.string.ok)
  376. .build();
  377. WebView webView = (WebView) dialog.getCustomView().findViewById(R.id.webview);
  378. webView.loadUrl("file:///android_asset/webview.html");
  379. dialog.show();
  380. }
  381. static int selectedColorIndex = -1;
  382. private void showCustomColorChooser() {
  383. new ColorChooserDialog().show(this, selectedColorIndex, new ColorChooserDialog.Callback() {
  384. @Override
  385. public void onColorSelection(int index, int color, int darker) {
  386. selectedColorIndex = index;
  387. getSupportActionBar().setBackgroundDrawable(new ColorDrawable(color));
  388. ThemeSingleton.get().positiveColor = color;
  389. ThemeSingleton.get().neutralColor = color;
  390. ThemeSingleton.get().negativeColor = color;
  391. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
  392. getWindow().setStatusBarColor(darker);
  393. }
  394. });
  395. }
  396. private void showThemed() {
  397. new MaterialDialog.Builder(this)
  398. .title(R.string.useGoogleLocationServices)
  399. .content(R.string.useGoogleLocationServicesPrompt)
  400. .positiveText(R.string.agree)
  401. .negativeText(R.string.disagree)
  402. .positiveColorRes(R.color.material_red_400)
  403. .negativeColorRes(R.color.material_red_400)
  404. .titleGravity(GravityEnum.CENTER)
  405. .titleColorRes(R.color.material_red_400)
  406. .contentColorRes(android.R.color.white)
  407. .backgroundColorRes(R.color.material_blue_grey_800)
  408. .dividerColorRes(R.color.material_pink_500)
  409. .btnSelector(R.drawable.md_btn_selector_custom, DialogAction.POSITIVE)
  410. .positiveColor(Color.WHITE)
  411. .negativeColorAttr(android.R.attr.textColorSecondaryInverse)
  412. .theme(Theme.DARK)
  413. .show();
  414. }
  415. private void showShowCancelDismissCallbacks() {
  416. new MaterialDialog.Builder(this)
  417. .title(R.string.useGoogleLocationServices)
  418. .content(R.string.useGoogleLocationServicesPrompt)
  419. .positiveText(R.string.agree)
  420. .negativeText(R.string.disagree)
  421. .neutralText(R.string.more_info)
  422. .showListener(new DialogInterface.OnShowListener() {
  423. @Override
  424. public void onShow(DialogInterface dialog) {
  425. Toast.makeText(getApplicationContext(), "onShow", Toast.LENGTH_SHORT).show();
  426. }
  427. })
  428. .cancelListener(new DialogInterface.OnCancelListener() {
  429. @Override
  430. public void onCancel(DialogInterface dialog) {
  431. Toast.makeText(getApplicationContext(), "onCancel", Toast.LENGTH_SHORT).show();
  432. }
  433. })
  434. .dismissListener(new DialogInterface.OnDismissListener() {
  435. @Override
  436. public void onDismiss(DialogInterface dialog) {
  437. Toast.makeText(getApplicationContext(), "onDismiss", Toast.LENGTH_SHORT).show();
  438. }
  439. })
  440. .show();
  441. }
  442. public void showProgressDialog(boolean indeterminate) {
  443. if (indeterminate) {
  444. new MaterialDialog.Builder(this)
  445. .title(R.string.progress_dialog)
  446. .content(R.string.please_wait)
  447. .progress(true, 0)
  448. .show();
  449. } else {
  450. new MaterialDialog.Builder(this)
  451. .title(R.string.progress_dialog)
  452. .content(R.string.please_wait)
  453. .contentGravity(GravityEnum.CENTER)
  454. .progress(false, 150)
  455. .showListener(new DialogInterface.OnShowListener() {
  456. @Override
  457. public void onShow(DialogInterface dialogInterface) {
  458. final MaterialDialog dialog = (MaterialDialog) dialogInterface;
  459. new Thread(new Runnable() {
  460. @Override
  461. public void run() {
  462. while (dialog.getCurrentProgress() != dialog.getMaxProgress()) {
  463. if (dialog.isCancelled())
  464. break;
  465. try {
  466. Thread.sleep(50);
  467. } catch (InterruptedException e) {
  468. break;
  469. }
  470. runOnUiThread(new Runnable() {
  471. @Override
  472. public void run() {
  473. dialog.incrementProgress(1);
  474. }
  475. });
  476. }
  477. runOnUiThread(new Runnable() {
  478. @Override
  479. public void run() {
  480. dialog.setContent(getString(R.string.done));
  481. }
  482. });
  483. }
  484. }).start();
  485. }
  486. }).show();
  487. }
  488. }
  489. @Override
  490. public boolean onCreateOptionsMenu(Menu menu) {
  491. getMenuInflater().inflate(R.menu.main, menu);
  492. return super.onCreateOptionsMenu(menu);
  493. }
  494. @Override
  495. public boolean onOptionsItemSelected(MenuItem item) {
  496. if (item.getItemId() == R.id.about) {
  497. new MaterialDialog.Builder(this)
  498. .title(R.string.about)
  499. .positiveText(R.string.dismiss)
  500. .content(Html.fromHtml(getString(R.string.about_body)))
  501. .contentLineSpacing(1.6f)
  502. .build()
  503. .show();
  504. return true;
  505. }
  506. return super.onOptionsItemSelected(item);
  507. }
  508. @Override
  509. public void onFolderSelection(File folder) {
  510. Toast.makeText(this, folder.getAbsolutePath(), Toast.LENGTH_SHORT).show();
  511. }
  512. }