use of com.ichi2.libanki.Collection in project Anki-Android by Ramblurr.
the class NoteService method importMediaToDirectory.
/**
* Considering the field is new, if it has media handle it
*
* @param field
*/
private static void importMediaToDirectory(IField field) {
String tmpMediaPath = null;
switch(field.getType()) {
case AUDIO:
tmpMediaPath = field.getAudioPath();
break;
case IMAGE:
tmpMediaPath = field.getImagePath();
break;
case TEXT:
default:
break;
}
if (tmpMediaPath != null) {
try {
File inFile = new File(tmpMediaPath);
if (inFile.exists()) {
Collection col = AnkiDroidApp.getCol();
String mediaDir = col.getMedia().getDir() + "/";
File mediaDirFile = new File(mediaDir);
File parent = inFile.getParentFile();
// If already there.
if (mediaDirFile.getAbsolutePath().contentEquals(parent.getAbsolutePath())) {
return;
}
File outFile = new File(mediaDir + inFile.getName());
if (!outFile.exists()) {
if (field.hasTemporaryMedia()) {
// Move
inFile.renameTo(outFile);
} else {
// Copy
InputStream in = new FileInputStream(tmpMediaPath);
OutputStream out = new FileOutputStream(outFile.getAbsolutePath());
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
switch(field.getType()) {
case AUDIO:
field.setAudioPath(outFile.getAbsolutePath());
break;
case IMAGE:
field.setImagePath(outFile.getAbsolutePath());
break;
default:
break;
}
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
use of com.ichi2.libanki.Collection in project Anki-Android by Ramblurr.
the class DeckTask method doInBackgroundRebuildCram.
private TaskData doInBackgroundRebuildCram(TaskData... params) {
Log.i(AnkiDroidApp.TAG, "doInBackgroundRebuildCram");
Collection col = params[0].getCollection();
boolean fragmented = params[0].getBoolean();
long did = params[0].getLong();
col.getSched().rebuildDyn(did);
return doInBackgroundUpdateValuesFromDeck(new DeckTask.TaskData(col, new Object[] { true, fragmented }));
}
use of com.ichi2.libanki.Collection in project Anki-Android by Ramblurr.
the class ChartBuilder method getStatisticsDialog.
public static StyledDialog getStatisticsDialog(Context context, DialogInterface.OnClickListener listener, boolean showWholeDeckSelection) {
StyledDialog.Builder builder = new StyledDialog.Builder(context);
builder.setTitle(context.getString(R.string.statistics_type_title));
builder.setIcon(android.R.drawable.ic_menu_sort_by_size);
// set items
String[] items = new String[3];
items[0] = context.getResources().getString(R.string.stats_forecast);
items[1] = context.getResources().getString(R.string.stats_review_count);
items[2] = context.getResources().getString(R.string.stats_review_time);
builder.setItems(items, listener);
// period selection
final RadioButton[] statisticRadioButtons = new RadioButton[3];
RadioGroup rg = new RadioGroup(context);
rg.setOrientation(RadioGroup.HORIZONTAL);
RadioGroup.LayoutParams lp = new RadioGroup.LayoutParams(0, LayoutParams.MATCH_PARENT, 1);
Resources res = context.getResources();
String[] text = res.getStringArray(R.array.stats_period);
int height = context.getResources().getDrawable(R.drawable.white_btn_radio).getIntrinsicHeight();
for (int i = 0; i < statisticRadioButtons.length; i++) {
statisticRadioButtons[i] = new RadioButton(context);
statisticRadioButtons[i].setClickable(true);
statisticRadioButtons[i].setText(" " + text[i]);
statisticRadioButtons[i].setHeight(height * 2);
statisticRadioButtons[i].setSingleLine();
statisticRadioButtons[i].setBackgroundDrawable(null);
statisticRadioButtons[i].setGravity(Gravity.CENTER_VERTICAL);
rg.addView(statisticRadioButtons[i], lp);
}
rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup arg0, int arg1) {
int checked = arg0.getCheckedRadioButtonId();
for (int i = 0; i < 3; i++) {
if (arg0.getChildAt(i).getId() == checked) {
AnkiDroidApp.getSharedPrefs(AnkiDroidApp.getInstance().getBaseContext()).edit().putInt("statsType", i).commit();
break;
}
}
}
});
rg.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, height));
statisticRadioButtons[Math.min(AnkiDroidApp.getSharedPrefs(AnkiDroidApp.getInstance().getBaseContext()).getInt("statsType", Stats.TYPE_MONTH), Stats.TYPE_LIFE)].setChecked(true);
if (showWholeDeckSelection) {
// collection/current deck
final RadioButton[] statisticRadioButtons2 = new RadioButton[2];
RadioGroup rg2 = new RadioGroup(context);
rg2.setOrientation(RadioGroup.HORIZONTAL);
String[] text2 = res.getStringArray(R.array.stats_range);
for (int i = 0; i < statisticRadioButtons2.length; i++) {
statisticRadioButtons2[i] = new RadioButton(context);
statisticRadioButtons2[i].setClickable(true);
statisticRadioButtons2[i].setText(" " + text2[i]);
statisticRadioButtons2[i].setHeight(height * 2);
statisticRadioButtons2[i].setSingleLine();
statisticRadioButtons2[i].setBackgroundDrawable(null);
statisticRadioButtons2[i].setGravity(Gravity.CENTER_VERTICAL);
rg2.addView(statisticRadioButtons2[i], lp);
}
rg2.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup arg0, int arg1) {
AnkiDroidApp.getSharedPrefs(AnkiDroidApp.getInstance().getBaseContext()).edit().putBoolean("statsRange", arg0.getCheckedRadioButtonId() == arg0.getChildAt(0).getId()).commit();
}
});
rg2.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, height));
statisticRadioButtons2[AnkiDroidApp.getSharedPrefs(AnkiDroidApp.getInstance().getBaseContext()).getBoolean("statsRange", true) ? 0 : 1].setChecked(true);
LinearLayout ll = new LinearLayout(context);
ll.setOrientation(LinearLayout.VERTICAL);
ll.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
ll.addView(rg);
ll.addView(rg2);
builder.setView(ll, false, true);
} else {
builder.setView(rg, false, true);
}
return builder.create();
}
use of com.ichi2.libanki.Collection in project Anki-Android by Ramblurr.
the class Media method zipAdded.
// Media syncing - bundling zip files to send to server
// Because there's no standard filename encoding for zips, and because not
// all zip clients support retrieving mtime, we store the files as ascii
// and place a json file in the zip with the necessary information.
// /////////////////////////////////////////////////////
/**
* Add files to a zip until over SYNC_ZIP_SIZE. Return zip data.
*
* @return Returns a tuple with two objects. The first one is the zip file contents, the second a list with the
* filenames of the files inside the zip.
*/
public Pair<File, List<String>> zipAdded() {
File f = new File(mCol.getPath().replaceFirst("collection\\.anki2$", "tmpSyncToServer.zip"));
String sql = "select fname from log where type = " + Integer.toString(MEDIA_ADD);
List<String> filenames = mMediaDb.queryColumn(String.class, sql, 0);
List<String> fnames = new ArrayList<String>();
try {
ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(f)));
zos.setLevel(8);
JSONObject files = new JSONObject();
int cnt = 0;
long sz = 0;
byte[] buffer = new byte[2048];
boolean finished = true;
for (String fname : filenames) {
fnames.add(fname);
File file = new File(getDir(), fname);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file), 2048);
ZipEntry entry = new ZipEntry(Integer.toString(cnt));
zos.putNextEntry(entry);
int count = 0;
while ((count = bis.read(buffer, 0, 2048)) != -1) {
zos.write(buffer, 0, count);
}
zos.closeEntry();
bis.close();
files.put(Integer.toString(cnt), fname);
sz += file.length();
if (sz > SYNC_ZIP_SIZE) {
finished = false;
break;
}
cnt += 1;
}
if (finished) {
zos.putNextEntry(new ZipEntry("_finished"));
zos.closeEntry();
}
zos.putNextEntry(new ZipEntry("_meta"));
zos.write(Utils.jsonToString(files).getBytes());
zos.close();
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
} catch (JSONException e) {
throw new RuntimeException(e);
}
return new Pair<File, List<String>>(f, fnames);
}
use of com.ichi2.libanki.Collection in project Anki-Android by Ramblurr.
the class DeckTask method doInBackgroundReorder.
private TaskData doInBackgroundReorder(TaskData... params) {
Log.i(AnkiDroidApp.TAG, "doInBackgroundReorder");
Object[] data = params[0].getObjArray();
Collection col = (Collection) data[0];
JSONObject conf = (JSONObject) data[1];
col.getSched().resortConf(conf);
return new TaskData(true);
}
Aggregations