Skip to content

Commit 72a2bbb

Browse files
Library Updating.
TODO: Testing and documentation of new class.
1 parent 13aa95c commit 72a2bbb

File tree

7 files changed

+257
-29
lines changed

7 files changed

+257
-29
lines changed

androidexternalfilewriter/build.gradle

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ apply plugin: 'com.android.library'
22
apply from: 'https://raw.githubusercontent.com/PrashamTrivedi/JCenter/master/installv1.gradle'
33
apply from: 'https://raw.githubusercontent.com/PrashamTrivedi/JCenter/master/bintrayv1.gradle'
44
android {
5-
compileSdkVersion 22
6-
buildToolsVersion "23.0.0 rc3"
5+
compileSdkVersion 23
6+
buildToolsVersion "23.0.2"
77

88
defaultConfig {
9-
minSdkVersion 8
10-
targetSdkVersion 22
9+
minSdkVersion 10
10+
targetSdkVersion 23
1111
versionCode 1
1212
versionName "1.0"
1313
}
@@ -20,6 +20,7 @@ android {
2020
}
2121

2222
dependencies {
23-
compile 'com.android.support:appcompat-v7:22.+'
23+
compile 'com.android.support:appcompat-v7:23.1.1'
2424
compile fileTree(dir: 'libs', include: ['*.jar'])
25+
compile 'com.celites:devutils:1.0@aar'
2526
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.celites.androidexternalfilewriter;
2+
3+
/**
4+
* Exception to report back developer about media state or storage state if writing is not possible
5+
*/
6+
public class ExternalFileWriterException
7+
extends Exception {
8+
9+
public ExternalFileWriterException(String messege) {
10+
super(messege);
11+
}
12+
13+
}
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
package com.celites.androidexternalfilewriter;
2+
3+
import android.annotation.TargetApi;
4+
import android.app.Activity;
5+
import android.content.Intent;
6+
import android.content.SharedPreferences;
7+
import android.net.Uri;
8+
import android.os.Build.VERSION_CODES;
9+
import android.os.ParcelFileDescriptor;
10+
import android.preference.PreferenceManager;
11+
import android.support.v4.content.ContextCompat;
12+
import android.support.v4.provider.DocumentFile;
13+
import android.text.TextUtils;
14+
import com.ceelites.devutils.ConstantMethods;
15+
import java.io.File;
16+
import java.io.FileNotFoundException;
17+
import java.io.FileOutputStream;
18+
import java.io.IOException;
19+
20+
/**
21+
* Created by Prasham on 12/25/2015.
22+
*/
23+
@TargetApi(VERSION_CODES.LOLLIPOP)
24+
public class SAFFileWriter {
25+
26+
private String PARENT_URI_KEY = "APP_EXTERNAL_PARENT_FILE_URI";
27+
private Activity activity;
28+
private DocumentFile appCacheDirectory;
29+
private DocumentFile appDirectory;
30+
private DocumentFile externalCacheDirectory;
31+
private DocumentFile externalParentFile;
32+
private int requestCode;
33+
private static final String canNotCreateDirectory = "Can not create directory: ";
34+
private static final String canNotWriteFile = "Can not write file: ";
35+
36+
37+
public SAFFileWriter(Activity activity, int requestCode) {
38+
this.activity = activity;
39+
this.requestCode = requestCode;
40+
File[] dirs = ContextCompat.getExternalCacheDirs(activity);
41+
if (dirs.length > 1) {
42+
File dir = dirs[1];
43+
if (dir != null) {
44+
externalCacheDirectory = DocumentFile.fromFile(dir);
45+
} else {
46+
externalCacheDirectory = DocumentFile.fromFile(dirs[0]);
47+
}
48+
} else {
49+
externalCacheDirectory = DocumentFile.fromFile(dirs[0]);
50+
}
51+
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
52+
String externalDirUrl = preferences.getString(PARENT_URI_KEY, "");
53+
if (ConstantMethods.isEmptyString(externalDirUrl)) {
54+
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
55+
activity.startActivityForResult(intent, requestCode);
56+
}
57+
}
58+
59+
public DocumentFile createSubDirectory(String displayName, DocumentFile parentDirectory) {
60+
return parentDirectory.createDirectory(displayName);
61+
}
62+
63+
public DocumentFile createSubdirectory(String directoryName, boolean inCache) {
64+
DocumentFile appDirectory = getAppDirectory(inCache);
65+
return appDirectory.createDirectory(directoryName);
66+
}
67+
68+
public DocumentFile getAppDirectory() {
69+
if (appDirectory == null) {
70+
createAppDirectory();
71+
}
72+
return appDirectory;
73+
}
74+
75+
private void createAppDirectory() {
76+
String directoryName = activity.getString(activity.getApplicationInfo().labelRes);
77+
appDirectory = externalParentFile.createDirectory(directoryName);
78+
appCacheDirectory = externalCacheDirectory.createDirectory(directoryName);
79+
}
80+
81+
public void handleResult(int requestCode, int resultCode, Intent data) {
82+
if (resultCode == Activity.RESULT_OK) {
83+
if (requestCode == this.requestCode) {
84+
Uri treeUri = data.getData();
85+
externalParentFile = DocumentFile.fromTreeUri(activity, treeUri);
86+
87+
88+
}
89+
}
90+
}
91+
92+
public boolean isDirectoryExists(String displayName, DocumentFile parentDirectory) {
93+
DocumentFile file = parentDirectory.findFile(displayName);
94+
return file != null && file.isDirectory();
95+
}
96+
97+
public boolean isDirectoryExists(String displayName, boolean inCache) {
98+
DocumentFile file = getDocumentFile(displayName, inCache);
99+
return file != null && file.isDirectory();
100+
}
101+
102+
private DocumentFile getDocumentFile(String displayName, boolean inCache) {
103+
DocumentFile appDirectory = getAppDirectory(inCache);
104+
return appDirectory.findFile(displayName);
105+
}
106+
107+
public boolean isFileExists(String displayName, boolean inCache) {
108+
DocumentFile file = getDocumentFile(displayName, inCache);
109+
return file != null && file.isFile();
110+
}
111+
112+
public boolean isFileExists(String displayName, DocumentFile parentDirectory) {
113+
DocumentFile file = parentDirectory.findFile(displayName);
114+
return file != null && file.isFile();
115+
}
116+
117+
public void writeDataToFile(String fileName, String mimeType, byte[] data, boolean inCache) throws FileNotFoundException {
118+
DocumentFile appDir = getAppDirectory(inCache);
119+
writeDataToFile(appDir, fileName, data, mimeType);
120+
}
121+
122+
public void writeDataToFile(DocumentFile parent, String fileName, byte[] data, String mimeType) throws FileNotFoundException {
123+
DocumentFile file = createFile(fileName, parent, mimeType);
124+
writeDataToFile(file, data);
125+
}
126+
127+
private void writeDataToFile(DocumentFile file, byte[] data) throws FileNotFoundException {
128+
ParcelFileDescriptor fileDescriptor = activity.getContentResolver().openFileDescriptor(file.getUri(), "w");
129+
FileOutputStream out = null;
130+
if (fileDescriptor != null) {
131+
out = new FileOutputStream(fileDescriptor.getFileDescriptor());
132+
try {
133+
out.write(data);
134+
out.close();
135+
} catch (IOException e) {
136+
e.printStackTrace();
137+
}
138+
}
139+
}
140+
141+
public void writeDataToFile(String fileName, String mimeType, String data, boolean inCache) throws FileNotFoundException {
142+
DocumentFile appDir = getAppDirectory(inCache);
143+
writeDataToFile(appDir, fileName, data, mimeType);
144+
}
145+
146+
public void writeDataToFile(DocumentFile parent, String fileName, String data, String mimeType) throws FileNotFoundException {
147+
DocumentFile file = createFile(fileName, parent, mimeType);
148+
writeDataToFile(file, data);
149+
}
150+
151+
/**
152+
* Write byte array to file. Will show error if given file is a directory.
153+
*
154+
* @param file
155+
* : File where data is to be written.
156+
* @param data
157+
* String which you want to write a file. If size of this is greater than size available, it will show error.
158+
*/
159+
private void writeDataToFile(DocumentFile file, String data) throws FileNotFoundException {
160+
byte[] stringBuffer = data.getBytes();
161+
writeDataToFile(file, stringBuffer);
162+
}
163+
164+
public void writeDataToTimeStampedFile(String mimeType, String data, String extension, boolean inCache) throws FileNotFoundException {
165+
DocumentFile appDir = getAppDirectory(inCache);
166+
String fileExtension = (TextUtils.isEmpty(extension)) ? "" : "." + extension;
167+
String fileName = System.currentTimeMillis() + fileExtension;
168+
writeDataToFile(appDir, fileName, data, mimeType);
169+
}
170+
171+
public void writeDataToTimeStampedFile(String mimeType, byte[] data, String extension, boolean inCache) throws FileNotFoundException {
172+
DocumentFile appDir = getAppDirectory(inCache);
173+
String fileExtension = (TextUtils.isEmpty(extension)) ? "" : "." + extension;
174+
String fileName = System.currentTimeMillis() + fileExtension;
175+
writeDataToFile(appDir, fileName, data, mimeType);
176+
}
177+
178+
public void writeDataToTimeStampedFile(String mimeType, String data, String extension, boolean inCache, DocumentFile parent) throws
179+
FileNotFoundException {
180+
String fileExtension = (TextUtils.isEmpty(extension)) ? "" : "." + extension;
181+
String fileName = System.currentTimeMillis() + fileExtension;
182+
writeDataToFile(parent, fileName, data, mimeType);
183+
}
184+
185+
public void writeDataToTimeStampedFile(String mimeType, byte[] data, String extension, boolean inCache, DocumentFile parent) throws
186+
FileNotFoundException {
187+
String fileExtension = (TextUtils.isEmpty(extension)) ? "" : "." + extension;
188+
String fileName = System.currentTimeMillis() + fileExtension;
189+
writeDataToFile(parent, fileName, data, mimeType);
190+
}
191+
192+
private DocumentFile createFile(String fileName, boolean inCache, String mimeType) {
193+
return createFile(fileName, getAppDirectory(inCache), mimeType);
194+
}
195+
196+
private DocumentFile createFile(String fileName, DocumentFile parent, String mimeType) {
197+
return parent.createFile(mimeType, fileName);
198+
}
199+
200+
public DocumentFile getAppDirectory(boolean inCache) {
201+
return (inCache) ? this.appCacheDirectory : this.appDirectory;
202+
}
203+
204+
}

app/build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
apply plugin: 'com.android.application'
22

33
android {
4-
compileSdkVersion 22
5-
buildToolsVersion "23.0.0 rc3"
4+
compileSdkVersion 23
5+
buildToolsVersion "23.0.2"
66

77
defaultConfig {
88
applicationId "com.celites.appexternalfilewriter"
99
minSdkVersion 16
10-
targetSdkVersion 22
10+
targetSdkVersion 23
1111
versionCode 1
1212
versionName "1.0"
1313
}
@@ -21,7 +21,7 @@ android {
2121

2222
dependencies {
2323
compile fileTree(dir: 'libs', include: ['*.jar'])
24-
compile 'com.android.support:appcompat-v7:22.2.0'
24+
compile 'com.android.support:appcompat-v7:23.1.1'
2525
// compile (':androidexternalfilewriter')
2626
compile project(':androidexternalfilewriter')
2727
}

app/src/main/java/com/celites/appexternalfilewriter/MainActivity.java

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,21 @@
11
package com.celites.appexternalfilewriter;
22

3+
import android.content.Intent;
34
import android.os.Bundle;
45
import android.support.v7.app.AppCompatActivity;
56
import android.view.Menu;
67
import android.view.View;
78
import android.widget.ToggleButton;
89
import com.celites.androidexternalfilewriter.AppExternalFileWriter;
9-
import com.celites.androidexternalfilewriter.AppExternalFileWriter.ExternalFileWriterException;
10+
import com.celites.androidexternalfilewriter.ExternalFileWriterException;
1011
import java.io.File;
1112

1213
public class MainActivity
1314
extends AppCompatActivity {
1415

15-
private AppExternalFileWriter writer;
16-
private File testFolder;
1716
private ToggleButton inCache;
18-
19-
@Override
20-
protected void onCreate(Bundle savedInstanceState) {
21-
super.onCreate(savedInstanceState);
22-
setContentView(R.layout.activity_main);
23-
writer = new AppExternalFileWriter(this);
24-
inCache = (ToggleButton) findViewById(R.id.toggleButton);
25-
}
26-
27-
@Override
28-
public boolean onCreateOptionsMenu(Menu menu) {
29-
// Inflate the menu; this adds items to the action bar if it is present.
30-
getMenuInflater().inflate(R.menu.main, menu);
31-
return true;
32-
}
17+
private File testFolder;
18+
private AppExternalFileWriter writer;
3319

3420
public void createSubFolderInAppFolder(View v) {
3521
try {
@@ -41,6 +27,13 @@ public void createSubFolderInAppFolder(View v) {
4127
}
4228
}
4329

30+
@Override
31+
public boolean onCreateOptionsMenu(Menu menu) {
32+
// Inflate the menu; this adds items to the action bar if it is present.
33+
getMenuInflater().inflate(R.menu.main, menu);
34+
return true;
35+
}
36+
4437
public void writeDataIntoSubFolder(View v) {
4538

4639
try {
@@ -74,4 +67,18 @@ public void writeTimeStampedFile(View v) {
7467
e.printStackTrace();
7568
}
7669
}
70+
71+
@Override
72+
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
73+
super.onActivityResult(requestCode, resultCode, data);
74+
writer.handleResult(requestCode, resultCode, data);
75+
}
76+
77+
@Override
78+
protected void onCreate(Bundle savedInstanceState) {
79+
super.onCreate(savedInstanceState);
80+
setContentView(R.layout.activity_main);
81+
writer = new AppExternalFileWriter(this, true);
82+
inCache = (ToggleButton) findViewById(R.id.toggleButton);
83+
}
7784
}

app/src/main/res/values/styles.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
66
-->
77
<style name="AppBaseTheme"
8-
parent="android:Theme.Light">
8+
parent="Theme.AppCompat.Light.DarkActionBar">
99
<!--
1010
Theme customizations available in newer API levels can go in
1111
res/values-vXX/styles.xml, while customizations related to

build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ buildscript {
55
jcenter()
66
}
77
dependencies {
8-
classpath 'com.android.tools.build:gradle:1.2.3'
8+
classpath 'com.android.tools.build:gradle:2.0.0-alpha2'
99
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
1010
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
1111
// NOTE: Do not place your application dependencies here; they belong
@@ -15,6 +15,9 @@ buildscript {
1515

1616
allprojects {
1717
repositories {
18+
maven {
19+
url "https://github.com/CreativeElites/MvnRepo/raw/master"
20+
}
1821
jcenter()
1922
}
2023
}

0 commit comments

Comments
 (0)