@ -0,0 +1,25 @@
|
||||
# Changelog
|
||||
|
||||
### 1.2.0 (March 4, 2016)
|
||||
|
||||
* Ability to export habit data as CSV
|
||||
* Widgets (checkmark, history, score and streaks)
|
||||
* More natural scrolling on data views (fling)
|
||||
* Minor UI improvements on pre-Lollipop devices
|
||||
* Fix crash on Samsung Galaxy TabS 8.4
|
||||
* Other minor bug fixes
|
||||
|
||||
### 1.1.1 (February 24, 2016)
|
||||
|
||||
* Show reminder only on chosen days of the week
|
||||
* Rearrange habits by long-pressing then dragging
|
||||
* Select and modify multiple habits simultaneously
|
||||
* 12/24 hour format according to phone preferences
|
||||
* Permanently delete habits
|
||||
* Usage hints during startup
|
||||
* Translation to Brazilian Portuguese and Chinese
|
||||
* Other minor fixes
|
||||
|
||||
### 1.0.0 (February 19, 2016)
|
||||
|
||||
* Initial release
|
@ -0,0 +1,3 @@
|
||||
delete from Score;
|
||||
delete from Streak;
|
||||
delete from Checkmarks;
|
After Width: | Height: | Size: 35 KiB |
@ -0,0 +1,66 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.commands;
|
||||
|
||||
import org.isoron.helpers.Command;
|
||||
import org.isoron.uhabits.R;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
|
||||
public class CreateHabitCommand extends Command
|
||||
{
|
||||
private Habit model;
|
||||
private Long savedId;
|
||||
|
||||
public CreateHabitCommand(Habit model)
|
||||
{
|
||||
this.model = model;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute()
|
||||
{
|
||||
Habit savedHabit = new Habit(model);
|
||||
if (savedId == null)
|
||||
{
|
||||
savedHabit.save();
|
||||
savedId = savedHabit.getId();
|
||||
}
|
||||
else
|
||||
{
|
||||
savedHabit.save(savedId);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void undo()
|
||||
{
|
||||
Habit.get(savedId).delete();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getExecuteStringId()
|
||||
{
|
||||
return R.string.toast_habit_created;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getUndoStringId()
|
||||
{
|
||||
return R.string.toast_habit_deleted;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.commands;
|
||||
|
||||
import org.isoron.helpers.Command;
|
||||
import org.isoron.uhabits.R;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
|
||||
public class EditHabitCommand extends Command
|
||||
{
|
||||
private Habit original;
|
||||
private Habit modified;
|
||||
private long savedId;
|
||||
private boolean hasIntervalChanged;
|
||||
|
||||
public EditHabitCommand(Habit original, Habit modified)
|
||||
{
|
||||
this.savedId = original.getId();
|
||||
this.modified = new Habit(modified);
|
||||
this.original = new Habit(original);
|
||||
|
||||
hasIntervalChanged = (this.original.freqDen != this.modified.freqDen ||
|
||||
this.original.freqNum != this.modified.freqNum);
|
||||
}
|
||||
|
||||
public void execute()
|
||||
{
|
||||
Habit habit = Habit.get(savedId);
|
||||
habit.copyAttributes(modified);
|
||||
habit.save();
|
||||
if (hasIntervalChanged)
|
||||
{
|
||||
habit.checkmarks.deleteNewerThan(0);
|
||||
habit.streaks.deleteNewerThan(0);
|
||||
habit.scores.deleteNewerThan(0);
|
||||
}
|
||||
}
|
||||
|
||||
public void undo()
|
||||
{
|
||||
Habit habit = Habit.get(savedId);
|
||||
habit.copyAttributes(original);
|
||||
habit.save();
|
||||
if (hasIntervalChanged)
|
||||
{
|
||||
habit.checkmarks.deleteNewerThan(0);
|
||||
habit.streaks.deleteNewerThan(0);
|
||||
habit.scores.deleteNewerThan(0);
|
||||
}
|
||||
}
|
||||
|
||||
public Integer getExecuteStringId()
|
||||
{
|
||||
return R.string.toast_habit_changed;
|
||||
}
|
||||
|
||||
public Integer getUndoStringId()
|
||||
{
|
||||
return R.string.toast_habit_changed_back;
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.commands;
|
||||
|
||||
import org.isoron.helpers.Command;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
|
||||
public class ToggleRepetitionCommand extends Command
|
||||
{
|
||||
private Long offset;
|
||||
private Habit habit;
|
||||
|
||||
public ToggleRepetitionCommand(Habit habit, long offset)
|
||||
{
|
||||
this.offset = offset;
|
||||
this.habit = habit;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute()
|
||||
{
|
||||
habit.repetitions.toggle(offset);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void undo()
|
||||
{
|
||||
execute();
|
||||
}
|
||||
}
|
@ -0,0 +1,194 @@
|
||||
package org.isoron.uhabits.io;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
import android.util.Log;
|
||||
|
||||
import com.activeandroid.Cache;
|
||||
|
||||
import org.isoron.helpers.DateHelper;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
import org.isoron.uhabits.models.Score;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
public class CSVExporter
|
||||
{
|
||||
private List<Habit> habits;
|
||||
private Context context;
|
||||
private java.text.DateFormat dateFormat;
|
||||
|
||||
private List<String> generateDirs;
|
||||
private List<String> generateFilenames;
|
||||
|
||||
private String basePath;
|
||||
|
||||
public CSVExporter(Context context, List<Habit> habits)
|
||||
{
|
||||
this.habits = habits;
|
||||
this.context = context;
|
||||
generateDirs = new LinkedList<>();
|
||||
generateFilenames = new LinkedList<>();
|
||||
|
||||
basePath = String.format("%s/export/", context.getFilesDir());
|
||||
|
||||
dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
|
||||
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
}
|
||||
|
||||
public String formatDate(long timestamp)
|
||||
{
|
||||
return dateFormat.format(new Date(timestamp));
|
||||
}
|
||||
|
||||
public String formatScore(int score)
|
||||
{
|
||||
return String.format("%.2f", ((float) score) / Score.MAX_SCORE);
|
||||
}
|
||||
|
||||
private void writeScores(String dirPath, Habit habit) throws IOException
|
||||
{
|
||||
String path = dirPath + "scores.csv";
|
||||
FileWriter out = new FileWriter(basePath + path);
|
||||
generateFilenames.add(path);
|
||||
|
||||
String query = "select timestamp, score from score where habit = ? order by timestamp";
|
||||
String params[] = { habit.getId().toString() };
|
||||
|
||||
SQLiteDatabase db = Cache.openDatabase();
|
||||
Cursor cursor = db.rawQuery(query, params);
|
||||
|
||||
if(!cursor.moveToFirst()) return;
|
||||
|
||||
do
|
||||
{
|
||||
String timestamp = formatDate(cursor.getLong(0));
|
||||
String score = formatScore(cursor.getInt(1));
|
||||
out.write(String.format("%s,%s\n", timestamp, score));
|
||||
|
||||
} while(cursor.moveToNext());
|
||||
|
||||
out.close();
|
||||
cursor.close();
|
||||
}
|
||||
|
||||
private void writeCheckmarks(String dirPath, Habit habit) throws IOException
|
||||
{
|
||||
String path = dirPath + "checkmarks.csv";
|
||||
FileWriter out = new FileWriter(basePath + path);
|
||||
generateFilenames.add(path);
|
||||
|
||||
String query = "select timestamp, value from checkmarks where habit = ? order by timestamp";
|
||||
String params[] = { habit.getId().toString() };
|
||||
|
||||
SQLiteDatabase db = Cache.openDatabase();
|
||||
Cursor cursor = db.rawQuery(query, params);
|
||||
|
||||
if(!cursor.moveToFirst()) return;
|
||||
|
||||
do
|
||||
{
|
||||
String timestamp = formatDate(cursor.getLong(0));
|
||||
Integer value = cursor.getInt(1);
|
||||
out.write(String.format("%s,%d\n", timestamp, value));
|
||||
|
||||
} while(cursor.moveToNext());
|
||||
|
||||
out.close();
|
||||
cursor.close();
|
||||
}
|
||||
|
||||
private void writeFiles(Habit habit) throws IOException
|
||||
{
|
||||
String path = String.format("%s/", habit.name);
|
||||
new File(basePath + path).mkdirs();
|
||||
generateDirs.add(path);
|
||||
|
||||
writeScores(path, habit);
|
||||
writeCheckmarks(path, habit);
|
||||
}
|
||||
|
||||
private void writeZipFile(String zipFilename) throws IOException
|
||||
{
|
||||
FileOutputStream fos = new FileOutputStream(zipFilename);
|
||||
ZipOutputStream zos = new ZipOutputStream(fos);
|
||||
|
||||
for(String filename : generateFilenames)
|
||||
addFileToZip(zos, filename);
|
||||
|
||||
zos.close();
|
||||
fos.close();
|
||||
}
|
||||
|
||||
private void addFileToZip(ZipOutputStream zos, String filename) throws IOException
|
||||
{
|
||||
FileInputStream fis = new FileInputStream(new File(basePath + filename));
|
||||
ZipEntry ze = new ZipEntry(filename);
|
||||
zos.putNextEntry(ze);
|
||||
|
||||
int length;
|
||||
byte bytes[] = new byte[1024];
|
||||
while((length = fis.read(bytes)) >= 0)
|
||||
zos.write(bytes, 0, length);
|
||||
|
||||
zos.closeEntry();
|
||||
fis.close();
|
||||
}
|
||||
|
||||
private void cleanup()
|
||||
{
|
||||
for(String filename : generateFilenames)
|
||||
new File(basePath + filename).delete();
|
||||
|
||||
for(String filename : generateDirs)
|
||||
new File(basePath + filename).delete();
|
||||
|
||||
new File(basePath).delete();
|
||||
}
|
||||
|
||||
public String writeArchive()
|
||||
{
|
||||
String date = formatDate(DateHelper.getStartOfToday());
|
||||
|
||||
File dir = context.getExternalCacheDir();
|
||||
|
||||
if(dir == null)
|
||||
{
|
||||
Log.e("CSVExporter", "No suitable directory found.");
|
||||
return null;
|
||||
}
|
||||
|
||||
String zipFilename = String.format("%s/habits-%s.zip", dir, date);
|
||||
|
||||
try
|
||||
{
|
||||
for (Habit h : habits)
|
||||
writeFiles(h);
|
||||
|
||||
writeZipFile(zipFilename);
|
||||
cleanup();
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
|
||||
return zipFilename;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,175 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.models;
|
||||
|
||||
import android.database.Cursor;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
|
||||
import com.activeandroid.ActiveAndroid;
|
||||
import com.activeandroid.Cache;
|
||||
import com.activeandroid.query.Delete;
|
||||
import com.activeandroid.query.Select;
|
||||
|
||||
import org.isoron.helpers.DateHelper;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class CheckmarkList
|
||||
{
|
||||
private Habit habit;
|
||||
|
||||
public CheckmarkList(Habit habit)
|
||||
{
|
||||
this.habit = habit;
|
||||
}
|
||||
|
||||
public void deleteNewerThan(long timestamp)
|
||||
{
|
||||
new Delete().from(Checkmark.class)
|
||||
.where("habit = ?", habit.getId())
|
||||
.and("timestamp >= ?", timestamp)
|
||||
.execute();
|
||||
}
|
||||
|
||||
public int[] getValues(Long fromTimestamp, Long toTimestamp)
|
||||
{
|
||||
rebuild();
|
||||
|
||||
if(fromTimestamp > toTimestamp) return new int[0];
|
||||
|
||||
String query = "select value, timestamp from Checkmarks where " +
|
||||
"habit = ? and timestamp >= ? and timestamp <= ?";
|
||||
|
||||
SQLiteDatabase db = Cache.openDatabase();
|
||||
String args[] = { habit.getId().toString(), fromTimestamp.toString(),
|
||||
toTimestamp.toString() };
|
||||
Cursor cursor = db.rawQuery(query, args);
|
||||
|
||||
long day = DateHelper.millisecondsInOneDay;
|
||||
int nDays = (int) ((toTimestamp - fromTimestamp) / day) + 1;
|
||||
int[] checks = new int[nDays];
|
||||
|
||||
if (cursor.moveToFirst())
|
||||
{
|
||||
do
|
||||
{
|
||||
long timestamp = cursor.getLong(1);
|
||||
int offset = (int) ((timestamp - fromTimestamp) / day);
|
||||
checks[nDays - offset - 1] = cursor.getInt(0);
|
||||
|
||||
} while (cursor.moveToNext());
|
||||
}
|
||||
|
||||
cursor.close();
|
||||
return checks;
|
||||
}
|
||||
|
||||
public int[] getAllValues()
|
||||
{
|
||||
Repetition oldestRep = habit.repetitions.getOldest();
|
||||
if(oldestRep == null) return new int[0];
|
||||
|
||||
Long toTimestamp = DateHelper.getStartOfToday();
|
||||
Long fromTimestamp = oldestRep.timestamp;
|
||||
return getValues(fromTimestamp, toTimestamp);
|
||||
}
|
||||
|
||||
public void rebuild()
|
||||
{
|
||||
long beginning;
|
||||
long today = DateHelper.getStartOfToday();
|
||||
long day = DateHelper.millisecondsInOneDay;
|
||||
|
||||
Checkmark newestCheckmark = getNewest();
|
||||
if (newestCheckmark == null)
|
||||
{
|
||||
Repetition oldestRep = habit.repetitions.getOldest();
|
||||
if (oldestRep == null) return;
|
||||
|
||||
beginning = oldestRep.timestamp;
|
||||
}
|
||||
else
|
||||
{
|
||||
beginning = newestCheckmark.timestamp + day;
|
||||
}
|
||||
|
||||
if (beginning > today) return;
|
||||
|
||||
long beginningExtended = beginning - (long) (habit.freqDen) * day;
|
||||
List<Repetition> reps = habit.repetitions.selectFromTo(beginningExtended, today).execute();
|
||||
|
||||
int nDays = (int) ((today - beginning) / day) + 1;
|
||||
int nDaysExtended = (int) ((today - beginningExtended) / day) + 1;
|
||||
|
||||
int checks[] = new int[nDaysExtended];
|
||||
|
||||
// explicit checks
|
||||
for (Repetition rep : reps)
|
||||
{
|
||||
int offset = (int) ((rep.timestamp - beginningExtended) / day);
|
||||
checks[nDaysExtended - offset - 1] = 2;
|
||||
}
|
||||
|
||||
// implicit checks
|
||||
for (int i = 0; i < nDays; i++)
|
||||
{
|
||||
int counter = 0;
|
||||
|
||||
for (int j = 0; j < habit.freqDen; j++)
|
||||
if (checks[i + j] == 2) counter++;
|
||||
|
||||
if (counter >= habit.freqNum) checks[i] = Math.max(checks[i], 1);
|
||||
}
|
||||
|
||||
ActiveAndroid.beginTransaction();
|
||||
|
||||
try
|
||||
{
|
||||
for (int i = 0; i < nDays; i++)
|
||||
{
|
||||
Checkmark c = new Checkmark();
|
||||
c.habit = habit;
|
||||
c.timestamp = today - i * day;
|
||||
c.value = checks[i];
|
||||
c.save();
|
||||
}
|
||||
|
||||
ActiveAndroid.setTransactionSuccessful();
|
||||
} finally
|
||||
{
|
||||
ActiveAndroid.endTransaction();
|
||||
}
|
||||
}
|
||||
|
||||
public Checkmark getNewest()
|
||||
{
|
||||
return new Select().from(Checkmark.class)
|
||||
.where("habit = ?", habit.getId())
|
||||
.orderBy("timestamp desc")
|
||||
.limit(1)
|
||||
.executeSingle();
|
||||
}
|
||||
|
||||
public int getCurrentValue()
|
||||
{
|
||||
rebuild();
|
||||
Checkmark c = getNewest();
|
||||
|
||||
if(c != null) return c.value;
|
||||
else return 0;
|
||||
}
|
||||
}
|
@ -0,0 +1,96 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.models;
|
||||
|
||||
import com.activeandroid.query.Delete;
|
||||
import com.activeandroid.query.From;
|
||||
import com.activeandroid.query.Select;
|
||||
|
||||
import org.isoron.helpers.DateHelper;
|
||||
|
||||
public class RepetitionList
|
||||
{
|
||||
|
||||
private Habit habit;
|
||||
|
||||
public RepetitionList(Habit habit)
|
||||
{
|
||||
this.habit = habit;
|
||||
}
|
||||
|
||||
protected From select()
|
||||
{
|
||||
return new Select().from(Repetition.class)
|
||||
.where("habit = ?", habit.getId())
|
||||
.orderBy("timestamp");
|
||||
}
|
||||
|
||||
protected From selectFromTo(long timeFrom, long timeTo)
|
||||
{
|
||||
return select().and("timestamp >= ?", timeFrom).and("timestamp <= ?", timeTo);
|
||||
}
|
||||
|
||||
public boolean contains(long timestamp)
|
||||
{
|
||||
int count = select().where("timestamp = ?", timestamp).count();
|
||||
return (count > 0);
|
||||
}
|
||||
|
||||
public void delete(long timestamp)
|
||||
{
|
||||
new Delete().from(Repetition.class)
|
||||
.where("habit = ?", habit.getId())
|
||||
.and("timestamp = ?", timestamp)
|
||||
.execute();
|
||||
}
|
||||
|
||||
public Repetition getOldestNewerThan(long timestamp)
|
||||
{
|
||||
return select().where("timestamp > ?", timestamp).limit(1).executeSingle();
|
||||
}
|
||||
|
||||
public void toggle(long timestamp)
|
||||
{
|
||||
if (contains(timestamp))
|
||||
{
|
||||
delete(timestamp);
|
||||
}
|
||||
else
|
||||
{
|
||||
Repetition rep = new Repetition();
|
||||
rep.habit = habit;
|
||||
rep.timestamp = timestamp;
|
||||
rep.save();
|
||||
}
|
||||
|
||||
habit.scores.deleteNewerThan(timestamp);
|
||||
habit.checkmarks.deleteNewerThan(timestamp);
|
||||
habit.streaks.deleteNewerThan(timestamp);
|
||||
}
|
||||
|
||||
public Repetition getOldest()
|
||||
{
|
||||
return (Repetition) select().limit(1).executeSingle();
|
||||
}
|
||||
|
||||
public boolean hasImplicitRepToday()
|
||||
{
|
||||
long today = DateHelper.getStartOfToday();
|
||||
int reps[] = habit.checkmarks.getValues(today - DateHelper.millisecondsInOneDay, today);
|
||||
return (reps[0] > 0);
|
||||
}
|
||||
}
|
@ -0,0 +1,163 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.models;
|
||||
|
||||
import android.database.Cursor;
|
||||
import android.database.sqlite.SQLiteDatabase;
|
||||
|
||||
import com.activeandroid.ActiveAndroid;
|
||||
import com.activeandroid.Cache;
|
||||
import com.activeandroid.query.Delete;
|
||||
import com.activeandroid.query.Select;
|
||||
|
||||
import org.isoron.helpers.DateHelper;
|
||||
|
||||
public class ScoreList
|
||||
{
|
||||
private Habit habit;
|
||||
|
||||
public ScoreList(Habit habit)
|
||||
{
|
||||
this.habit = habit;
|
||||
}
|
||||
|
||||
public int getCurrentStarStatus()
|
||||
{
|
||||
int score = getNewestValue();
|
||||
|
||||
if(score >= Score.FULL_STAR_CUTOFF) return 2;
|
||||
else if(score >= Score.HALF_STAR_CUTOFF) return 1;
|
||||
else return 0;
|
||||
}
|
||||
|
||||
public Score getNewest()
|
||||
{
|
||||
return new Select().from(Score.class)
|
||||
.where("habit = ?", habit.getId())
|
||||
.orderBy("timestamp desc")
|
||||
.limit(1)
|
||||
.executeSingle();
|
||||
}
|
||||
|
||||
public void deleteNewerThan(long timestamp)
|
||||
{
|
||||
new Delete().from(Score.class)
|
||||
.where("habit = ?", habit.getId())
|
||||
.and("timestamp >= ?", timestamp)
|
||||
.execute();
|
||||
}
|
||||
|
||||
public Integer getNewestValue()
|
||||
{
|
||||
int beginningScore;
|
||||
long beginningTime;
|
||||
|
||||
long today = DateHelper.getStartOfDay(DateHelper.getLocalTime());
|
||||
long day = DateHelper.millisecondsInOneDay;
|
||||
|
||||
double freq = ((double) habit.freqNum) / habit.freqDen;
|
||||
double multiplier = Math.pow(0.5, 1.0 / (14.0 / freq - 1));
|
||||
|
||||
Score newestScore = getNewest();
|
||||
if (newestScore == null)
|
||||
{
|
||||
Repetition oldestRep = habit.repetitions.getOldest();
|
||||
if (oldestRep == null) return 0;
|
||||
beginningTime = oldestRep.timestamp;
|
||||
beginningScore = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
beginningTime = newestScore.timestamp + day;
|
||||
beginningScore = newestScore.score;
|
||||
}
|
||||
|
||||
long nDays = (today - beginningTime) / day;
|
||||
if (nDays < 0) return newestScore.score;
|
||||
|
||||
int reps[] = habit.checkmarks.getValues(beginningTime, today);
|
||||
|
||||
ActiveAndroid.beginTransaction();
|
||||
int lastScore = beginningScore;
|
||||
|
||||
try
|
||||
{
|
||||
for (int i = 0; i < reps.length; i++)
|
||||
{
|
||||
Score s = new Score();
|
||||
s.habit = habit;
|
||||
s.timestamp = beginningTime + day * i;
|
||||
s.score = (int) (lastScore * multiplier);
|
||||
if (reps[reps.length - i - 1] == 2)
|
||||
{
|
||||
s.score += 1000000;
|
||||
s.score = Math.min(s.score, Score.MAX_SCORE);
|
||||
}
|
||||
s.save();
|
||||
|
||||
lastScore = s.score;
|
||||
}
|
||||
|
||||
ActiveAndroid.setTransactionSuccessful();
|
||||
} finally
|
||||
{
|
||||
ActiveAndroid.endTransaction();
|
||||
}
|
||||
|
||||
return lastScore;
|
||||
}
|
||||
|
||||
public int[] getAllValues(Long fromTimestamp, Long toTimestamp, Integer divisor)
|
||||
{
|
||||
Long offset = toTimestamp - (divisor - 1) * DateHelper.millisecondsInOneDay;
|
||||
|
||||
String query = "select ((timestamp - ?) / ?) as time, avg(score) from Score " +
|
||||
"where habit = ? and timestamp > ? and timestamp <= ? " +
|
||||
"group by time order by time desc";
|
||||
|
||||
String params[] = { offset.toString(), divisor.toString(), habit.getId().toString(),
|
||||
fromTimestamp.toString(), toTimestamp.toString()};
|
||||
|
||||
SQLiteDatabase db = Cache.openDatabase();
|
||||
Cursor cursor = db.rawQuery(query, params);
|
||||
|
||||
if(!cursor.moveToFirst()) return new int[0];
|
||||
|
||||
int k = 0;
|
||||
int[] scores = new int[cursor.getCount()];
|
||||
|
||||
do
|
||||
{
|
||||
scores[k++] = (int) cursor.getLong(1);
|
||||
}
|
||||
while (cursor.moveToNext());
|
||||
|
||||
cursor.close();
|
||||
return scores;
|
||||
|
||||
}
|
||||
|
||||
public int[] getAllValues(int divisor)
|
||||
{
|
||||
Repetition oldestRep = habit.repetitions.getOldest();
|
||||
if(oldestRep == null) return new int[0];
|
||||
|
||||
long fromTimestamp = oldestRep.timestamp;
|
||||
long toTimestamp = DateHelper.getStartOfToday();
|
||||
return getAllValues(fromTimestamp, toTimestamp, divisor);
|
||||
}
|
||||
}
|
@ -0,0 +1,126 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.models;
|
||||
|
||||
import com.activeandroid.ActiveAndroid;
|
||||
import com.activeandroid.query.Delete;
|
||||
import com.activeandroid.query.Select;
|
||||
|
||||
import org.isoron.helpers.DateHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class StreakList
|
||||
{
|
||||
private Habit habit;
|
||||
|
||||
public StreakList(Habit habit)
|
||||
{
|
||||
this.habit = habit;
|
||||
}
|
||||
|
||||
public List<Streak> getAll()
|
||||
{
|
||||
rebuild();
|
||||
|
||||
return new Select().from(Streak.class)
|
||||
.where("habit = ?", habit.getId())
|
||||
.orderBy("end asc")
|
||||
.execute();
|
||||
}
|
||||
|
||||
public Streak getNewest()
|
||||
{
|
||||
return new Select().from(Streak.class)
|
||||
.where("habit = ?", habit.getId())
|
||||
.orderBy("end desc")
|
||||
.limit(1)
|
||||
.executeSingle();
|
||||
}
|
||||
|
||||
public void rebuild()
|
||||
{
|
||||
long beginning;
|
||||
long today = DateHelper.getStartOfToday();
|
||||
long day = DateHelper.millisecondsInOneDay;
|
||||
|
||||
Streak newestStreak = getNewest();
|
||||
if (newestStreak != null)
|
||||
{
|
||||
beginning = newestStreak.start;
|
||||
}
|
||||
else
|
||||
{
|
||||
Repetition oldestRep = habit.repetitions.getOldest();
|
||||
if (oldestRep == null) return;
|
||||
|
||||
beginning = oldestRep.timestamp;
|
||||
}
|
||||
|
||||
if (beginning > today) return;
|
||||
|
||||
int checks[] = habit.checkmarks.getValues(beginning, today);
|
||||
ArrayList<Long> list = new ArrayList<>();
|
||||
|
||||
long current = beginning;
|
||||
list.add(current);
|
||||
|
||||
for (int i = 1; i < checks.length; i++)
|
||||
{
|
||||
current += day;
|
||||
int j = checks.length - i - 1;
|
||||
|
||||
if ((checks[j + 1] == 0 && checks[j] > 0)) list.add(current);
|
||||
if ((checks[j + 1] > 0 && checks[j] == 0)) list.add(current - day);
|
||||
}
|
||||
|
||||
if (list.size() % 2 == 1) list.add(current);
|
||||
|
||||
ActiveAndroid.beginTransaction();
|
||||
|
||||
if(newestStreak != null) newestStreak.delete();
|
||||
|
||||
try
|
||||
{
|
||||
for (int i = 0; i < list.size(); i += 2)
|
||||
{
|
||||
Streak streak = new Streak();
|
||||
streak.habit = habit;
|
||||
streak.start = list.get(i);
|
||||
streak.end = list.get(i + 1);
|
||||
streak.length = (streak.end - streak.start) / day + 1;
|
||||
streak.save();
|
||||
}
|
||||
|
||||
ActiveAndroid.setTransactionSuccessful();
|
||||
}
|
||||
finally
|
||||
{
|
||||
ActiveAndroid.endTransaction();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void deleteNewerThan(long timestamp)
|
||||
{
|
||||
new Delete().from(Streak.class)
|
||||
.where("habit = ?", habit.getId())
|
||||
.and("end >= ?", timestamp - DateHelper.millisecondsInOneDay)
|
||||
.execute();
|
||||
}
|
||||
}
|
@ -0,0 +1,203 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.views;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.Typeface;
|
||||
import android.os.Build;
|
||||
import android.text.Layout;
|
||||
import android.text.StaticLayout;
|
||||
import android.text.TextPaint;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
|
||||
import org.isoron.helpers.ColorHelper;
|
||||
import org.isoron.uhabits.R;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
|
||||
public class CheckmarkView extends View
|
||||
{
|
||||
private Paint pCard;
|
||||
private Paint pIcon;
|
||||
|
||||
private int primaryColor;
|
||||
private int backgroundColor;
|
||||
private int timesColor;
|
||||
private int darkGrey;
|
||||
|
||||
private int width;
|
||||
private int height;
|
||||
private int leftMargin;
|
||||
private int topMargin;
|
||||
private int padding;
|
||||
private String label;
|
||||
|
||||
private String fa_check;
|
||||
private String fa_times;
|
||||
private String fa_full_star;
|
||||
private String fa_half_star;
|
||||
private String fa_empty_star;
|
||||
|
||||
private int check_status;
|
||||
private int star_status;
|
||||
|
||||
private Rect rect;
|
||||
private TextPaint textPaint;
|
||||
private StaticLayout labelLayout;
|
||||
|
||||
public CheckmarkView(Context context)
|
||||
{
|
||||
super(context);
|
||||
init(context);
|
||||
}
|
||||
|
||||
public CheckmarkView(Context context, AttributeSet attrs)
|
||||
{
|
||||
super(context, attrs);
|
||||
init(context);
|
||||
}
|
||||
|
||||
private void init(Context context)
|
||||
{
|
||||
Typeface fontawesome =
|
||||
Typeface.createFromAsset(context.getAssets(), "fontawesome-webfont.ttf");
|
||||
|
||||
pCard = new Paint();
|
||||
pCard.setAntiAlias(true);
|
||||
|
||||
pIcon = new Paint();
|
||||
pIcon.setAntiAlias(true);
|
||||
pIcon.setTypeface(fontawesome);
|
||||
pIcon.setTextAlign(Paint.Align.CENTER);
|
||||
|
||||
textPaint = new TextPaint();
|
||||
textPaint.setColor(Color.WHITE);
|
||||
textPaint.setAntiAlias(true);
|
||||
|
||||
fa_check = context.getString(R.string.fa_check);
|
||||
fa_times = context.getString(R.string.fa_times);
|
||||
fa_empty_star = context.getString(R.string.fa_star_o);
|
||||
fa_half_star = context.getString(R.string.fa_star_half_o);
|
||||
fa_full_star = context.getString(R.string.fa_star);
|
||||
|
||||
primaryColor = ColorHelper.palette[10];
|
||||
backgroundColor = Color.argb(255, 255, 255, 255);
|
||||
timesColor = Color.argb(128, 255, 255, 255);
|
||||
darkGrey = Color.argb(64, 0, 0, 0);
|
||||
|
||||
rect = new Rect();
|
||||
check_status = 2;
|
||||
star_status = 0;
|
||||
label = "Wake up early";
|
||||
}
|
||||
|
||||
public void setHabit(Habit habit)
|
||||
{
|
||||
this.check_status = habit.checkmarks.getCurrentValue();
|
||||
this.star_status = habit.scores.getCurrentStarStatus();
|
||||
this.primaryColor = Color.argb(230, Color.red(habit.color), Color.green(habit.color), Color.blue(habit.color));
|
||||
this.label = habit.name;
|
||||
updateLabel();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas)
|
||||
{
|
||||
super.onDraw(canvas);
|
||||
|
||||
drawBackground(canvas);
|
||||
drawCheckmark(canvas);
|
||||
drawLabel(canvas);
|
||||
}
|
||||
|
||||
private void drawBackground(Canvas canvas)
|
||||
{
|
||||
int color = (check_status == 2 ? primaryColor : darkGrey);
|
||||
|
||||
pCard.setColor(color);
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
|
||||
canvas.drawRoundRect(leftMargin, topMargin, width - leftMargin, height - topMargin, padding,
|
||||
padding, pCard);
|
||||
else
|
||||
canvas.drawRect(leftMargin, topMargin, width - leftMargin, height - topMargin, pCard);
|
||||
}
|
||||
|
||||
private void drawCheckmark(Canvas canvas)
|
||||
{
|
||||
String text = (check_status == 0 ? fa_times : fa_check);
|
||||
int color = (check_status == 2 ? Color.WHITE : timesColor);
|
||||
|
||||
pIcon.setColor(color);
|
||||
pIcon.setTextSize(width * 0.5f);
|
||||
pIcon.getTextBounds(text, 0, 1, rect);
|
||||
|
||||
// canvas.drawLine(0, 0.67f * height, width, 0.67f * height, pIcon);
|
||||
|
||||
int y = (int) ((0.67f * height - rect.bottom - rect.top) / 2);
|
||||
canvas.drawText(text, width / 2, y, pIcon);
|
||||
}
|
||||
|
||||
private void drawLabel(Canvas canvas)
|
||||
{
|
||||
canvas.save();
|
||||
float y;
|
||||
int nLines = labelLayout.getLineCount();
|
||||
|
||||
if(nLines == 1)
|
||||
y = height * 0.8f - padding;
|
||||
else
|
||||
y = height * 0.7f - padding;
|
||||
|
||||
canvas.translate(leftMargin + padding, y);
|
||||
|
||||
labelLayout.draw(canvas);
|
||||
canvas.restore();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
|
||||
{
|
||||
int width = MeasureSpec.getSize(widthMeasureSpec);
|
||||
setMeasuredDimension(width, (int) (width * 1.25));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onSizeChanged(int width, int height, int oldWidth, int oldHeight)
|
||||
{
|
||||
this.width = getMeasuredWidth();
|
||||
this.height = getMeasuredHeight();
|
||||
|
||||
leftMargin = (int) (width * 0.015);
|
||||
topMargin = (int) (height * 0.015);
|
||||
padding = 8 * leftMargin;
|
||||
textPaint.setTextSize(0.15f * width);
|
||||
|
||||
updateLabel();
|
||||
}
|
||||
|
||||
private void updateLabel()
|
||||
{
|
||||
textPaint.setColor(Color.WHITE);
|
||||
labelLayout = new StaticLayout(label, textPaint, width - 2 * leftMargin - 2 * padding,
|
||||
Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,198 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.widgets;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.appwidget.AppWidgetProvider;
|
||||
import android.content.Context;
|
||||
import android.content.SharedPreferences;
|
||||
import android.graphics.Bitmap;
|
||||
import android.media.Image;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.RemoteViews;
|
||||
|
||||
import org.isoron.helpers.DialogHelper;
|
||||
import org.isoron.uhabits.R;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
public abstract class BaseWidgetProvider extends AppWidgetProvider
|
||||
{
|
||||
|
||||
private int width, height;
|
||||
|
||||
protected abstract int getDefaultHeight();
|
||||
|
||||
protected abstract int getDefaultWidth();
|
||||
|
||||
protected abstract PendingIntent getOnClickPendingIntent(Context context, Habit habit);
|
||||
|
||||
protected abstract int getLayoutId();
|
||||
|
||||
protected abstract View buildCustomView(Context context, Habit habit);
|
||||
|
||||
public static String getHabitIdKey(long widgetId)
|
||||
{
|
||||
return String.format("widget-%06d-habit", widgetId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeleted(Context context, int[] appWidgetIds)
|
||||
{
|
||||
Context appContext = context.getApplicationContext();
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
|
||||
|
||||
for(Integer id : appWidgetIds)
|
||||
prefs.edit().remove(getHabitIdKey(id));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager,
|
||||
int appWidgetId, Bundle newOptions)
|
||||
{
|
||||
updateWidget(context, appWidgetManager, appWidgetId, newOptions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate(Context context, AppWidgetManager manager, int[] appWidgetIds)
|
||||
{
|
||||
for(int id : appWidgetIds)
|
||||
{
|
||||
Bundle options = null;
|
||||
|
||||
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN)
|
||||
options = manager.getAppWidgetOptions(id);
|
||||
|
||||
updateWidget(context, manager, id, options);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateWidget(Context context, AppWidgetManager manager, int widgetId, Bundle options)
|
||||
{
|
||||
updateWidgetSize(context, options);
|
||||
|
||||
Context appContext = context.getApplicationContext();
|
||||
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), getLayoutId());
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext);
|
||||
|
||||
Long habitId = prefs.getLong(getHabitIdKey(widgetId), -1L);
|
||||
if(habitId < 0) return;
|
||||
|
||||
Habit habit = Habit.get(habitId);
|
||||
View widgetView = buildCustomView(context, habit);
|
||||
measureCustomView(context, width, height, widgetView);
|
||||
|
||||
widgetView.setDrawingCacheEnabled(true);
|
||||
widgetView.buildDrawingCache(true);
|
||||
Bitmap drawingCache = widgetView.getDrawingCache();
|
||||
|
||||
remoteViews.setTextViewText(R.id.label, habit.name);
|
||||
remoteViews.setImageViewBitmap(R.id.imageView, drawingCache);
|
||||
|
||||
//savePreview(context, widgetId, drawingCache);
|
||||
|
||||
PendingIntent onClickIntent = getOnClickPendingIntent(context, habit);
|
||||
if(onClickIntent != null) remoteViews.setOnClickPendingIntent(R.id.imageView, onClickIntent);
|
||||
|
||||
manager.updateAppWidget(widgetId, remoteViews);
|
||||
}
|
||||
|
||||
private void savePreview(Context context, int widgetId, Bitmap widgetCache)
|
||||
{
|
||||
try
|
||||
{
|
||||
LayoutInflater inflater = LayoutInflater.from(context);
|
||||
View view = inflater.inflate(getLayoutId(), null);
|
||||
|
||||
ImageView iv = (ImageView) view.findViewById(R.id.imageView);
|
||||
iv.setImageBitmap(widgetCache);
|
||||
|
||||
view.measure(width, height);
|
||||
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
|
||||
view.setDrawingCacheEnabled(true);
|
||||
view.buildDrawingCache();
|
||||
Bitmap previewCache = view.getDrawingCache();
|
||||
|
||||
String filename = String.format("%s/%d.png", context.getExternalCacheDir(), widgetId);
|
||||
Log.d("BaseWidgetProvider", String.format("Writing %s", filename));
|
||||
FileOutputStream out = new FileOutputStream(filename);
|
||||
|
||||
if(previewCache != null)
|
||||
previewCache.compress(Bitmap.CompressFormat.PNG, 100, out);
|
||||
|
||||
out.close();
|
||||
}
|
||||
catch (IOException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void updateWidgetSize(Context context, Bundle options)
|
||||
{
|
||||
int maxWidth = getDefaultWidth();
|
||||
int minWidth = getDefaultWidth();
|
||||
int maxHeight = getDefaultHeight();
|
||||
int minHeight = getDefaultHeight();
|
||||
|
||||
if (options != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
|
||||
{
|
||||
maxWidth = (int) DialogHelper.dpToPixels(context,
|
||||
options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH));
|
||||
maxHeight = (int) DialogHelper.dpToPixels(context,
|
||||
options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT));
|
||||
minWidth = (int) DialogHelper.dpToPixels(context,
|
||||
options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH));
|
||||
minHeight = (int) DialogHelper.dpToPixels(context,
|
||||
options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT));
|
||||
}
|
||||
|
||||
width = maxWidth;
|
||||
height = maxHeight;
|
||||
}
|
||||
|
||||
private void measureCustomView(Context context, int w, int h, View customView)
|
||||
{
|
||||
LayoutInflater inflater = LayoutInflater.from(context);
|
||||
View entireView = inflater.inflate(getLayoutId(), null);
|
||||
|
||||
int specWidth = View.MeasureSpec.makeMeasureSpec(w, View.MeasureSpec.EXACTLY);
|
||||
int specHeight = View.MeasureSpec.makeMeasureSpec(h, View.MeasureSpec.EXACTLY);
|
||||
|
||||
entireView.measure(specWidth, specHeight);
|
||||
entireView.layout(0, 0, entireView.getMeasuredWidth(), entireView.getMeasuredHeight());
|
||||
|
||||
View imageView = entireView.findViewById(R.id.imageView);
|
||||
w = imageView.getMeasuredWidth();
|
||||
h = imageView.getMeasuredHeight();
|
||||
|
||||
specWidth = View.MeasureSpec.makeMeasureSpec(w, View.MeasureSpec.EXACTLY);
|
||||
specHeight = View.MeasureSpec.makeMeasureSpec(h, View.MeasureSpec.EXACTLY);
|
||||
customView.measure(specWidth, specHeight);
|
||||
customView.layout(0, 0, customView.getMeasuredWidth(), customView.getMeasuredHeight());
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.isoron.uhabits.widgets;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
|
||||
import org.isoron.uhabits.HabitBroadcastReceiver;
|
||||
import org.isoron.uhabits.R;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
import org.isoron.uhabits.views.CheckmarkView;
|
||||
|
||||
public class CheckmarkWidgetProvider extends BaseWidgetProvider
|
||||
{
|
||||
@Override
|
||||
protected View buildCustomView(Context context, Habit habit)
|
||||
{
|
||||
CheckmarkView view = new CheckmarkView(context);
|
||||
view.setHabit(habit);
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected PendingIntent getOnClickPendingIntent(Context context, Habit habit)
|
||||
{
|
||||
return HabitBroadcastReceiver.buildCheckIntent(context, habit, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getDefaultHeight()
|
||||
{
|
||||
return 200;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getDefaultWidth()
|
||||
{
|
||||
return 200;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId()
|
||||
{
|
||||
return R.layout.widget_checkmark;
|
||||
}
|
||||
}
|
@ -0,0 +1,90 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.isoron.uhabits.widgets;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ArrayAdapter;
|
||||
import android.widget.ListView;
|
||||
|
||||
import org.isoron.uhabits.MainActivity;
|
||||
import org.isoron.uhabits.R;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
import org.isoron.uhabits.widgets.BaseWidgetProvider;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class HabitPickerDialog extends Activity implements AdapterView.OnItemClickListener
|
||||
{
|
||||
|
||||
private Integer widgetId;
|
||||
private ArrayList<Long> habitIds;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState)
|
||||
{
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.widget_configure_activity);
|
||||
|
||||
Intent intent = getIntent();
|
||||
Bundle extras = intent.getExtras();
|
||||
|
||||
if (extras != null) widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID,
|
||||
AppWidgetManager.INVALID_APPWIDGET_ID);
|
||||
|
||||
ListView listView = (ListView) findViewById(R.id.listView);
|
||||
|
||||
habitIds = new ArrayList<>();
|
||||
ArrayList<String> habitNames = new ArrayList<>();
|
||||
|
||||
List<Habit> habits = Habit.getAll(false);
|
||||
for(Habit h : habits)
|
||||
{
|
||||
habitIds.add(h.getId());
|
||||
habitNames.add(h.name);
|
||||
}
|
||||
|
||||
ArrayAdapter<String> adapter =
|
||||
new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, habitNames);
|
||||
listView.setAdapter(adapter);
|
||||
listView.setOnItemClickListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
|
||||
{
|
||||
Long habitId = habitIds.get(position);
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(
|
||||
getApplicationContext());
|
||||
prefs.edit().putLong(BaseWidgetProvider.getHabitIdKey(widgetId), habitId).commit();
|
||||
|
||||
MainActivity.updateWidgets(this);
|
||||
|
||||
Intent resultValue = new Intent();
|
||||
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
|
||||
setResult(RESULT_OK, resultValue);
|
||||
finish();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.isoron.uhabits.widgets;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
|
||||
import org.isoron.uhabits.R;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
import org.isoron.uhabits.views.HabitHistoryView;
|
||||
|
||||
public class HistoryWidgetProvider extends BaseWidgetProvider
|
||||
{
|
||||
@Override
|
||||
protected View buildCustomView(Context context, Habit habit)
|
||||
{
|
||||
HabitHistoryView view = new HabitHistoryView(context, null);
|
||||
view.setHabit(habit);
|
||||
view.setIsBackgroundTransparent(true);
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected PendingIntent getOnClickPendingIntent(Context context, Habit habit)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getDefaultHeight()
|
||||
{
|
||||
return 200;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getDefaultWidth()
|
||||
{
|
||||
return 200;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId()
|
||||
{
|
||||
return R.layout.widget_graph;
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.isoron.uhabits.widgets;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
|
||||
import org.isoron.uhabits.R;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
import org.isoron.uhabits.views.HabitScoreView;
|
||||
|
||||
public class ScoreWidgetProvider extends BaseWidgetProvider
|
||||
{
|
||||
@Override
|
||||
protected View buildCustomView(Context context, Habit habit)
|
||||
{
|
||||
HabitScoreView view = new HabitScoreView(context, null);
|
||||
view.setIsBackgroundTransparent(true);
|
||||
view.setHabit(habit);
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected PendingIntent getOnClickPendingIntent(Context context, Habit habit)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getDefaultHeight()
|
||||
{
|
||||
return 200;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getDefaultWidth()
|
||||
{
|
||||
return 200;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId()
|
||||
{
|
||||
return R.layout.widget_graph;
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
/* Copyright (C) 2016 Alinson Santos Xavier
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, either version 3 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package org.isoron.uhabits.widgets;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.view.View;
|
||||
|
||||
import org.isoron.uhabits.R;
|
||||
import org.isoron.uhabits.models.Habit;
|
||||
import org.isoron.uhabits.views.HabitStreakView;
|
||||
|
||||
public class StreakWidgetProvider extends BaseWidgetProvider
|
||||
{
|
||||
@Override
|
||||
protected View buildCustomView(Context context, Habit habit)
|
||||
{
|
||||
HabitStreakView view = new HabitStreakView(context, null);
|
||||
view.setIsBackgroundTransparent(true);
|
||||
view.setHabit(habit);
|
||||
return view;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected PendingIntent getOnClickPendingIntent(Context context, Habit habit)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getDefaultHeight()
|
||||
{
|
||||
return 200;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getDefaultWidth()
|
||||
{
|
||||
return 200;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getLayoutId()
|
||||
{
|
||||
return R.layout.widget_graph;
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 244 B |
Before Width: | Height: | Size: 822 B |
Before Width: | Height: | Size: 552 B |
Before Width: | Height: | Size: 192 B |
Before Width: | Height: | Size: 554 B |
Before Width: | Height: | Size: 394 B |
Before Width: | Height: | Size: 289 B |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 716 B |
Before Width: | Height: | Size: 439 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.0 KiB |
@ -1,26 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
<item android:top="40dp">
|
||||
<shape android:shape="rectangle" >
|
||||
<gradient
|
||||
android:startColor="#30000000"
|
||||
android:endColor="#00000000"
|
||||
android:angle="270"/>
|
||||
</shape>
|
||||
</item>
|
||||
<item android:top="21dp" android:bottom="2dp">
|
||||
<shape android:shape="rectangle" >
|
||||
<gradient
|
||||
android:angle="270"
|
||||
android:endColor="#ccffffff"
|
||||
android:startColor="#ffffff" />
|
||||
</shape>
|
||||
</item>
|
||||
<item android:bottom="21dp">
|
||||
<shape android:shape="rectangle" >
|
||||
<solid android:color="#ffffff" />
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
</layer-list>
|
@ -1,5 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
|
||||
</layer-list>
|
@ -1,14 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
|
||||
|
||||
<item android:bottom="28dp">
|
||||
<shape android:shape="rectangle" >
|
||||
<gradient
|
||||
android:angle="270"
|
||||
android:endColor="#00000000"
|
||||
android:height="1px"
|
||||
android:startColor="#08000000" />
|
||||
</shape>
|
||||
</item>
|
||||
|
||||
</layer-list>
|
@ -1,7 +0,0 @@
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<item android:drawable="@drawable/habits_item_check_pressed" android:state_pressed="true"></item>
|
||||
<item android:drawable="@drawable/habits_item_check_pressed" android:state_focused="true"></item>
|
||||
<item android:drawable="@drawable/habits_item_check_normal"></item>
|
||||
|
||||
</selector>
|
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
|
||||
<solid android:color="#3f000000" />
|
||||
<corners android:radius="4dp" />
|
||||
</shape>
|
After Width: | Height: | Size: 4.8 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 6.6 KiB |
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:padding="4dp">
|
||||
|
||||
<org.isoron.uhabits.views.CheckmarkView
|
||||
android:id="@+id/imageView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:adjustViewBounds="true"
|
||||
/>
|
||||
|
||||
</LinearLayout>
|
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:padding="0dp">
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/imageView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:adjustViewBounds="true"
|
||||
/>
|
||||
|
||||
</LinearLayout>
|
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<ListView android:id="@+id/listView"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
</ListView>
|
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@drawable/widget_background"
|
||||
android:gravity="center"
|
||||
android:orientation="vertical"
|
||||
android:paddingTop="4dp"
|
||||
android:paddingBottom="0dp"
|
||||
android:paddingLeft="8dp"
|
||||
android:paddingRight="8dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="center"
|
||||
android:text="Habit"
|
||||
android:textColor="#ffffff"/>
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/imageView"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:adjustViewBounds="true"
|
||||
/>
|
||||
|
||||
|
||||
</LinearLayout>
|
@ -1,16 +1,18 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context="org.isoron.uhabits.MainActivity" >
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context="org.isoron.uhabits.MainActivity">
|
||||
|
||||
<item android:id="@+id/action_show_archived"
|
||||
android:title="@string/show_archived"
|
||||
android:enabled="true"
|
||||
android:checkable="true" />
|
||||
<item
|
||||
android:id="@+id/action_show_archived"
|
||||
android:checkable="true"
|
||||
android:enabled="true"
|
||||
android:title="@string/show_archived"/>
|
||||
|
||||
<item
|
||||
android:id="@+id/action_settings"
|
||||
android:orderInCategory="100"
|
||||
android:showAsAction="never"
|
||||
android:title="@string/action_settings"/>
|
||||
android:title="@string/action_settings"
|
||||
app:showAsAction="never"/>
|
||||
|
||||
</menu>
|
||||
|
@ -1,9 +1,11 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context="org.isoron.uhabits.MainActivity" >
|
||||
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context="org.isoron.uhabits.MainActivity">
|
||||
|
||||
<item
|
||||
android:id="@+id/action_add"
|
||||
android:title="@string/add_habit" android:showAsAction="always" android:icon="@drawable/ic_action_add"/>
|
||||
android:icon="@drawable/ic_action_add"
|
||||
android:title="@string/add_habit"
|
||||
android:showAsAction="always"/>
|
||||
|
||||
</menu>
|
||||
|
@ -1,12 +1,12 @@
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context="org.isoron.uhabits.ShowHabitActivity" >
|
||||
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
tools:context="org.isoron.uhabits.ShowHabitActivity">
|
||||
|
||||
<item
|
||||
android:id="@+id/action_settings"
|
||||
android:orderInCategory="100"
|
||||
android:showAsAction="never"
|
||||
android:title="@string/action_settings"/>
|
||||
android:title="@string/action_settings"
|
||||
app:showAsAction="never"/>
|
||||
|
||||
</menu>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 6.0 KiB |
After Width: | Height: | Size: 8.5 KiB |
@ -1,372 +1,373 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string translatable="false" name="fa_glass"></string>
|
||||
<string translatable="false" name="fa_music"></string>
|
||||
<string translatable="false" name="fa_search"></string>
|
||||
<string translatable="false" name="fa_envelope_o"></string>
|
||||
<string translatable="false" name="fa_heart"></string>
|
||||
<string translatable="false" name="fa_star"></string>
|
||||
<string translatable="false" name="fa_star_o"></string>
|
||||
<string translatable="false" name="fa_user"></string>
|
||||
<string translatable="false" name="fa_film"></string>
|
||||
<string translatable="false" name="fa_th_large"></string>
|
||||
<string translatable="false" name="fa_th"></string>
|
||||
<string translatable="false" name="fa_th_list"></string>
|
||||
<!--<string translatable="false" name="fa_star_half"></string>-->
|
||||
<string translatable="false" name="fa_star_half_o"></string>
|
||||
<string translatable="false" name="fa_check"></string>
|
||||
<string translatable="false" name="fa_times"></string>
|
||||
<string translatable="false" name="fa_search_plus"></string>
|
||||
<string translatable="false" name="fa_search_minus"></string>
|
||||
<string translatable="false" name="fa_power_off"></string>
|
||||
<string translatable="false" name="fa_signal"></string>
|
||||
<string translatable="false" name="fa_cog"></string>
|
||||
<string translatable="false" name="fa_trash_o"></string>
|
||||
<string translatable="false" name="fa_home"></string>
|
||||
<string translatable="false" name="fa_file_o"></string>
|
||||
<string translatable="false" name="fa_clock_o"></string>
|
||||
<string translatable="false" name="fa_road"></string>
|
||||
<string translatable="false" name="fa_download"></string>
|
||||
<string translatable="false" name="fa_arrow_circle_o_down"></string>
|
||||
<string translatable="false" name="fa_arrow_circle_o_up"></string>
|
||||
<string translatable="false" name="fa_inbox"></string>
|
||||
<string translatable="false" name="fa_play_circle_o"></string>
|
||||
<string translatable="false" name="fa_repeat"></string>
|
||||
<string translatable="false" name="fa_refresh"></string>
|
||||
<string translatable="false" name="fa_list_alt"></string>
|
||||
<string translatable="false" name="fa_lock"></string>
|
||||
<string translatable="false" name="fa_flag"></string>
|
||||
<string translatable="false" name="fa_headphones"></string>
|
||||
<string translatable="false" name="fa_volume_off"></string>
|
||||
<string translatable="false" name="fa_volume_down"></string>
|
||||
<string translatable="false" name="fa_volume_up"></string>
|
||||
<string translatable="false" name="fa_qrcode"></string>
|
||||
<string translatable="false" name="fa_barcode"></string>
|
||||
<string translatable="false" name="fa_tag"></string>
|
||||
<string translatable="false" name="fa_tags"></string>
|
||||
<string translatable="false" name="fa_book"></string>
|
||||
<string translatable="false" name="fa_bookmark"></string>
|
||||
<string translatable="false" name="fa_print"></string>
|
||||
<string translatable="false" name="fa_camera"></string>
|
||||
<string translatable="false" name="fa_font"></string>
|
||||
<string translatable="false" name="fa_bold"></string>
|
||||
<string translatable="false" name="fa_italic"></string>
|
||||
<string translatable="false" name="fa_text_height"></string>
|
||||
<string translatable="false" name="fa_text_width"></string>
|
||||
<string translatable="false" name="fa_align_left"></string>
|
||||
<string translatable="false" name="fa_align_center"></string>
|
||||
<string translatable="false" name="fa_align_right"></string>
|
||||
<string translatable="false" name="fa_align_justify"></string>
|
||||
<string translatable="false" name="fa_list"></string>
|
||||
<string translatable="false" name="fa_outdent"></string>
|
||||
<string translatable="false" name="fa_indent"></string>
|
||||
<string translatable="false" name="fa_video_camera"></string>
|
||||
<string translatable="false" name="fa_picture_o"></string>
|
||||
<string translatable="false" name="fa_pencil"></string>
|
||||
<string translatable="false" name="fa_map_marker"></string>
|
||||
<string translatable="false" name="fa_adjust"></string>
|
||||
<string translatable="false" name="fa_tint"></string>
|
||||
<string translatable="false" name="fa_pencil_square_o"></string>
|
||||
<string translatable="false" name="fa_share_square_o"></string>
|
||||
<string translatable="false" name="fa_check_square_o"></string>
|
||||
<string translatable="false" name="fa_arrows"></string>
|
||||
<string translatable="false" name="fa_step_backward"></string>
|
||||
<string translatable="false" name="fa_fast_backward"></string>
|
||||
<string translatable="false" name="fa_backward"></string>
|
||||
<string translatable="false" name="fa_play"></string>
|
||||
<string translatable="false" name="fa_pause"></string>
|
||||
<string translatable="false" name="fa_stop"></string>
|
||||
<string translatable="false" name="fa_forward"></string>
|
||||
<string translatable="false" name="fa_fast_forward"></string>
|
||||
<string translatable="false" name="fa_step_forward"></string>
|
||||
<string translatable="false" name="fa_eject"></string>
|
||||
<string translatable="false" name="fa_chevron_left"></string>
|
||||
<string translatable="false" name="fa_chevron_right"></string>
|
||||
<string translatable="false" name="fa_plus_circle"></string>
|
||||
<string translatable="false" name="fa_minus_circle"></string>
|
||||
<string translatable="false" name="fa_times_circle"></string>
|
||||
<string translatable="false" name="fa_check_circle"></string>
|
||||
<string translatable="false" name="fa_question_circle"></string>
|
||||
<string translatable="false" name="fa_info_circle"></string>
|
||||
<string translatable="false" name="fa_crosshairs"></string>
|
||||
<string translatable="false" name="fa_times_circle_o"></string>
|
||||
<string translatable="false" name="fa_check_circle_o"></string>
|
||||
<string translatable="false" name="fa_ban"></string>
|
||||
<string translatable="false" name="fa_arrow_left"></string>
|
||||
<string translatable="false" name="fa_arrow_right"></string>
|
||||
<string translatable="false" name="fa_arrow_up"></string>
|
||||
<string translatable="false" name="fa_arrow_down"></string>
|
||||
<string translatable="false" name="fa_share"></string>
|
||||
<string translatable="false" name="fa_expand"></string>
|
||||
<string translatable="false" name="fa_compress"></string>
|
||||
<string translatable="false" name="fa_plus"></string>
|
||||
<string translatable="false" name="fa_minus"></string>
|
||||
<string translatable="false" name="fa_asterisk"></string>
|
||||
<string translatable="false" name="fa_exclamation_circle"></string>
|
||||
<string translatable="false" name="fa_gift"></string>
|
||||
<string translatable="false" name="fa_leaf"></string>
|
||||
<string translatable="false" name="fa_fire"></string>
|
||||
<string translatable="false" name="fa_eye"></string>
|
||||
<string translatable="false" name="fa_eye_slash"></string>
|
||||
<string translatable="false" name="fa_exclamation_triangle"></string>
|
||||
<string translatable="false" name="fa_plane"></string>
|
||||
<string translatable="false" name="fa_calendar"></string>
|
||||
<string translatable="false" name="fa_random"></string>
|
||||
<string translatable="false" name="fa_comment"></string>
|
||||
<string translatable="false" name="fa_magnet"></string>
|
||||
<string translatable="false" name="fa_chevron_up"></string>
|
||||
<string translatable="false" name="fa_chevron_down"></string>
|
||||
<string translatable="false" name="fa_retweet"></string>
|
||||
<string translatable="false" name="fa_shopping_cart"></string>
|
||||
<string translatable="false" name="fa_folder"></string>
|
||||
<string translatable="false" name="fa_folder_open"></string>
|
||||
<string translatable="false" name="fa_arrows_v"></string>
|
||||
<string translatable="false" name="fa_arrows_h"></string>
|
||||
<string translatable="false" name="fa_bar_chart_o"></string>
|
||||
<string translatable="false" name="fa_twitter_square"></string>
|
||||
<string translatable="false" name="fa_facebook_square"></string>
|
||||
<string translatable="false" name="fa_camera_retro"></string>
|
||||
<string translatable="false" name="fa_key"></string>
|
||||
<string translatable="false" name="fa_cogs"></string>
|
||||
<string translatable="false" name="fa_comments"></string>
|
||||
<string translatable="false" name="fa_thumbs_o_up"></string>
|
||||
<string translatable="false" name="fa_thumbs_o_down"></string>
|
||||
<string translatable="false" name="fa_star_half"></string>
|
||||
<string translatable="false" name="fa_heart_o"></string>
|
||||
<string translatable="false" name="fa_sign_out"></string>
|
||||
<string translatable="false" name="fa_linkedin_square"></string>
|
||||
<string translatable="false" name="fa_thumb_tack"></string>
|
||||
<string translatable="false" name="fa_external_link"></string>
|
||||
<string translatable="false" name="fa_sign_in"></string>
|
||||
<string translatable="false" name="fa_trophy"></string>
|
||||
<string translatable="false" name="fa_github_square"></string>
|
||||
<string translatable="false" name="fa_upload"></string>
|
||||
<string translatable="false" name="fa_lemon_o"></string>
|
||||
<string translatable="false" name="fa_phone"></string>
|
||||
<string translatable="false" name="fa_square_o"></string>
|
||||
<string translatable="false" name="fa_bookmark_o"></string>
|
||||
<string translatable="false" name="fa_phone_square"></string>
|
||||
<string translatable="false" name="fa_twitter"></string>
|
||||
<string translatable="false" name="fa_facebook"></string>
|
||||
<string translatable="false" name="fa_github"></string>
|
||||
<string translatable="false" name="fa_unlock"></string>
|
||||
<string translatable="false" name="fa_credit_card"></string>
|
||||
<string translatable="false" name="fa_rss"></string>
|
||||
<string translatable="false" name="fa_hdd_o"></string>
|
||||
<string translatable="false" name="fa_bullhorn"></string>
|
||||
<string translatable="false" name="fa_bell"></string>
|
||||
<string translatable="false" name="fa_certificate"></string>
|
||||
<string translatable="false" name="fa_hand_o_right"></string>
|
||||
<string translatable="false" name="fa_hand_o_left"></string>
|
||||
<string translatable="false" name="fa_hand_o_up"></string>
|
||||
<string translatable="false" name="fa_hand_o_down"></string>
|
||||
<string translatable="false" name="fa_arrow_circle_left"></string>
|
||||
<string translatable="false" name="fa_arrow_circle_right"></string>
|
||||
<string translatable="false" name="fa_arrow_circle_up"></string>
|
||||
<string translatable="false" name="fa_arrow_circle_down"></string>
|
||||
<string translatable="false" name="fa_globe"></string>
|
||||
<string translatable="false" name="fa_wrench"></string>
|
||||
<string translatable="false" name="fa_tasks"></string>
|
||||
<string translatable="false" name="fa_filter"></string>
|
||||
<string translatable="false" name="fa_briefcase"></string>
|
||||
<string translatable="false" name="fa_arrows_alt"></string>
|
||||
<string translatable="false" name="fa_users"></string>
|
||||
<string translatable="false" name="fa_link"></string>
|
||||
<string translatable="false" name="fa_cloud"></string>
|
||||
<string translatable="false" name="fa_flask"></string>
|
||||
<string translatable="false" name="fa_scissors"></string>
|
||||
<string translatable="false" name="fa_files_o"></string>
|
||||
<string translatable="false" name="fa_paperclip"></string>
|
||||
<string translatable="false" name="fa_floppy_o"></string>
|
||||
<string translatable="false" name="fa_square"></string>
|
||||
<string translatable="false" name="fa_bars"></string>
|
||||
<string translatable="false" name="fa_list_ul"></string>
|
||||
<string translatable="false" name="fa_list_ol"></string>
|
||||
<string translatable="false" name="fa_strikethrough"></string>
|
||||
<string translatable="false" name="fa_underline"></string>
|
||||
<string translatable="false" name="fa_table"></string>
|
||||
<string translatable="false" name="fa_magic"></string>
|
||||
<string translatable="false" name="fa_truck"></string>
|
||||
<string translatable="false" name="fa_pinterest"></string>
|
||||
<string translatable="false" name="fa_pinterest_square"></string>
|
||||
<string translatable="false" name="fa_google_plus_square"></string>
|
||||
<string translatable="false" name="fa_google_plus"></string>
|
||||
<string translatable="false" name="fa_money"></string>
|
||||
<string translatable="false" name="fa_caret_down"></string>
|
||||
<string translatable="false" name="fa_caret_up"></string>
|
||||
<string translatable="false" name="fa_caret_left"></string>
|
||||
<string translatable="false" name="fa_caret_right"></string>
|
||||
<string translatable="false" name="fa_columns"></string>
|
||||
<string translatable="false" name="fa_sort"></string>
|
||||
<string translatable="false" name="fa_sort_asc"></string>
|
||||
<string translatable="false" name="fa_sort_desc"></string>
|
||||
<string translatable="false" name="fa_envelope"></string>
|
||||
<string translatable="false" name="fa_linkedin"></string>
|
||||
<string translatable="false" name="fa_undo"></string>
|
||||
<string translatable="false" name="fa_gavel"></string>
|
||||
<string translatable="false" name="fa_tachometer"></string>
|
||||
<string translatable="false" name="fa_comment_o"></string>
|
||||
<string translatable="false" name="fa_comments_o"></string>
|
||||
<string translatable="false" name="fa_bolt"></string>
|
||||
<string translatable="false" name="fa_sitemap"></string>
|
||||
<string translatable="false" name="fa_umbrella"></string>
|
||||
<string translatable="false" name="fa_clipboard"></string>
|
||||
<string translatable="false" name="fa_lightbulb_o"></string>
|
||||
<string translatable="false" name="fa_exchange"></string>
|
||||
<string translatable="false" name="fa_cloud_download"></string>
|
||||
<string translatable="false" name="fa_cloud_upload"></string>
|
||||
<string translatable="false" name="fa_user_md"></string>
|
||||
<string translatable="false" name="fa_stethoscope"></string>
|
||||
<string translatable="false" name="fa_suitcase"></string>
|
||||
<string translatable="false" name="fa_bell_o"></string>
|
||||
<string translatable="false" name="fa_coffee"></string>
|
||||
<string translatable="false" name="fa_cutlery"></string>
|
||||
<string translatable="false" name="fa_file_text_o"></string>
|
||||
<string translatable="false" name="fa_building_o"></string>
|
||||
<string translatable="false" name="fa_hospital_o"></string>
|
||||
<string translatable="false" name="fa_ambulance"></string>
|
||||
<string translatable="false" name="fa_medkit"></string>
|
||||
<string translatable="false" name="fa_fighter_jet"></string>
|
||||
<string translatable="false" name="fa_beer"></string>
|
||||
<string translatable="false" name="fa_h_square"></string>
|
||||
<string translatable="false" name="fa_plus_square"></string>
|
||||
<string translatable="false" name="fa_angle_double_left"></string>
|
||||
<string translatable="false" name="fa_angle_double_right"></string>
|
||||
<string translatable="false" name="fa_angle_double_up"></string>
|
||||
<string translatable="false" name="fa_angle_double_down"></string>
|
||||
<string translatable="false" name="fa_angle_left"></string>
|
||||
<string translatable="false" name="fa_angle_right"></string>
|
||||
<string translatable="false" name="fa_angle_up"></string>
|
||||
<string translatable="false" name="fa_angle_down"></string>
|
||||
<string translatable="false" name="fa_desktop"></string>
|
||||
<string translatable="false" name="fa_laptop"></string>
|
||||
<string translatable="false" name="fa_tablet"></string>
|
||||
<string translatable="false" name="fa_mobile"></string>
|
||||
<string translatable="false" name="fa_circle_o"></string>
|
||||
<string translatable="false" name="fa_quote_left"></string>
|
||||
<string translatable="false" name="fa_quote_right"></string>
|
||||
<string translatable="false" name="fa_spinner"></string>
|
||||
<string translatable="false" name="fa_circle"></string>
|
||||
<string translatable="false" name="fa_reply"></string>
|
||||
<string translatable="false" name="fa_github_alt"></string>
|
||||
<string translatable="false" name="fa_folder_o"></string>
|
||||
<string translatable="false" name="fa_folder_open_o"></string>
|
||||
<string translatable="false" name="fa_smile_o"></string>
|
||||
<string translatable="false" name="fa_frown_o"></string>
|
||||
<string translatable="false" name="fa_meh_o"></string>
|
||||
<string translatable="false" name="fa_gamepad"></string>
|
||||
<string translatable="false" name="fa_keyboard_o"></string>
|
||||
<string translatable="false" name="fa_flag_o"></string>
|
||||
<string translatable="false" name="fa_flag_checkered"></string>
|
||||
<string translatable="false" name="fa_terminal"></string>
|
||||
<string translatable="false" name="fa_code"></string>
|
||||
<string translatable="false" name="fa_reply_all"></string>
|
||||
<string translatable="false" name="fa_mail_reply_all"></string>
|
||||
<string translatable="false" name="fa_star_half_o"></string>
|
||||
<string translatable="false" name="fa_location_arrow"></string>
|
||||
<string translatable="false" name="fa_crop"></string>
|
||||
<string translatable="false" name="fa_code_fork"></string>
|
||||
<string translatable="false" name="fa_chain_broken"></string>
|
||||
<string translatable="false" name="fa_question"></string>
|
||||
<string translatable="false" name="fa_info"></string>
|
||||
<string translatable="false" name="fa_exclamation"></string>
|
||||
<string translatable="false" name="fa_superscript"></string>
|
||||
<string translatable="false" name="fa_subscript"></string>
|
||||
<string translatable="false" name="fa_eraser"></string>
|
||||
<string translatable="false" name="fa_puzzle_piece"></string>
|
||||
<string translatable="false" name="fa_microphone"></string>
|
||||
<string translatable="false" name="fa_microphone_slash"></string>
|
||||
<string translatable="false" name="fa_shield"></string>
|
||||
<string translatable="false" name="fa_calendar_o"></string>
|
||||
<string translatable="false" name="fa_fire_extinguisher"></string>
|
||||
<string translatable="false" name="fa_rocket"></string>
|
||||
<string translatable="false" name="fa_maxcdn"></string>
|
||||
<string translatable="false" name="fa_chevron_circle_left"></string>
|
||||
<string translatable="false" name="fa_chevron_circle_right"></string>
|
||||
<string translatable="false" name="fa_chevron_circle_up"></string>
|
||||
<string translatable="false" name="fa_chevron_circle_down"></string>
|
||||
<string translatable="false" name="fa_html5"></string>
|
||||
<string translatable="false" name="fa_css3"></string>
|
||||
<string translatable="false" name="fa_anchor"></string>
|
||||
<string translatable="false" name="fa_unlock_alt"></string>
|
||||
<string translatable="false" name="fa_bullseye"></string>
|
||||
<string translatable="false" name="fa_ellipsis_h"></string>
|
||||
<string translatable="false" name="fa_ellipsis_v"></string>
|
||||
<string translatable="false" name="fa_rss_square"></string>
|
||||
<string translatable="false" name="fa_play_circle"></string>
|
||||
<string translatable="false" name="fa_ticket"></string>
|
||||
<string translatable="false" name="fa_minus_square"></string>
|
||||
<string translatable="false" name="fa_minus_square_o"></string>
|
||||
<string translatable="false" name="fa_level_up"></string>
|
||||
<string translatable="false" name="fa_level_down"></string>
|
||||
<string translatable="false" name="fa_check_square"></string>
|
||||
<string translatable="false" name="fa_pencil_square"></string>
|
||||
<string translatable="false" name="fa_external_link_square"></string>
|
||||
<string translatable="false" name="fa_share_square"></string>
|
||||
<string translatable="false" name="fa_compass"></string>
|
||||
<string translatable="false" name="fa_caret_square_o_down"></string>
|
||||
<string translatable="false" name="fa_caret_square_o_up"></string>
|
||||
<string translatable="false" name="fa_caret_square_o_right"></string>
|
||||
<string translatable="false" name="fa_eur"></string>
|
||||
<string translatable="false" name="fa_gbp"></string>
|
||||
<string translatable="false" name="fa_usd"></string>
|
||||
<string translatable="false" name="fa_inr"></string>
|
||||
<string translatable="false" name="fa_jpy"></string>
|
||||
<string translatable="false" name="fa_rub"></string>
|
||||
<string translatable="false" name="fa_krw"></string>
|
||||
<string translatable="false" name="fa_btc"></string>
|
||||
<string translatable="false" name="fa_file"></string>
|
||||
<string translatable="false" name="fa_file_text"></string>
|
||||
<string translatable="false" name="fa_sort_alpha_asc"></string>
|
||||
<string translatable="false" name="fa_sort_alpha_desc"></string>
|
||||
<string translatable="false" name="fa_sort_amount_asc"></string>
|
||||
<string translatable="false" name="fa_sort_amount_desc"></string>
|
||||
<string translatable="false" name="fa_sort_numeric_asc"></string>
|
||||
<string translatable="false" name="fa_sort_numeric_desc"></string>
|
||||
<string translatable="false" name="fa_thumbs_up"></string>
|
||||
<string translatable="false" name="fa_thumbs_down"></string>
|
||||
<string translatable="false" name="fa_youtube_square"></string>
|
||||
<string translatable="false" name="fa_youtube"></string>
|
||||
<string translatable="false" name="fa_xing"></string>
|
||||
<string translatable="false" name="fa_xing_square"></string>
|
||||
<string translatable="false" name="fa_youtube_play"></string>
|
||||
<string translatable="false" name="fa_dropbox"></string>
|
||||
<string translatable="false" name="fa_stack_overflow"></string>
|
||||
<string translatable="false" name="fa_instagram"></string>
|
||||
<string translatable="false" name="fa_flickr"></string>
|
||||
<string translatable="false" name="fa_adn"></string>
|
||||
<string translatable="false" name="fa_bitbucket"></string>
|
||||
<string translatable="false" name="fa_bitbucket_square"></string>
|
||||
<string translatable="false" name="fa_tumblr"></string>
|
||||
<string translatable="false" name="fa_tumblr_square"></string>
|
||||
<string translatable="false" name="fa_long_arrow_down"></string>
|
||||
<string translatable="false" name="fa_long_arrow_up"></string>
|
||||
<string translatable="false" name="fa_long_arrow_left"></string>
|
||||
<string translatable="false" name="fa_long_arrow_right"></string>
|
||||
<string translatable="false" name="fa_apple"></string>
|
||||
<string translatable="false" name="fa_windows"></string>
|
||||
<string translatable="false" name="fa_android"></string>
|
||||
<string translatable="false" name="fa_linux"></string>
|
||||
<string translatable="false" name="fa_dribbble"></string>
|
||||
<string translatable="false" name="fa_skype"></string>
|
||||
<string translatable="false" name="fa_foursquare"></string>
|
||||
<string translatable="false" name="fa_trello"></string>
|
||||
<string translatable="false" name="fa_female"></string>
|
||||
<string translatable="false" name="fa_male"></string>
|
||||
<string translatable="false" name="fa_gittip"></string>
|
||||
<string translatable="false" name="fa_sun_o"></string>
|
||||
<string translatable="false" name="fa_moon_o"></string>
|
||||
<string translatable="false" name="fa_archive"></string>
|
||||
<string translatable="false" name="fa_bug"></string>
|
||||
<string translatable="false" name="fa_vk"></string>
|
||||
<string translatable="false" name="fa_weibo"></string>
|
||||
<string translatable="false" name="fa_renren"></string>
|
||||
<string translatable="false" name="fa_pagelines"></string>
|
||||
<string translatable="false" name="fa_stack_exchange"></string>
|
||||
<string translatable="false" name="fa_arrow_circle_o_right"></string>
|
||||
<string translatable="false" name="fa_arrow_circle_o_left"></string>
|
||||
<string translatable="false" name="fa_caret_square_o_left"></string>
|
||||
<string translatable="false" name="fa_dot_circle_o"></string>
|
||||
<string translatable="false" name="fa_wheelchair"></string>
|
||||
<string translatable="false" name="fa_vimeo_square"></string>
|
||||
<string translatable="false" name="fa_try"></string>
|
||||
<string translatable="false" name="fa_plus_square_o"></string>
|
||||
|
||||
<!--<string translatable="false" name="fa_glass"></string>-->
|
||||
<!--<string translatable="false" name="fa_music"></string>-->
|
||||
<!--<string translatable="false" name="fa_search"></string>-->
|
||||
<!--<string translatable="false" name="fa_envelope_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_heart"></string>-->
|
||||
<!--<string translatable="false" name="fa_user"></string>-->
|
||||
<!--<string translatable="false" name="fa_film"></string>-->
|
||||
<!--<string translatable="false" name="fa_th_large"></string>-->
|
||||
<!--<string translatable="false" name="fa_th"></string>-->
|
||||
<!--<string translatable="false" name="fa_th_list"></string>-->
|
||||
<!--<string translatable="false" name="fa_search_plus"></string>-->
|
||||
<!--<string translatable="false" name="fa_search_minus"></string>-->
|
||||
<!--<string translatable="false" name="fa_power_off"></string>-->
|
||||
<!--<string translatable="false" name="fa_signal"></string>-->
|
||||
<!--<string translatable="false" name="fa_cog"></string>-->
|
||||
<!--<string translatable="false" name="fa_trash_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_home"></string>-->
|
||||
<!--<string translatable="false" name="fa_file_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_clock_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_road"></string>-->
|
||||
<!--<string translatable="false" name="fa_download"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrow_circle_o_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrow_circle_o_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_inbox"></string>-->
|
||||
<!--<string translatable="false" name="fa_play_circle_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_repeat"></string>-->
|
||||
<!--<string translatable="false" name="fa_refresh"></string>-->
|
||||
<!--<string translatable="false" name="fa_list_alt"></string>-->
|
||||
<!--<string translatable="false" name="fa_lock"></string>-->
|
||||
<!--<string translatable="false" name="fa_flag"></string>-->
|
||||
<!--<string translatable="false" name="fa_headphones"></string>-->
|
||||
<!--<string translatable="false" name="fa_volume_off"></string>-->
|
||||
<!--<string translatable="false" name="fa_volume_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_volume_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_qrcode"></string>-->
|
||||
<!--<string translatable="false" name="fa_barcode"></string>-->
|
||||
<!--<string translatable="false" name="fa_tag"></string>-->
|
||||
<!--<string translatable="false" name="fa_tags"></string>-->
|
||||
<!--<string translatable="false" name="fa_book"></string>-->
|
||||
<!--<string translatable="false" name="fa_bookmark"></string>-->
|
||||
<!--<string translatable="false" name="fa_print"></string>-->
|
||||
<!--<string translatable="false" name="fa_camera"></string>-->
|
||||
<!--<string translatable="false" name="fa_font"></string>-->
|
||||
<!--<string translatable="false" name="fa_bold"></string>-->
|
||||
<!--<string translatable="false" name="fa_italic"></string>-->
|
||||
<!--<string translatable="false" name="fa_text_height"></string>-->
|
||||
<!--<string translatable="false" name="fa_text_width"></string>-->
|
||||
<!--<string translatable="false" name="fa_align_left"></string>-->
|
||||
<!--<string translatable="false" name="fa_align_center"></string>-->
|
||||
<!--<string translatable="false" name="fa_align_right"></string>-->
|
||||
<!--<string translatable="false" name="fa_align_justify"></string>-->
|
||||
<!--<string translatable="false" name="fa_list"></string>-->
|
||||
<!--<string translatable="false" name="fa_outdent"></string>-->
|
||||
<!--<string translatable="false" name="fa_indent"></string>-->
|
||||
<!--<string translatable="false" name="fa_video_camera"></string>-->
|
||||
<!--<string translatable="false" name="fa_picture_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_pencil"></string>-->
|
||||
<!--<string translatable="false" name="fa_map_marker"></string>-->
|
||||
<!--<string translatable="false" name="fa_adjust"></string>-->
|
||||
<!--<string translatable="false" name="fa_tint"></string>-->
|
||||
<!--<string translatable="false" name="fa_pencil_square_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_share_square_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_check_square_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrows"></string>-->
|
||||
<!--<string translatable="false" name="fa_step_backward"></string>-->
|
||||
<!--<string translatable="false" name="fa_fast_backward"></string>-->
|
||||
<!--<string translatable="false" name="fa_backward"></string>-->
|
||||
<!--<string translatable="false" name="fa_play"></string>-->
|
||||
<!--<string translatable="false" name="fa_pause"></string>-->
|
||||
<!--<string translatable="false" name="fa_stop"></string>-->
|
||||
<!--<string translatable="false" name="fa_forward"></string>-->
|
||||
<!--<string translatable="false" name="fa_fast_forward"></string>-->
|
||||
<!--<string translatable="false" name="fa_step_forward"></string>-->
|
||||
<!--<string translatable="false" name="fa_eject"></string>-->
|
||||
<!--<string translatable="false" name="fa_chevron_left"></string>-->
|
||||
<!--<string translatable="false" name="fa_chevron_right"></string>-->
|
||||
<!--<string translatable="false" name="fa_plus_circle"></string>-->
|
||||
<!--<string translatable="false" name="fa_minus_circle"></string>-->
|
||||
<!--<string translatable="false" name="fa_times_circle"></string>-->
|
||||
<!--<string translatable="false" name="fa_check_circle"></string>-->
|
||||
<!--<string translatable="false" name="fa_question_circle"></string>-->
|
||||
<!--<string translatable="false" name="fa_info_circle"></string>-->
|
||||
<!--<string translatable="false" name="fa_crosshairs"></string>-->
|
||||
<!--<string translatable="false" name="fa_times_circle_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_check_circle_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_ban"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrow_left"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrow_right"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrow_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrow_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_share"></string>-->
|
||||
<!--<string translatable="false" name="fa_expand"></string>-->
|
||||
<!--<string translatable="false" name="fa_compress"></string>-->
|
||||
<!--<string translatable="false" name="fa_plus"></string>-->
|
||||
<!--<string translatable="false" name="fa_minus"></string>-->
|
||||
<!--<string translatable="false" name="fa_asterisk"></string>-->
|
||||
<!--<string translatable="false" name="fa_exclamation_circle"></string>-->
|
||||
<!--<string translatable="false" name="fa_gift"></string>-->
|
||||
<!--<string translatable="false" name="fa_leaf"></string>-->
|
||||
<!--<string translatable="false" name="fa_fire"></string>-->
|
||||
<!--<string translatable="false" name="fa_eye"></string>-->
|
||||
<!--<string translatable="false" name="fa_eye_slash"></string>-->
|
||||
<!--<string translatable="false" name="fa_exclamation_triangle"></string>-->
|
||||
<!--<string translatable="false" name="fa_plane"></string>-->
|
||||
<!--<string translatable="false" name="fa_calendar"></string>-->
|
||||
<!--<string translatable="false" name="fa_random"></string>-->
|
||||
<!--<string translatable="false" name="fa_comment"></string>-->
|
||||
<!--<string translatable="false" name="fa_magnet"></string>-->
|
||||
<!--<string translatable="false" name="fa_chevron_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_chevron_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_retweet"></string>-->
|
||||
<!--<string translatable="false" name="fa_shopping_cart"></string>-->
|
||||
<!--<string translatable="false" name="fa_folder"></string>-->
|
||||
<!--<string translatable="false" name="fa_folder_open"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrows_v"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrows_h"></string>-->
|
||||
<!--<string translatable="false" name="fa_bar_chart_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_twitter_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_facebook_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_camera_retro"></string>-->
|
||||
<!--<string translatable="false" name="fa_key"></string>-->
|
||||
<!--<string translatable="false" name="fa_cogs"></string>-->
|
||||
<!--<string translatable="false" name="fa_comments"></string>-->
|
||||
<!--<string translatable="false" name="fa_thumbs_o_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_thumbs_o_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_heart_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_sign_out"></string>-->
|
||||
<!--<string translatable="false" name="fa_linkedin_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_thumb_tack"></string>-->
|
||||
<!--<string translatable="false" name="fa_external_link"></string>-->
|
||||
<!--<string translatable="false" name="fa_sign_in"></string>-->
|
||||
<!--<string translatable="false" name="fa_trophy"></string>-->
|
||||
<!--<string translatable="false" name="fa_github_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_upload"></string>-->
|
||||
<!--<string translatable="false" name="fa_lemon_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_phone"></string>-->
|
||||
<!--<string translatable="false" name="fa_square_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_bookmark_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_phone_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_twitter"></string>-->
|
||||
<!--<string translatable="false" name="fa_facebook"></string>-->
|
||||
<!--<string translatable="false" name="fa_github"></string>-->
|
||||
<!--<string translatable="false" name="fa_unlock"></string>-->
|
||||
<!--<string translatable="false" name="fa_credit_card"></string>-->
|
||||
<!--<string translatable="false" name="fa_rss"></string>-->
|
||||
<!--<string translatable="false" name="fa_hdd_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_bullhorn"></string>-->
|
||||
<!--<string translatable="false" name="fa_bell"></string>-->
|
||||
<!--<string translatable="false" name="fa_certificate"></string>-->
|
||||
<!--<string translatable="false" name="fa_hand_o_right"></string>-->
|
||||
<!--<string translatable="false" name="fa_hand_o_left"></string>-->
|
||||
<!--<string translatable="false" name="fa_hand_o_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_hand_o_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrow_circle_left"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrow_circle_right"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrow_circle_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrow_circle_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_globe"></string>-->
|
||||
<!--<string translatable="false" name="fa_wrench"></string>-->
|
||||
<!--<string translatable="false" name="fa_tasks"></string>-->
|
||||
<!--<string translatable="false" name="fa_filter"></string>-->
|
||||
<!--<string translatable="false" name="fa_briefcase"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrows_alt"></string>-->
|
||||
<!--<string translatable="false" name="fa_users"></string>-->
|
||||
<!--<string translatable="false" name="fa_link"></string>-->
|
||||
<!--<string translatable="false" name="fa_cloud"></string>-->
|
||||
<!--<string translatable="false" name="fa_flask"></string>-->
|
||||
<!--<string translatable="false" name="fa_scissors"></string>-->
|
||||
<!--<string translatable="false" name="fa_files_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_paperclip"></string>-->
|
||||
<!--<string translatable="false" name="fa_floppy_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_bars"></string>-->
|
||||
<!--<string translatable="false" name="fa_list_ul"></string>-->
|
||||
<!--<string translatable="false" name="fa_list_ol"></string>-->
|
||||
<!--<string translatable="false" name="fa_strikethrough"></string>-->
|
||||
<!--<string translatable="false" name="fa_underline"></string>-->
|
||||
<!--<string translatable="false" name="fa_table"></string>-->
|
||||
<!--<string translatable="false" name="fa_magic"></string>-->
|
||||
<!--<string translatable="false" name="fa_truck"></string>-->
|
||||
<!--<string translatable="false" name="fa_pinterest"></string>-->
|
||||
<!--<string translatable="false" name="fa_pinterest_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_google_plus_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_google_plus"></string>-->
|
||||
<!--<string translatable="false" name="fa_money"></string>-->
|
||||
<!--<string translatable="false" name="fa_caret_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_caret_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_caret_left"></string>-->
|
||||
<!--<string translatable="false" name="fa_caret_right"></string>-->
|
||||
<!--<string translatable="false" name="fa_columns"></string>-->
|
||||
<!--<string translatable="false" name="fa_sort"></string>-->
|
||||
<!--<string translatable="false" name="fa_sort_asc"></string>-->
|
||||
<!--<string translatable="false" name="fa_sort_desc"></string>-->
|
||||
<!--<string translatable="false" name="fa_envelope"></string>-->
|
||||
<!--<string translatable="false" name="fa_linkedin"></string>-->
|
||||
<!--<string translatable="false" name="fa_undo"></string>-->
|
||||
<!--<string translatable="false" name="fa_gavel"></string>-->
|
||||
<!--<string translatable="false" name="fa_tachometer"></string>-->
|
||||
<!--<string translatable="false" name="fa_comment_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_comments_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_bolt"></string>-->
|
||||
<!--<string translatable="false" name="fa_sitemap"></string>-->
|
||||
<!--<string translatable="false" name="fa_umbrella"></string>-->
|
||||
<!--<string translatable="false" name="fa_clipboard"></string>-->
|
||||
<!--<string translatable="false" name="fa_lightbulb_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_exchange"></string>-->
|
||||
<!--<string translatable="false" name="fa_cloud_download"></string>-->
|
||||
<!--<string translatable="false" name="fa_cloud_upload"></string>-->
|
||||
<!--<string translatable="false" name="fa_user_md"></string>-->
|
||||
<!--<string translatable="false" name="fa_stethoscope"></string>-->
|
||||
<!--<string translatable="false" name="fa_suitcase"></string>-->
|
||||
<!--<string translatable="false" name="fa_bell_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_coffee"></string>-->
|
||||
<!--<string translatable="false" name="fa_cutlery"></string>-->
|
||||
<!--<string translatable="false" name="fa_file_text_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_building_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_hospital_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_ambulance"></string>-->
|
||||
<!--<string translatable="false" name="fa_medkit"></string>-->
|
||||
<!--<string translatable="false" name="fa_fighter_jet"></string>-->
|
||||
<!--<string translatable="false" name="fa_beer"></string>-->
|
||||
<!--<string translatable="false" name="fa_h_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_plus_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_angle_double_left"></string>-->
|
||||
<!--<string translatable="false" name="fa_angle_double_right"></string>-->
|
||||
<!--<string translatable="false" name="fa_angle_double_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_angle_double_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_angle_left"></string>-->
|
||||
<!--<string translatable="false" name="fa_angle_right"></string>-->
|
||||
<!--<string translatable="false" name="fa_angle_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_angle_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_desktop"></string>-->
|
||||
<!--<string translatable="false" name="fa_laptop"></string>-->
|
||||
<!--<string translatable="false" name="fa_tablet"></string>-->
|
||||
<!--<string translatable="false" name="fa_mobile"></string>-->
|
||||
<!--<string translatable="false" name="fa_circle_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_quote_left"></string>-->
|
||||
<!--<string translatable="false" name="fa_quote_right"></string>-->
|
||||
<!--<string translatable="false" name="fa_spinner"></string>-->
|
||||
<!--<string translatable="false" name="fa_circle"></string>-->
|
||||
<!--<string translatable="false" name="fa_reply"></string>-->
|
||||
<!--<string translatable="false" name="fa_github_alt"></string>-->
|
||||
<!--<string translatable="false" name="fa_folder_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_folder_open_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_smile_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_frown_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_meh_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_gamepad"></string>-->
|
||||
<!--<string translatable="false" name="fa_keyboard_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_flag_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_flag_checkered"></string>-->
|
||||
<!--<string translatable="false" name="fa_terminal"></string>-->
|
||||
<!--<string translatable="false" name="fa_code"></string>-->
|
||||
<!--<string translatable="false" name="fa_reply_all"></string>-->
|
||||
<!--<string translatable="false" name="fa_mail_reply_all"></string>-->
|
||||
<!--<string translatable="false" name="fa_location_arrow"></string>-->
|
||||
<!--<string translatable="false" name="fa_crop"></string>-->
|
||||
<!--<string translatable="false" name="fa_code_fork"></string>-->
|
||||
<!--<string translatable="false" name="fa_chain_broken"></string>-->
|
||||
<!--<string translatable="false" name="fa_question"></string>-->
|
||||
<!--<string translatable="false" name="fa_info"></string>-->
|
||||
<!--<string translatable="false" name="fa_exclamation"></string>-->
|
||||
<!--<string translatable="false" name="fa_superscript"></string>-->
|
||||
<!--<string translatable="false" name="fa_subscript"></string>-->
|
||||
<!--<string translatable="false" name="fa_eraser"></string>-->
|
||||
<!--<string translatable="false" name="fa_puzzle_piece"></string>-->
|
||||
<!--<string translatable="false" name="fa_microphone"></string>-->
|
||||
<!--<string translatable="false" name="fa_microphone_slash"></string>-->
|
||||
<!--<string translatable="false" name="fa_shield"></string>-->
|
||||
<!--<string translatable="false" name="fa_calendar_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_fire_extinguisher"></string>-->
|
||||
<!--<string translatable="false" name="fa_rocket"></string>-->
|
||||
<!--<string translatable="false" name="fa_maxcdn"></string>-->
|
||||
<!--<string translatable="false" name="fa_chevron_circle_left"></string>-->
|
||||
<!--<string translatable="false" name="fa_chevron_circle_right"></string>-->
|
||||
<!--<string translatable="false" name="fa_chevron_circle_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_chevron_circle_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_html5"></string>-->
|
||||
<!--<string translatable="false" name="fa_css3"></string>-->
|
||||
<!--<string translatable="false" name="fa_anchor"></string>-->
|
||||
<!--<string translatable="false" name="fa_unlock_alt"></string>-->
|
||||
<!--<string translatable="false" name="fa_bullseye"></string>-->
|
||||
<!--<string translatable="false" name="fa_ellipsis_h"></string>-->
|
||||
<!--<string translatable="false" name="fa_ellipsis_v"></string>-->
|
||||
<!--<string translatable="false" name="fa_rss_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_play_circle"></string>-->
|
||||
<!--<string translatable="false" name="fa_ticket"></string>-->
|
||||
<!--<string translatable="false" name="fa_minus_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_minus_square_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_level_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_level_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_check_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_pencil_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_external_link_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_share_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_compass"></string>-->
|
||||
<!--<string translatable="false" name="fa_caret_square_o_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_caret_square_o_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_caret_square_o_right"></string>-->
|
||||
<!--<string translatable="false" name="fa_eur"></string>-->
|
||||
<!--<string translatable="false" name="fa_gbp"></string>-->
|
||||
<!--<string translatable="false" name="fa_usd"></string>-->
|
||||
<!--<string translatable="false" name="fa_inr"></string>-->
|
||||
<!--<string translatable="false" name="fa_jpy"></string>-->
|
||||
<!--<string translatable="false" name="fa_rub"></string>-->
|
||||
<!--<string translatable="false" name="fa_krw"></string>-->
|
||||
<!--<string translatable="false" name="fa_btc"></string>-->
|
||||
<!--<string translatable="false" name="fa_file"></string>-->
|
||||
<!--<string translatable="false" name="fa_file_text"></string>-->
|
||||
<!--<string translatable="false" name="fa_sort_alpha_asc"></string>-->
|
||||
<!--<string translatable="false" name="fa_sort_alpha_desc"></string>-->
|
||||
<!--<string translatable="false" name="fa_sort_amount_asc"></string>-->
|
||||
<!--<string translatable="false" name="fa_sort_amount_desc"></string>-->
|
||||
<!--<string translatable="false" name="fa_sort_numeric_asc"></string>-->
|
||||
<!--<string translatable="false" name="fa_sort_numeric_desc"></string>-->
|
||||
<!--<string translatable="false" name="fa_thumbs_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_thumbs_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_youtube_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_youtube"></string>-->
|
||||
<!--<string translatable="false" name="fa_xing"></string>-->
|
||||
<!--<string translatable="false" name="fa_xing_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_youtube_play"></string>-->
|
||||
<!--<string translatable="false" name="fa_dropbox"></string>-->
|
||||
<!--<string translatable="false" name="fa_stack_overflow"></string>-->
|
||||
<!--<string translatable="false" name="fa_instagram"></string>-->
|
||||
<!--<string translatable="false" name="fa_flickr"></string>-->
|
||||
<!--<string translatable="false" name="fa_adn"></string>-->
|
||||
<!--<string translatable="false" name="fa_bitbucket"></string>-->
|
||||
<!--<string translatable="false" name="fa_bitbucket_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_tumblr"></string>-->
|
||||
<!--<string translatable="false" name="fa_tumblr_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_long_arrow_down"></string>-->
|
||||
<!--<string translatable="false" name="fa_long_arrow_up"></string>-->
|
||||
<!--<string translatable="false" name="fa_long_arrow_left"></string>-->
|
||||
<!--<string translatable="false" name="fa_long_arrow_right"></string>-->
|
||||
<!--<string translatable="false" name="fa_apple"></string>-->
|
||||
<!--<string translatable="false" name="fa_windows"></string>-->
|
||||
<!--<string translatable="false" name="fa_android"></string>-->
|
||||
<!--<string translatable="false" name="fa_linux"></string>-->
|
||||
<!--<string translatable="false" name="fa_dribbble"></string>-->
|
||||
<!--<string translatable="false" name="fa_skype"></string>-->
|
||||
<!--<string translatable="false" name="fa_foursquare"></string>-->
|
||||
<!--<string translatable="false" name="fa_trello"></string>-->
|
||||
<!--<string translatable="false" name="fa_female"></string>-->
|
||||
<!--<string translatable="false" name="fa_male"></string>-->
|
||||
<!--<string translatable="false" name="fa_gittip"></string>-->
|
||||
<!--<string translatable="false" name="fa_sun_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_moon_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_bug"></string>-->
|
||||
<!--<string translatable="false" name="fa_vk"></string>-->
|
||||
<!--<string translatable="false" name="fa_weibo"></string>-->
|
||||
<!--<string translatable="false" name="fa_renren"></string>-->
|
||||
<!--<string translatable="false" name="fa_pagelines"></string>-->
|
||||
<!--<string translatable="false" name="fa_stack_exchange"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrow_circle_o_right"></string>-->
|
||||
<!--<string translatable="false" name="fa_arrow_circle_o_left"></string>-->
|
||||
<!--<string translatable="false" name="fa_caret_square_o_left"></string>-->
|
||||
<!--<string translatable="false" name="fa_dot_circle_o"></string>-->
|
||||
<!--<string translatable="false" name="fa_wheelchair"></string>-->
|
||||
<!--<string translatable="false" name="fa_vimeo_square"></string>-->
|
||||
<!--<string translatable="false" name="fa_try"></string>-->
|
||||
<!--<string translatable="false" name="fa_plus_square_o"></string>-->
|
||||
</resources>
|
||||
|
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:minHeight="40dp"
|
||||
android:minWidth="40dp"
|
||||
android:initialLayout="@layout/widget_checkmark"
|
||||
android:previewImage="@drawable/widget_preview_checkmark"
|
||||
android:resizeMode="none"
|
||||
android:updatePeriodMillis="3600000"
|
||||
android:configure="org.isoron.uhabits.widgets.HabitPickerDialog"
|
||||
android:widgetCategory="home_screen">
|
||||
|
||||
|
||||
</appwidget-provider>
|
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:minHeight="80dp"
|
||||
android:minWidth="80dp"
|
||||
android:minResizeWidth="40dp"
|
||||
android:minResizeHeight="40dp"
|
||||
android:initialLayout="@layout/widget_graph"
|
||||
android:previewImage="@drawable/widget_preview_history"
|
||||
android:resizeMode="vertical|horizontal"
|
||||
android:updatePeriodMillis="3600000"
|
||||
android:configure="org.isoron.uhabits.widgets.HabitPickerDialog"
|
||||
android:widgetCategory="home_screen">
|
||||
|
||||
</appwidget-provider>
|
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:minHeight="80dp"
|
||||
android:minWidth="80dp"
|
||||
android:minResizeWidth="40dp"
|
||||
android:minResizeHeight="40dp"
|
||||
android:initialLayout="@layout/widget_graph"
|
||||
android:previewImage="@drawable/widget_preview_score"
|
||||
android:resizeMode="vertical|horizontal"
|
||||
android:updatePeriodMillis="3600000"
|
||||
android:configure="org.isoron.uhabits.widgets.HabitPickerDialog"
|
||||
android:widgetCategory="home_screen">
|
||||
|
||||
</appwidget-provider>
|
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:minHeight="80dp"
|
||||
android:minWidth="80dp"
|
||||
android:minResizeWidth="40dp"
|
||||
android:minResizeHeight="40dp"
|
||||
android:initialLayout="@layout/widget_graph"
|
||||
android:previewImage="@drawable/widget_preview_streaks"
|
||||
android:resizeMode="vertical|horizontal"
|
||||
android:updatePeriodMillis="3600000"
|
||||
android:configure="org.isoron.uhabits.widgets.HabitPickerDialog"
|
||||
android:widgetCategory="home_screen">
|
||||
|
||||
</appwidget-provider>
|
@ -1 +1 @@
|
||||
Subproject commit e8905e2c78d27bc064d03496abea3a0956e49b18
|
||||
Subproject commit 318d69cf6b2adc287cf8944bb847dd7139c60376
|
After Width: | Height: | Size: 345 KiB |
After Width: | Height: | Size: 85 KiB |