Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.13 KB | None | 0 0
  1. package com.embroidermodder.embroideryviewer;
  2.  
  3. import android.Manifest;
  4. import android.app.Activity;
  5. import android.app.Dialog;
  6. import android.content.Context;
  7. import android.content.DialogInterface;
  8. import android.content.Intent;
  9. import android.content.pm.PackageManager;
  10. import android.database.Cursor;
  11. import android.net.Uri;
  12. import android.os.Bundle;
  13. import android.os.Environment;
  14. import android.os.Looper;
  15. import android.provider.OpenableColumns;
  16. import android.support.annotation.NonNull;
  17. import android.support.v4.app.ActivityCompat;
  18. import android.support.v4.app.Fragment;
  19. import android.support.v4.app.FragmentManager;
  20. import android.support.v4.app.FragmentTransaction;
  21. import android.support.v4.content.ContextCompat;
  22. import android.support.v4.view.GravityCompat;
  23. import android.support.v4.widget.DrawerLayout;
  24. import android.support.v7.app.ActionBarDrawerToggle;
  25. import android.support.v7.app.AlertDialog;
  26. import android.support.v7.app.AppCompatActivity;
  27. import android.support.v7.widget.Toolbar;
  28. import android.view.LayoutInflater;
  29. import android.view.Menu;
  30. import android.view.MenuItem;
  31. import android.view.View;
  32. import android.widget.GridView;
  33. import android.widget.Toast;
  34.  
  35. import java.io.BufferedInputStream;
  36. import java.io.File;
  37. import java.io.FileInputStream;
  38. import java.io.FileNotFoundException;
  39. import java.io.FileOutputStream;
  40. import java.io.IOException;
  41. import java.io.InputStream;
  42. import java.net.HttpURLConnection;
  43. import java.net.MalformedURLException;
  44. import java.net.URL;
  45. import java.util.Random;
  46.  
  47. public class MainActivity extends AppCompatActivity implements EmbPattern.Provider {
  48. final private int REQUEST_CODE_ASK_PERMISSIONS = 100;
  49. final private int REQUEST_CODE_ASK_PERMISSIONS_LOAD = 101;
  50. final private int REQUEST_CODE_ASK_PERMISSIONS_READ = 102;
  51. private static final String TEMPFILE = "TEMP";
  52. private static final String AUTHORITY = "com.embroidermodder.embroideryviewer";
  53. String drawerFragmentTag;
  54. private final int SELECT_FILE = 1;
  55. private DrawView drawView;
  56. private DrawerLayout mainActivity;
  57.  
  58. @Override
  59. protected void onCreate(Bundle savedInstanceState) {
  60. setTheme(R.style.AppTheme_NoActionBar);
  61. super.onCreate(savedInstanceState);
  62. setContentView(R.layout.activity_main);
  63. Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  64.  
  65. setSupportActionBar(toolbar);
  66. Intent intent = getIntent();
  67. threadLoadIntent(intent);
  68.  
  69. mainActivity = (DrawerLayout) findViewById(R.id.mainActivity);
  70. drawView = (DrawView) findViewById(R.id.drawview);
  71. drawView.initWindowSize();
  72.  
  73. ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
  74. this, mainActivity, toolbar, R.string.app_name, R.string.app_name);
  75. mainActivity.addDrawerListener(toggle);
  76. toggle.syncState();
  77. }
  78.  
  79. @Override
  80. protected void onPause() {
  81. super.onPause();
  82. if ((getPattern() != null) && (!getPattern().isEmpty())) {
  83. saveInternalFile(TEMPFILE);
  84. }
  85. }
  86.  
  87. @Override
  88. protected void onResume() {
  89. super.onResume();
  90. if ((getPattern() == null) || (getPattern().isEmpty())) {
  91. loadInternalFile(TEMPFILE);
  92. }
  93. }
  94.  
  95. public void saveInternalFile(String filename) {
  96. try {
  97. FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
  98. EmbWriter writer = new EmbWriterEmm();
  99. writer.write(getPattern(), fos);
  100. fos.flush();
  101. fos.close();
  102. } catch (IOException ioerror) {
  103. }
  104. }
  105.  
  106.  
  107. public void loadInternalFile(String filename) {
  108. try {
  109. FileInputStream fis = openFileInput(filename); //if no file exists, throws error.
  110. EmbReader reader = new EmbReaderEmm();
  111. EmbPattern pattern = new EmbPattern();
  112. reader.read(pattern, fis);
  113. setPattern(pattern);
  114. fis.close();
  115. } catch (IOException ignored) {
  116. } catch (OutOfMemoryError ignored) {
  117. }
  118. }
  119.  
  120. @Override
  121. public void onBackPressed() {
  122. if (dialogDismiss()) {
  123. return;
  124. }
  125. if (tryCloseFragment(ShareFragment.TAG)) {
  126. return;
  127. }
  128. if (mainActivity.isDrawerOpen(GravityCompat.START)) {
  129. mainActivity.closeDrawer(GravityCompat.START);
  130. } else {
  131. super.onBackPressed();
  132. }
  133. }
  134.  
  135. @Override
  136. protected void onNewIntent(Intent intent) { //requires single instance mode, else this does nothing.
  137. super.onNewIntent(intent);
  138. threadLoadIntent(intent);
  139. }
  140.  
  141. @Override
  142. public boolean onCreateOptionsMenu(Menu menu) {
  143. // Inflate the menu; this adds items to the action bar if it is present.
  144. getMenuInflater().inflate(R.menu.menu_main, menu);
  145. return true;
  146. }
  147.  
  148. @Override
  149. public boolean onOptionsItemSelected(MenuItem item) {
  150. // Handle action bar item clicks here. The action bar will
  151. // automatically handle clicks on the Home/Up button, so long
  152. // as you specify a parent activity in AndroidManifest.xml.
  153. int id = item.getItemId();
  154.  
  155. //noinspection SimplifiableIfStatement
  156. switch (id) {
  157. case R.id.action_open_file:
  158. Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  159. Uri uri = Uri.parse(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString());
  160. intent.setDataAndType(uri, "*/*");
  161. startActivityForResult(Intent.createChooser(intent, "Open folder"), SELECT_FILE);
  162. return true;
  163. case R.id.action_show_statistics:
  164. showStatistics();
  165. return true;
  166. case R.id.action_share:
  167. useShareFragment();
  168. break;
  169. case R.id.action_load_file:
  170. dialogDismiss();
  171. makeDialog(R.layout.embroidery_thumbnail_view);
  172. saveFileWrapper(new PermissionRequired() {
  173. @Override
  174. public void openExternalStorage(File root, String data) {
  175. loadFile(root, data);
  176. }
  177. }, Environment.getExternalStorageDirectory(), "");
  178. break;
  179. }
  180. return super.onOptionsItemSelected(item);
  181. }
  182.  
  183. @Override
  184. public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  185. switch (requestCode) {
  186. case REQUEST_CODE_ASK_PERMISSIONS:
  187. if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  188. saveFile(Environment.getExternalStorageDirectory(), "");
  189. } else {
  190. Toast.makeText(MainActivity.this, R.string.write_permissions_denied, Toast.LENGTH_SHORT)
  191. .show();
  192. }
  193. break;
  194. case REQUEST_CODE_ASK_PERMISSIONS_LOAD:
  195. if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  196. loadFile(Environment.getExternalStorageDirectory(), "");
  197. } else {
  198. Toast.makeText(MainActivity.this, R.string.write_permissions_denied, Toast.LENGTH_SHORT)
  199. .show();
  200. }
  201. break;
  202. case REQUEST_CODE_ASK_PERMISSIONS_READ:
  203. if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  204. threadLoadIntent(getIntent()); //restarts the load of the intent.
  205. } else {
  206. Toast.makeText(MainActivity.this, R.string.read_permissions_denied, Toast.LENGTH_SHORT)
  207. .show();
  208. }
  209. break;
  210. default:
  211. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  212. }
  213. }
  214.  
  215. @Override
  216. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  217. super.onActivityResult(requestCode, resultCode, data);
  218. if (resultCode == Activity.RESULT_OK) {
  219. if (requestCode == SELECT_FILE) {
  220. threadLoadIntent(data);
  221. }
  222. }
  223. }
  224.  
  225. interface PermissionRequired {
  226. void openExternalStorage(File root, String data);
  227. }
  228.  
  229. private void saveFileWrapper(PermissionRequired permissionRequired, File root, String data) {
  230. int hasWriteExternalStoragePermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
  231. if (hasWriteExternalStoragePermission != PackageManager.PERMISSION_GRANTED) {
  232. if (!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
  233. showMessageOKCancel(getString(R.string.external_storage_justification),
  234. new DialogInterface.OnClickListener() {
  235. @Override
  236. public void onClick(DialogInterface dialog, int which) {
  237. ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
  238. REQUEST_CODE_ASK_PERMISSIONS);
  239. }
  240. });
  241. return;
  242. }
  243. ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
  244. REQUEST_CODE_ASK_PERMISSIONS);
  245. return;
  246. }
  247. permissionRequired.openExternalStorage(root, data);
  248. }
  249.  
  250. private void callIfLoadIntentStreamIsUnreadableWithoutPermissions() {
  251. int hasReadExternalStoragePermission = ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE);
  252. if (hasReadExternalStoragePermission != PackageManager.PERMISSION_GRANTED) {
  253. if (!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
  254. showMessageOKCancel(getString(R.string.external_storage_justification_read),
  255. new DialogInterface.OnClickListener() {
  256. @Override
  257. public void onClick(DialogInterface dialog, int which) {
  258. ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
  259. REQUEST_CODE_ASK_PERMISSIONS_READ);
  260. }
  261. });
  262. return;
  263. }
  264. ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
  265. REQUEST_CODE_ASK_PERMISSIONS_READ);
  266. return;
  267. }
  268. }
  269.  
  270. private void loadFile(File root, String data) {
  271. GridView list = (GridView) dialogView.findViewById(R.id.embroideryThumbnailList);
  272. File mPath = new File(root + "");
  273. list.setAdapter(new ThumbnailAdapter(MainActivity.this, mPath));
  274. }
  275.  
  276. private void saveFile(File root, String data) {
  277. //todo: this really only save one jef to the root directory. Decide what needs to be done.
  278. try {
  279. int n = 10000;
  280. Random generator = new Random();
  281. n = generator.nextInt(n);
  282. String filename = "Image-" + n + ".jef";
  283. IFormat.Writer format = IFormat.getWriterByFilename(filename);
  284. if (format != null) {
  285. File file = new File(root, filename);
  286. if (file.exists()) {
  287. file.delete();
  288. }
  289. FileOutputStream outputStream = new FileOutputStream(file);
  290. format.write(drawView.getPattern(), outputStream);
  291. outputStream.flush();
  292. outputStream.close();
  293. }
  294. } catch (FileNotFoundException e) {
  295. e.printStackTrace();
  296. } catch (IOException e) {
  297. e.printStackTrace();
  298. }
  299. }
  300.  
  301. Dialog dialog;
  302. View dialogView;
  303.  
  304. public boolean dialogDismiss() {
  305. if ((dialog != null) && (dialog.isShowing())) {
  306. dialog.dismiss();
  307. return true;
  308. }
  309. return false;
  310. }
  311.  
  312. public Dialog makeDialog(int layout) {
  313. LayoutInflater inflater = getLayoutInflater();
  314. dialogView = inflater.inflate(layout, null);
  315. android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(this);
  316. builder.setView(dialogView);
  317.  
  318. if (isFinishing()) {
  319. finish();
  320. startActivity(getIntent());
  321. } else {
  322. dialog = builder.create();
  323. dialog.setCanceledOnTouchOutside(true);
  324. dialog.show();
  325. return dialog;
  326. }
  327. return null;
  328. }
  329.  
  330. private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
  331. new AlertDialog.Builder(MainActivity.this)
  332. .setMessage(message)
  333. .setPositiveButton(R.string.ok, okListener)
  334. .setNegativeButton(R.string.cancel, null)
  335. .create()
  336. .show();
  337. }
  338.  
  339. public void useShareFragment() {
  340. dialogDismiss();
  341. FragmentManager fragmentManager = this.getSupportFragmentManager();
  342. FragmentTransaction transaction = fragmentManager.beginTransaction();
  343. ShareFragment fragment = new ShareFragment();
  344. transaction.add(R.id.mainContentArea, fragment, ShareFragment.TAG);
  345. transaction.commitAllowingStateLoss();
  346. }
  347.  
  348. public void useColorFragment() {
  349. if (drawerFragmentTag != null) {
  350. tryCloseFragment(drawerFragmentTag);
  351. }
  352. FragmentManager fragmentManager = this.getSupportFragmentManager();
  353. FragmentTransaction transaction = fragmentManager.beginTransaction();
  354. ColorStitchBlockFragment fragment = new ColorStitchBlockFragment();
  355. drawerFragmentTag = ColorStitchBlockFragment.TAG;
  356. transaction.add(R.id.drawerContent, fragment, ColorStitchBlockFragment.TAG);
  357. transaction.commit();
  358. }
  359.  
  360. public boolean tryCloseFragment(String tag) {
  361. FragmentManager fragmentManager = getSupportFragmentManager();
  362. Fragment fragmentByTag;
  363. fragmentByTag = fragmentManager.findFragmentByTag(tag);
  364. if (fragmentByTag == null) return false;
  365. FragmentTransaction transaction = fragmentManager.beginTransaction();
  366. transaction.remove(fragmentByTag);
  367. transaction.commit();
  368. if (fragmentByTag instanceof EmbPattern.Listener) {
  369. EmbPattern pattern = getPattern();
  370. if (pattern != null) {
  371. pattern.removeListener((EmbPattern.Listener) fragmentByTag);
  372. }
  373. }
  374. return true;
  375. }
  376.  
  377. public void toast(final int stringResource) {
  378. if (!Looper.getMainLooper().equals(Looper.myLooper())) {
  379. runOnUiThread(new Runnable() {
  380. @Override
  381. public void run() {
  382. toast(stringResource);
  383. }
  384. });
  385. return;
  386. }
  387. Toast toast;
  388. toast = Toast.makeText(this, stringResource, Toast.LENGTH_LONG);
  389. toast.show();
  390. }
  391.  
  392. public void showStatistics() {
  393. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  394. builder.setMessage(drawView.getStatistics());
  395. builder.show();
  396. }
  397.  
  398. public EmbPattern getPattern() {
  399. if (drawView == null) return null;
  400. return drawView.getPattern();
  401. }
  402.  
  403. public void setPattern(final EmbPattern pattern) {
  404. if (!Looper.getMainLooper().equals(Looper.myLooper())) {
  405. runOnUiThread(new Runnable() {
  406. @Override
  407. public void run() {
  408. setPattern(pattern);
  409. }
  410. });
  411. return;
  412. }
  413. drawView.setPattern(pattern);
  414. getPattern().notifyChange(EmbPattern.NOTIFY_LOADED);
  415. drawView.invalidate();
  416. useColorFragment();
  417. }
  418.  
  419.  
  420. public void threadLoadIntent(final Intent intent) {
  421. Thread thread = new Thread(new Runnable() {
  422. @Override
  423. public void run() {
  424. loadFromIntent(intent);
  425. }
  426. });
  427. thread.start();
  428. }
  429.  
  430.  
  431. public Uri getUriFromIntent(Intent intent) {
  432. Uri uri = intent.getData();
  433. if (uri != null) return uri;
  434.  
  435. Bundle bundle = intent.getExtras();
  436. if (bundle == null) return null;
  437.  
  438. Object object = bundle.get(Intent.EXTRA_STREAM);
  439. if (object instanceof Uri) {
  440. return (Uri) object;
  441. }
  442. return null;
  443. }
  444.  
  445. protected String getDisplayNameByUri(Uri uri) {
  446. String filename = null;
  447. if (uri.getScheme().equalsIgnoreCase("content")) {
  448. Cursor returnCursor = getContentResolver().query(uri, null, null, null, null);
  449. if ((returnCursor != null) && (returnCursor.getCount() != 0)) {
  450. int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
  451. if (returnCursor.moveToFirst()) filename = returnCursor.getString(nameIndex);
  452. returnCursor.close();
  453. }
  454. } else {
  455. filename = uri.getPath();
  456. }
  457. return filename;
  458. }
  459.  
  460. protected void loadFromIntent(Intent intent) {
  461. if (intent == null) return;
  462. if (intent.hasExtra("done")) return;
  463. intent.putExtra("done", 1);
  464.  
  465. Uri uri = getUriFromIntent(intent);
  466. if (uri == null) {
  467. String action = intent.getAction();
  468. if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_VIEW.equals(action) || Intent.ACTION_EDIT.equals(action)) {
  469. //todo: toast error message about the URI not being read.
  470. }
  471. return;
  472. }
  473.  
  474. IFormat.Reader reader = null;
  475. String mime = intent.getType();
  476. //reader = IFormat.getReaderByMime(mime); Sometimes the intent *only* has the MIME type and does not have an extention.
  477.  
  478. if (reader == null) {
  479. String name = getDisplayNameByUri(uri);
  480. //String ext = IFormat.getExtentionByDisplayName(name);
  481. //if (ext == null) {
  482. //Toast error message about how the extension doesn't exist and there's no way to know what the file is without mimetype or extension.
  483. //return;
  484. //}
  485. reader = IFormat.getReaderByFilename(name);
  486. if (reader == null) {
  487. toast(R.string.file_type_not_supported);
  488. return;
  489. }
  490. }
  491. //I have a reader.
  492. EmbPattern pattern = null;
  493. switch (uri.getScheme().toLowerCase()) {
  494. case "http":
  495. case "https":
  496. HttpURLConnection connection;
  497. URL url;
  498.  
  499. try {
  500. url = new URL(uri.toString());
  501. } catch (MalformedURLException e) {
  502. toast(R.string.error_file_not_found);
  503. return;
  504. }
  505. try {
  506. connection = (HttpURLConnection) url.openConnection();
  507. connection.getHeaderField(HttpURLConnection.HTTP_LENGTH_REQUIRED);
  508. connection.setReadTimeout(1000);
  509. InputStream in = new BufferedInputStream(connection.getInputStream());
  510. pattern = new EmbPattern();
  511. reader.read(pattern, in);
  512. in.close();
  513. connection.disconnect();
  514. } catch (IOException e) {
  515. toast(R.string.error_file_read_failed);
  516. return;
  517. }
  518. break;
  519. case "content":
  520. case "file":
  521. try {
  522. InputStream fis = getContentResolver().openInputStream(uri);
  523. pattern = new EmbPattern();
  524. reader.read(pattern, fis);
  525. } catch (FileNotFoundException e) {
  526. toast(R.string.error_file_not_found);
  527. return;
  528. } catch (IOException e) {
  529. toast(R.string.error_file_read_failed);
  530. }
  531. break;
  532. }
  533. if (pattern != null) {
  534. setPattern(pattern);
  535. drawView.postInvalidate();
  536. }
  537. }
  538. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement