diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..77b6e10 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ +# editorconfig.org +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +# indent_size = 4 diff --git a/.gitignore b/.gitignore index 40d5ce0..0b6f89b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,5 @@ -# IntelliJ IDEA -.idea +.idea/ *.iml -classes - -# Gradle -.gradle -build +.gradle/ +build/ local.properties - -*~ -ndk.bin -android-ndk-r10e/ diff --git a/.gitmodules b/.gitmodules index 8b88661..ffcfc90 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,10 @@ -[submodule "pngquant-android/src/main/jni/pngquant"] - path = pngquant-android/src/main/jni/pngquant - url = https://github.com/pornel/pngquant.git -[submodule "pngquant-android/src/main/jni/libpng-android"] - path = pngquant-android/src/main/jni/libpng-android - url = https://github.com/julienr/libpng-android.git +#[submodule "pngquant-android/src/main/jni/pngquant-android"] +# path = pngquant-android/src/main/jni/pngquant-android +# url = https://github.com/wrmndfzzy/pngquant-android.git + +#[submodule "pngquant-android/src/main/jni/libpng-android"] +# path = pngquant-android/src/main/jni/libpng-android +# url = https://github.com/julienr/libpng-android.git +#[submodule "pngquant-android/src/main/jni/pngquant"] +# path = pngquant-android/src/main/jni/pngquant +# url = https://github.com/pornel/pngquant.git diff --git a/app/.gitignore b/app/.gitignore deleted file mode 100755 index 3543521..0000000 --- a/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/app/build.gradle b/app/build.gradle index 34d41ed..7e14aae 100755 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,36 +1,51 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion 26 - defaultConfig { - applicationId "com.wrmndfzzy.atomize" - minSdkVersion 21 - targetSdkVersion 26 - versionCode 1 - versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } - buildTypes { - release { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - debug { - - } - } -} - -dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') - androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { - exclude group: 'com.android.support', module: 'support-annotations' - }) - implementation 'com.android.support:appcompat-v7:26.+' - implementation 'com.android.support:design:26.+' - testImplementation 'junit:junit:4.12' - implementation project(':pngquant-android') - implementation 'id.zelory:compressor:1.0.3' - implementation 'com.github.paolorotolo:appintro:3.4.0' - implementation 'us.feras.mdv:markdownview:1.1.0' -} +apply plugin: 'com.android.application' + +android { + compileSdkVersion 28 + buildToolsVersion "29.0.3" + + defaultConfig { + applicationId "com.wrmndfzzy.atomize" + minSdkVersion 21 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + encoding = 'UTF-8' + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + lintOptions { + disable 'GoogleAppIndexingWarning' + } + + packagingOptions { + exclude 'META-INF/*' + } +} + +dependencies { + implementation files('libs/pngquant-android-release.aar') + + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'com.google.android.material:material:1.1.0' + + //https://github.com/zetbaitsu/Compressor + //implementation 'id.zelory:compressor:3.0.0' + + //https://github.com/AppIntro/AppIntro + implementation 'com.github.AppIntro:AppIntro:5.1.0' + + //https://github.com/falnatsheh/MarkdownView + implementation 'us.feras.mdv:markdownview:1.1.0' +} diff --git a/pngquant-android/pngquant-android-release.aar b/app/libs/pngquant-android-release.aar similarity index 100% rename from pngquant-android/pngquant-android-release.aar rename to app/libs/pngquant-android-release.aar diff --git a/app/src/androidTest/java/com/wrmndfzzy/atomize/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/wrmndfzzy/atomize/ExampleInstrumentedTest.java deleted file mode 100644 index 325024e..0000000 --- a/app/src/androidTest/java/com/wrmndfzzy/atomize/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.wrmndfzy.atomize; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumentation test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() throws Exception { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getTargetContext(); - - assertEquals("com.wrmndfzy.atomize", appContext.getPackageName()); - } -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1ce6dd6..ecdb0ac 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,47 +1,47 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/assets/atomizeLicense.html b/app/src/main/assets/atomizeLicense.html index 12f48db..68bc3fc 100644 --- a/app/src/main/assets/atomizeLicense.html +++ b/app/src/main/assets/atomizeLicense.html @@ -14,6 +14,7 @@ h3, ul { color: #ffffff; } + @@ -320,4 +321,4 @@

- \ No newline at end of file + diff --git a/app/src/main/assets/licenses.html b/app/src/main/assets/licenses.html index 7291053..be23dc5 100644 --- a/app/src/main/assets/licenses.html +++ b/app/src/main/assets/licenses.html @@ -14,6 +14,7 @@ h3, ul { color: #ffffff; } + @@ -434,4 +435,4 @@

- \ No newline at end of file + diff --git a/app/src/main/java/com/wrmndfzzy/atomize/AboutActivity.java b/app/src/main/java/com/wrmndfzzy/atomize/AboutActivity.java index a9a3bd1..ef45a3e 100644 --- a/app/src/main/java/com/wrmndfzzy/atomize/AboutActivity.java +++ b/app/src/main/java/com/wrmndfzzy/atomize/AboutActivity.java @@ -2,14 +2,16 @@ import android.app.Dialog; import android.content.Intent; -import android.support.v7.app.AppCompatActivity; import android.os.Bundle; -import android.view.View; import android.view.Window; -import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; + +import androidx.appcompat.app.AppCompatActivity; + +import com.wrmndfzzy.atomize.intro.IntroActivity; + import us.feras.mdv.MarkdownView; public class AboutActivity extends AppCompatActivity { @@ -22,7 +24,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); - list = (ListView) findViewById(R.id.about_list); + list = findViewById(R.id.about_list); ArrayAdapter adapter = new ArrayAdapter<>(this, R.layout.about_list_item, aboutArray); @@ -32,61 +34,44 @@ protected void onCreate(Bundle savedInstanceState) { addClickListener(); } - private void addClickListener(){ - list.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView av, View v, int pos, - long id) { - if(pos == 0){ - Intent i = new Intent(AboutActivity.this, com.wrmndfzzy.atomize.LicenseActivity.class); - startActivity(i); - } - else if(pos == 1){ - aboutAppDialog(); - } - else if(pos == 2){ - aboutWrmndfzzyDialog(); + private void addClickListener() { + list.setOnItemClickListener((av, v, pos, id) -> { + if (pos == 0) { + Intent i = new Intent(AboutActivity.this, LicenseActivity.class); + startActivity(i); + } else if (pos == 1) { + aboutAppDialog(); + } else if (pos == 2) { + aboutWrmndfzzyDialog(); - } - else{ - Intent i = new Intent(AboutActivity.this, com.wrmndfzzy.atomize.intro.IntroActivity.class); - startActivity(i); - } + } else { + Intent i = new Intent(AboutActivity.this, IntroActivity.class); + startActivity(i); } }); } - protected void aboutAppDialog(){ + protected void aboutAppDialog() { final Dialog aaDialog = new Dialog(AboutActivity.this); aaDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); aaDialog.setTitle("About App"); aaDialog.setContentView(R.layout.aboutapp_dialog); - MarkdownView markdownView = (MarkdownView) aaDialog.findViewById(R.id.atomizeReadme); - Button aaDialogConfirm = (Button) aaDialog.findViewById(R.id.aaDialogConfirm); + MarkdownView markdownView = aaDialog.findViewById(R.id.atomizeReadme); + Button aaDialogConfirm = aaDialog.findViewById(R.id.aaDialogConfirm); markdownView.loadMarkdownFile("file:///android_asset/readme.md", "file:///android_asset/readme.css"); - aaDialogConfirm.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - aaDialog.dismiss(); - } - }); + aaDialogConfirm.setOnClickListener(v -> aaDialog.dismiss()); aaDialog.show(); } - protected void aboutWrmndfzzyDialog(){ + protected void aboutWrmndfzzyDialog() { final Dialog awDialog = new Dialog(AboutActivity.this); awDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); awDialog.setTitle("About Wrmndfzzy"); awDialog.setContentView(R.layout.aboutwrmndfzzy_dialog); - MarkdownView markdownView = (MarkdownView) awDialog.findViewById(R.id.wrmndfzzyReadme); - Button aaDialogConfirm = (Button) awDialog.findViewById(R.id.awDialogConfirm); + MarkdownView markdownView = awDialog.findViewById(R.id.wrmndfzzyReadme); + Button aaDialogConfirm = awDialog.findViewById(R.id.awDialogConfirm); markdownView.loadMarkdownFile("file:///android_asset/wrmndfzzy.md", "file:///android_asset/wrmndfzzy.css"); - aaDialogConfirm.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - awDialog.dismiss(); - } - }); + aaDialogConfirm.setOnClickListener(v -> awDialog.dismiss()); awDialog.show(); } } diff --git a/app/src/main/java/com/wrmndfzzy/atomize/LicenseActivity.java b/app/src/main/java/com/wrmndfzzy/atomize/LicenseActivity.java index 2e5d22d..5c1fb04 100644 --- a/app/src/main/java/com/wrmndfzzy/atomize/LicenseActivity.java +++ b/app/src/main/java/com/wrmndfzzy/atomize/LicenseActivity.java @@ -1,18 +1,17 @@ package com.wrmndfzzy.atomize; -import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.webkit.WebView; -public class LicenseActivity extends AppCompatActivity { +import androidx.appcompat.app.AppCompatActivity; - private WebView licView; +public class LicenseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_license); - licView = (WebView) findViewById(R.id.licViews); + WebView licView = findViewById(R.id.licViews); licView.getSettings().setUseWideViewPort(true); licView.loadUrl("file:///android_asset/licenses.html"); } diff --git a/app/src/main/java/com/wrmndfzzy/atomize/MainActivity.java b/app/src/main/java/com/wrmndfzzy/atomize/MainActivity.java index 3b6d30b..a6142a6 100644 --- a/app/src/main/java/com/wrmndfzzy/atomize/MainActivity.java +++ b/app/src/main/java/com/wrmndfzzy/atomize/MainActivity.java @@ -12,15 +12,11 @@ import android.graphics.Bitmap; import android.net.Uri; import android.os.AsyncTask; +import android.os.Bundle; import android.os.Environment; import android.preference.PreferenceManager; import android.provider.DocumentsContract; import android.provider.MediaStore; -import android.support.annotation.NonNull; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -33,45 +29,143 @@ import android.widget.ProgressBar; import android.widget.Switch; import android.widget.TextView; -import android.support.design.widget.Snackbar; -import java.io.File; -import java.io.IOException; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import com.google.android.material.snackbar.Snackbar; +import com.wrmndfzzy.atomize.intro.IntroActivity; import com.wrmndfzzy.pngquant.LibPngQuant; +import java.io.File; +import java.io.IOException; + public class MainActivity extends AppCompatActivity { - private TextView imgPath; - private ImageView preView; + static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 1; + static final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 2; private static final int SELECT_PICTURE = 1; + public static Activity mA; private static String selectedImagePath; private static String gone = "image does not exist"; - private boolean imgSelected = false; - static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 1; - static final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 2; + public String imageName; File extFolder = new File(Environment.getExternalStorageDirectory() + "/Atomize"); - - private Switch deleteSwitch; - - private Button atomButton; - File input; File output; + Button fnDialogCancel; + Button fnDialogConfirm; + private TextView imgPath; + private ImageView preView; + private boolean imgSelected = false; + private Switch deleteSwitch; + private Button atomButton; private EditText fnEdit; - public String imageName; - private ProgressBar quantProgress; + private String wrongFileType = "wrongfiletype"; - private String wrongFileType="wrongfiletype"; + public static Activity getInstance() { + return mA; + } - Button fnDialogCancel; - Button fnDialogConfirm; + // File path methods taken from aFileChooser, thanks to iPaulPro: https://github.com/iPaulPro/aFileChooser + public static String getPath(final Context context, final Uri uri) { + // DocumentProvider + if (DocumentsContract.isDocumentUri(context, uri)) { + // ExternalStorageProvider + if (isExternalStorageDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; - public static Activity mA; + if ("primary".equalsIgnoreCase(type)) + return Environment.getExternalStorageDirectory() + "/" + split[1]; - public static Activity getInstance(){ - return mA; + } + // DownloadsProvider + else if (isDownloadsDocument(uri)) { + + final String id = DocumentsContract.getDocumentId(uri); + final Uri contentUri = ContentUris.withAppendedId( + Uri.parse("content://downloads/public_downloads"), Long.parseLong(id)); + + return getDataColumn(context, contentUri, null, null); + } + // MediaProvider + else if (isMediaDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + Uri contentUri = null; + if ("image".equals(type)) + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + else if ("video".equals(type)) + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; + else if ("audio".equals(type)) + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; + + final String selection = "_id=?"; + final String[] selectionArgs = new String[]{ + split[1] + }; + + return getDataColumn(context, contentUri, selection, selectionArgs); + } + } + // MediaStore (and general) + else if ("content".equalsIgnoreCase(uri.getScheme())) + return getDataColumn(context, uri, null, null); + // File + else if ("file".equalsIgnoreCase(uri.getScheme())) + return uri.getPath(); + + return null; + } + + public static String getDataColumn(Context context, Uri uri, String selection, + String[] selectionArgs) { + + Cursor cursor = null; + final String column = "_data"; + final String[] projection = { + column + }; + + try { + cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, + null); + if (cursor != null && cursor.moveToFirst()) { + final int column_index = cursor.getColumnIndexOrThrow(column); + return cursor.getString(column_index); + } + } finally { + if (cursor != null) + cursor.close(); + } + return null; + } + + public static boolean isExternalStorageDocument(Uri uri) { + return "com.android.externalstorage.documents".equals(uri.getAuthority()); + } + + public static boolean isDownloadsDocument(Uri uri) { + return "com.android.providers.downloads.documents".equals(uri.getAuthority()); + } + + public static boolean isMediaDocument(Uri uri) { + return "com.android.providers.media.documents".equals(uri.getAuthority()); + } + + public static String getFileType(String path) { + File input = new File(path); + if (!input.exists()) + return gone; + String extension = MimeTypeMap.getFileExtensionFromUrl(path); + Log.d("getFileType", extension); + return extension; } @Override @@ -80,20 +174,17 @@ protected void onCreate(Bundle savedInstanceState) { mA = this; - Thread t = new Thread(new Runnable() { - @Override - public void run() { - // Initialize SharedPreferences - SharedPreferences getPrefs = PreferenceManager - .getDefaultSharedPreferences(getBaseContext()); - // Create a new boolean and preference and set it to true - boolean isFirstStart = getPrefs.getBoolean("firstStart", true); - // If the activity has never started before... - if (isFirstStart) { - // Launch app intro - Intent i = new Intent(MainActivity.this, com.wrmndfzzy.atomize.intro.IntroActivity.class); - startActivity(i); - } + Thread t = new Thread(() -> { + // Initialize SharedPreferences + SharedPreferences getPrefs = PreferenceManager + .getDefaultSharedPreferences(getBaseContext()); + // Create a new boolean and preference and set it to true + boolean isFirstStart = getPrefs.getBoolean("firstStart", true); + // If the activity has never started before... + if (isFirstStart) { + // Launch app intro + Intent i = new Intent(MainActivity.this, IntroActivity.class); + startActivity(i); } }); // Start the thread @@ -101,41 +192,37 @@ public void run() { setContentView(R.layout.activity_main); - imgPath = (TextView) findViewById(R.id.imgPath); - final Button select = (Button) findViewById(R.id.select); - preView = (ImageView) findViewById(R.id.imgPreview); - + imgPath = findViewById(R.id.imgPath); + final Button select = findViewById(R.id.select); + preView = findViewById(R.id.imgPreview); - deleteSwitch = (Switch) findViewById(R.id.deleteSwitch); - atomButton = (Button) findViewById(R.id.atomize); + deleteSwitch = findViewById(R.id.deleteSwitch); - quantProgress = (ProgressBar) findViewById(R.id.progBar); + atomButton = findViewById(R.id.atomize); - select.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - try { - if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) - ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); + quantProgress = findViewById(R.id.progBar); - if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) - ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); - } - catch (Exception e) { - e.printStackTrace(); - } + select.setOnClickListener(v -> { + try { + if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) + ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); - Intent intent = new Intent(); - intent.setType("image/png"); - intent.setAction(Intent.ACTION_GET_CONTENT); - startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE); + if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) + ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); + } catch (Exception e) { + e.printStackTrace(); } + + Intent intent = new Intent(); + intent.setType("image/png"); + intent.setAction(Intent.ACTION_GET_CONTENT); + startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE); }); } @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: { // If request is cancelled, the result arrays are empty. @@ -149,8 +236,7 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String permissi homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(homeIntent); MainActivity.this.finish();*/ - } - else{ + } else { Snackbar.make(findViewById(android.R.id.content), "Read permissions granted!", Snackbar.LENGTH_LONG).show(); } break; @@ -168,8 +254,7 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String permissi homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(homeIntent); MainActivity.this.finish();*/ - } - else{ + } else { Snackbar.make(findViewById(android.R.id.content), "Write permissions granted!", Snackbar.LENGTH_LONG).show(); } break; @@ -211,8 +296,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { e.printStackTrace(); } } - } - else { + } else { Snackbar.make(findViewById(android.R.id.content), "Invalid File Path.", Snackbar.LENGTH_LONG).show(); } } @@ -221,25 +305,23 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { // listen for atomize once picture is chosen public void atomize(View v) { - if(imgSelected){ - if(!extFolder.exists() && !extFolder.isDirectory()){ - try{ - if(!extFolder.mkdirs()) + if (imgSelected) { + if (!extFolder.exists() && !extFolder.isDirectory()) { + try { + if (!extFolder.mkdirs()) Log.e("extFolder", "directory cannot be create"); - } - catch(Exception e){ + } catch (Exception e) { //fileProbDialog(); } } input = new File(selectedImagePath); fileNameDialog(); - } - else{ + } else { Snackbar.make(findViewById(android.R.id.content), "Please select an image.", Snackbar.LENGTH_SHORT).show(); } } - public void execQuantTask(){ + public void execQuantTask() { output = new File(extFolder + "/" + imageName); new AsyncTask() { @Override @@ -247,15 +329,17 @@ protected Void doInBackground(Object... params) { quantize(); return null; } + @Override - protected void onPreExecute(){ + protected void onPreExecute() { Snackbar.make(findViewById(android.R.id.content), "Atomizing...", Snackbar.LENGTH_SHORT).show(); quantProgress.setVisibility(View.VISIBLE); atomButton.setEnabled(false); atomButton.setAlpha(0.4f); } + @Override - protected void onPostExecute(Void v){ + protected void onPostExecute(Void v) { Log.d("quantize", "quantize done"); String noImgText = "No image selected."; Snackbar.make(findViewById(android.R.id.content), "Done! Saved in /sdcard/Atomize.", Snackbar.LENGTH_SHORT).show(); @@ -286,104 +370,14 @@ public void quantize() { } } - // File path methods taken from aFileChooser, thanks to iPaulPro: https://github.com/iPaulPro/aFileChooser - public static String getPath(final Context context, final Uri uri) { - // DocumentProvider - if (DocumentsContract.isDocumentUri(context, uri)) { - // ExternalStorageProvider - if (isExternalStorageDocument(uri)) { - final String docId = DocumentsContract.getDocumentId(uri); - final String[] split = docId.split(":"); - final String type = split[0]; - - if ("primary".equalsIgnoreCase(type)) - return Environment.getExternalStorageDirectory() + "/" + split[1]; - - } - // DownloadsProvider - else if (isDownloadsDocument(uri)) { - - final String id = DocumentsContract.getDocumentId(uri); - final Uri contentUri = ContentUris.withAppendedId( - Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); - - return getDataColumn(context, contentUri, null, null); - } - // MediaProvider - else if (isMediaDocument(uri)) { - final String docId = DocumentsContract.getDocumentId(uri); - final String[] split = docId.split(":"); - final String type = split[0]; - - Uri contentUri = null; - if ("image".equals(type)) - contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; - else if ("video".equals(type)) - contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; - else if ("audio".equals(type)) - contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; - - final String selection = "_id=?"; - final String[] selectionArgs = new String[] { - split[1] - }; - - return getDataColumn(context, contentUri, selection, selectionArgs); - } - } - // MediaStore (and general) - else if ("content".equalsIgnoreCase(uri.getScheme())) - return getDataColumn(context, uri, null, null); - // File - else if ("file".equalsIgnoreCase(uri.getScheme())) - return uri.getPath(); - - return null; - } - - public static String getDataColumn(Context context, Uri uri, String selection, - String[] selectionArgs) { - - Cursor cursor = null; - final String column = "_data"; - final String[] projection = { - column - }; - - try { - cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, - null); - if (cursor != null && cursor.moveToFirst()) { - final int column_index = cursor.getColumnIndexOrThrow(column); - return cursor.getString(column_index); - } - } finally { - if (cursor != null) - cursor.close(); - } - return null; - } - - public static boolean isExternalStorageDocument(Uri uri) { - return "com.android.externalstorage.documents".equals(uri.getAuthority()); - } - - public static boolean isDownloadsDocument(Uri uri) { - return "com.android.providers.downloads.documents".equals(uri.getAuthority()); - } - - public static boolean isMediaDocument(Uri uri) { - return "com.android.providers.media.documents".equals(uri.getAuthority()); - } - public String handleImageType(String path) { String type = getFileType(path); - String pngType ="png"; + String pngType = "png"; if (pngType.equals(type)) { return pngType; - }else if (gone.equals(type)) { + } else if (gone.equals(type)) { return gone; } else { return wrongFileType; @@ -391,50 +385,30 @@ public String handleImageType(String path) { } - public static String getFileType(String path) { - File input = new File(path); - if (!input.exists()) - return gone; - String extension = MimeTypeMap.getFileExtensionFromUrl(path); - Log.d("getFileType", extension); - return extension; - } - - protected void fileNameDialog(){ + protected void fileNameDialog() { final Dialog fnDialog = new Dialog(MainActivity.this); fnDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); fnDialog.setTitle("File Name"); fnDialog.setContentView(R.layout.filename_dialog); - fnEdit = (EditText) fnDialog.findViewById(R.id.fnDialogTextBox); + fnEdit = fnDialog.findViewById(R.id.fnDialogTextBox); imageName = input.getName(); fnEdit.setText(imageName); - fnDialogCancel = (Button) fnDialog.findViewById(R.id.fnDialogCancel); - fnDialogCancel.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - fnDialog.dismiss(); - } - }); - fnDialogConfirm = (Button) fnDialog.findViewById(R.id.fnDialogConfirm); - fnDialogConfirm.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if((fnEdit.getText().toString().indexOf(".png") == (fnEdit.getText().toString().length()-4)) && fnEdit.getText().toString().length() != 3){ - imageName = fnEdit.getText().toString(); - } - else if(fnEdit.getText().toString().length() == 3){ - imageName = fnEdit.getText().toString() + ".png"; - } - else if(fnEdit.getText().toString().length() < 1){ - imageName = input.getName(); - } - else{ - imageName = fnEdit.getText().toString() + ".png"; - } - Log.d("imageName", imageName); - fnDialog.dismiss(); - execQuantTask(); + fnDialogCancel = fnDialog.findViewById(R.id.fnDialogCancel); + fnDialogCancel.setOnClickListener(v -> fnDialog.dismiss()); + fnDialogConfirm = fnDialog.findViewById(R.id.fnDialogConfirm); + fnDialogConfirm.setOnClickListener(v -> { + if ((fnEdit.getText().toString().indexOf(".png") == (fnEdit.getText().toString().length() - 4)) && fnEdit.getText().toString().length() != 3) { + imageName = fnEdit.getText().toString(); + } else if (fnEdit.getText().toString().length() == 3) { + imageName = fnEdit.getText().toString() + ".png"; + } else if (fnEdit.getText().toString().length() < 1) { + imageName = input.getName(); + } else { + imageName = fnEdit.getText().toString() + ".png"; } + Log.d("imageName", imageName); + fnDialog.dismiss(); + execQuantTask(); }); fnDialog.show(); } @@ -447,13 +421,11 @@ public boolean onCreateOptionsMenu(Menu menu) { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch(item.getItemId()){ - case R.id.menu_aboutlink: - Intent i = new Intent(this, AboutActivity.class); - startActivity(i); - return true; - default: - return super.onOptionsItemSelected(item); + if (item.getItemId() == R.id.menu_aboutlink) { + Intent i = new Intent(this, AboutActivity.class); + startActivity(i); + return true; } + return super.onOptionsItemSelected(item); } } diff --git a/app/src/main/java/com/wrmndfzzy/atomize/intro/IntroActivity.java b/app/src/main/java/com/wrmndfzzy/atomize/intro/IntroActivity.java index fda5a21..3734609 100644 --- a/app/src/main/java/com/wrmndfzzy/atomize/intro/IntroActivity.java +++ b/app/src/main/java/com/wrmndfzzy/atomize/intro/IntroActivity.java @@ -5,25 +5,25 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; -import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; -import android.support.annotation.NonNull; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; import android.view.View; import android.view.Window; import android.webkit.WebView; import android.widget.Button; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.fragment.app.Fragment; + import com.github.paolorotolo.appintro.AppIntro2; import com.wrmndfzzy.atomize.MainActivity; import com.wrmndfzzy.atomize.R; -import java.util.ArrayList; - public class IntroActivity extends AppIntro2 { static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 1; @@ -33,9 +33,10 @@ public class IntroActivity extends AppIntro2 { Button pDialogConfirm; - // Please DO NOT override onCreate. Use init. + //TODO: add color @Override - public void init(Bundle savedInstanceState) { + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); getPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); // Create a new boolean and preference and set it to true @@ -45,36 +46,30 @@ public void init(Bundle savedInstanceState) { applicenseDialog(); } - ArrayList colors = new ArrayList<>(); - colors.add(Color.parseColor("#616161")); - colors.add(Color.parseColor("#B71C1C")); - colors.add(Color.parseColor("#0D47A1")); - addSlide(IntroSlideFragment.newInstance(R.layout.intro_slide1)); addSlide(IntroSlideFragment.newInstance(R.layout.intro_slide2)); addSlide(IntroSlideFragment.newInstance(R.layout.intro_slide3)); - if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { addSlide(IntroSlideFragment.newInstance(R.layout.intro_slide4)); - colors.add(Color.parseColor("#1B5E20")); } addSlide(IntroSlideFragment.newInstance(R.layout.intro_slide5)); - colors.add(Color.parseColor("#7B1FA2")); - setAnimationColors(colors); - // OPTIONAL METHODS // Override bar/separator color. - /*setBarColor(Color.parseColor("#3F51B5")); - setSeparatorColor(Color.parseColor("#2196F3"));*/ + /*setBarColor(Color.parseColor("#3F51B5"));*/ // Hide Skip/Done button. setProgressButtonEnabled(true); } @Override - public void onDonePressed() { + public void onDonePressed(Fragment currentFragment) { + super.onSkipPressed(currentFragment); // Do something when users tap on Done button. - if ((ContextCompat.checkSelfPermission(IntroActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)||(ContextCompat.checkSelfPermission(IntroActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { + if ((ContextCompat.checkSelfPermission(IntroActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) + || (ContextCompat.checkSelfPermission(IntroActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED)) { // Make a new preferences editor SharedPreferences.Editor e = getPrefs.edit(); // Edit preference to make it false because we don't want this to run again @@ -82,8 +77,7 @@ public void onDonePressed() { // Apply changes e.apply(); permissionsDialog(); - } - else{ + } else { // Make a new preferences editor SharedPreferences.Editor e = getPrefs.edit(); // Edit preference to make it false because we don't want this to run again @@ -95,30 +89,25 @@ public void onDonePressed() { } @Override - public void onSlideChanged() { + public void onSlideChanged(@Nullable Fragment oldFragment, @Nullable Fragment newFragment) { + super.onSlideChanged(oldFragment, newFragment); // Do something when the slide changes. } - @Override - public void onNextPressed() { - // Do something when users tap on Next button. - } - - public void introPermissions(View v){ + public void introPermissions(View v) { try { if (ContextCompat.checkSelfPermission(IntroActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) ActivityCompat.requestPermissions(IntroActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); if (ContextCompat.checkSelfPermission(IntroActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) ActivityCompat.requestPermissions(IntroActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); } } @Override - public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: { // If request is cancelled, the result arrays are empty. @@ -128,11 +117,10 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String permissi // functionality that depends on this permission. Toast.makeText(IntroActivity.this, "Read permissions are required to run this app.", Toast.LENGTH_LONG).show(); Intent homeIntent = new Intent(Intent.ACTION_MAIN); - homeIntent.addCategory( Intent.CATEGORY_HOME ); + homeIntent.addCategory(Intent.CATEGORY_HOME); homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(homeIntent); - } - else{ + } else { Toast.makeText(IntroActivity.this, "Read permissions granted!", Toast.LENGTH_SHORT).show(); } break; @@ -146,11 +134,10 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String permissi // functionality that depends on this permission. Toast.makeText(IntroActivity.this, "Write permissions are required to run this app.", Toast.LENGTH_LONG).show(); Intent homeIntent = new Intent(Intent.ACTION_MAIN); - homeIntent.addCategory( Intent.CATEGORY_HOME ); + homeIntent.addCategory(Intent.CATEGORY_HOME); homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(homeIntent); - } - else{ + } else { Toast.makeText(IntroActivity.this, "Write permissions granted!", Toast.LENGTH_SHORT).show(); } break; @@ -158,57 +145,48 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String permissi } } - protected void applicenseDialog(){ + protected void applicenseDialog() { final Dialog aLDialog = new Dialog(IntroActivity.this); aLDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); aLDialog.setTitle("License Agreement"); aLDialog.setCancelable(false); aLDialog.setCanceledOnTouchOutside(false); aLDialog.setContentView(R.layout.app_license_dialog); - WebView lic = (WebView) aLDialog.findViewById(R.id.atomizeLic); - Button disagree = (Button) aLDialog.findViewById(R.id.alDialogDisagree); - Button agree = (Button) aLDialog.findViewById(R.id.alDialogAgree); + WebView lic = aLDialog.findViewById(R.id.atomizeLic); + Button disagree = aLDialog.findViewById(R.id.alDialogDisagree); + Button agree = aLDialog.findViewById(R.id.alDialogAgree); lic.getSettings().setUseWideViewPort(true); lic.loadUrl("file:///android_asset/atomizeLicense.html"); - disagree.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - aLDialog.dismiss(); - SharedPreferences.Editor e = getPrefs.edit(); - e.putBoolean("agreedToLicense", false); - e.apply(); - Intent homeIntent = new Intent(Intent.ACTION_MAIN); - homeIntent.addCategory( Intent.CATEGORY_HOME ); - homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - startActivity(homeIntent); - IntroActivity.this.finish(); - MainActivity.getInstance().finish(); - } + disagree.setOnClickListener(v -> { + aLDialog.dismiss(); + SharedPreferences.Editor e = getPrefs.edit(); + e.putBoolean("agreedToLicense", false); + e.apply(); + Intent homeIntent = new Intent(Intent.ACTION_MAIN); + homeIntent.addCategory(Intent.CATEGORY_HOME); + homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(homeIntent); + IntroActivity.this.finish(); + MainActivity.getInstance().finish(); }); - agree.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - SharedPreferences.Editor e = getPrefs.edit(); - e.putBoolean("agreedToLicense", true); - e.apply(); - aLDialog.dismiss(); - } + agree.setOnClickListener(v -> { + SharedPreferences.Editor e = getPrefs.edit(); + e.putBoolean("agreedToLicense", true); + e.apply(); + aLDialog.dismiss(); }); aLDialog.show(); } - protected void permissionsDialog(){ + protected void permissionsDialog() { final Dialog pDialog = new Dialog(IntroActivity.this); pDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); pDialog.setTitle("Missing Permissions"); pDialog.setContentView(R.layout.intro_permissions_dialog); - pDialogConfirm = (Button) pDialog.findViewById(R.id.ipDialogConfirm); - pDialogConfirm.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - pDialog.dismiss(); - IntroActivity.this.finish(); - } + pDialogConfirm = pDialog.findViewById(R.id.ipDialogConfirm); + pDialogConfirm.setOnClickListener(v -> { + pDialog.dismiss(); + IntroActivity.this.finish(); }); pDialog.show(); } diff --git a/app/src/main/java/com/wrmndfzzy/atomize/intro/IntroSlideFragment.java b/app/src/main/java/com/wrmndfzzy/atomize/intro/IntroSlideFragment.java index 9d12137..c238a76 100644 --- a/app/src/main/java/com/wrmndfzzy/atomize/intro/IntroSlideFragment.java +++ b/app/src/main/java/com/wrmndfzzy/atomize/intro/IntroSlideFragment.java @@ -1,12 +1,13 @@ package com.wrmndfzzy.atomize.intro; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; + public class IntroSlideFragment extends Fragment { // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -18,7 +19,7 @@ public IntroSlideFragment() { // Required empty public constructor } - public static IntroSlideFragment newInstance(int layoutResId) { + static IntroSlideFragment newInstance(int layoutResId) { IntroSlideFragment introSlide = new IntroSlideFragment(); Bundle args = new Bundle(); args.putInt(ARG_LAYOUT_RES_ID, layoutResId); diff --git a/app/src/main/res/layout/about_list_item.xml b/app/src/main/res/layout/about_list_item.xml index 45b36a2..59a46ff 100644 --- a/app/src/main/res/layout/about_list_item.xml +++ b/app/src/main/res/layout/about_list_item.xml @@ -1,10 +1,8 @@ - - + - \ No newline at end of file + android:textSize="16sp" /> diff --git a/app/src/main/res/layout/aboutapp_dialog.xml b/app/src/main/res/layout/aboutapp_dialog.xml index ac3ca97..efbd13b 100644 --- a/app/src/main/res/layout/aboutapp_dialog.xml +++ b/app/src/main/res/layout/aboutapp_dialog.xml @@ -1,52 +1,53 @@ + android:background="@color/colorBackground" + android:orientation="vertical"> + android:layout_height="wrap_content"> + android:src="@mipmap/ic_atom" /> + android:textSize="20sp" + android:textStyle="bold" /> + android:scrollbars="vertical" />