Code Monkey home page Code Monkey logo

timecop's Introduction

Time Cop
icon

A time tracking app that respects your privacy and gets the job done without getting too fancy.

Motivation

I'd rather not do time-tracking at all, but since its a necessity for my work, it's either use an app or keep track of things manually (which I'm terrible at). There are many time tracking apps on the app stores (and I have tried several of them), but each of them has at least one pain point that eventually drives me off—some cost more money than I think they should, others have (what I consider) poorly designed interfaces, some are way too complicated, some don't export data easily, most require an internet connection, I have privacy concerns with a large number of them, etc, etc.

Time tracking in and of itself is rather straightforward (hence all the apps on the app stores), so I figured “why not use this as an opportunity to practice mobile development and learn some new things?”. This app is the result of that question—its a tool that I use every day for work, but also a sample project to work off of and share with others.

Features

  • Offline-only, mobile-first
  • For Android (Google Play, F-Droid), iOS, and Linux
  • Fully private—there is no tracking / spying / advertising / etc
  • Keep track of tasks with multiple parallel timers that can be started with the tap of a button
  • Associate timers with projects to group your work (or don't)
  • Start, stop, edit, and delete timers whenever with no fuss
  • Export data as a .csv file, filtered by timespans and projects
  • Export the app's database for full access to all of its data
  • Automatic light mode / dark mode based on your device settings
  • Localized in several languages (thanks to Google Translate): English, Arabic, German, Spanish, French, Hindi, Japanese, Korean, Portuguese, Russian, Chinese (Simplified), Chinese (Traditional), as well as Italian, Czech, Norwegian, and Indonesian (via contributors)
  • Open source (licensed under Apache-2.0)—fork away!

Screenshots

Screenshot Screenshot Screenshot Screenshot Screenshot

More screenshots (including dark-mode and localization demonstrations) are available in the screenshots/ folder.

Contributing

I'm happy to take bug reports and pull requests if you want to help improve Time Cop, but I fundamentally want to keep this app relatively small and simple. If that's not for you, there's plenty of other options out there.

The app is created pretty much entirely in Dart using Flutter, and I tried to make heavy use of the Bloc pattern.

Here are a few resources to get you started if this is your first Flutter project:

For help getting started with Flutter, view its online documentation, which offers tutorials, samples, guidance on mobile development, and a full API reference.

After installing and setting up Flutter (ideally its latest stable version) and downloading the Time Cop code, you should be able to simply build and run this Flutter project, at least for mobile platforms. For more information, see the CONTRIBUTING.md file.

Localizations

You can help translate Time Cop on Weblate. If you notice any incorrect strings, feel free to correct them. Similarly, if you want to add a language, please do!

Translations are handled using Project Fluent. Currently all translations except English, Italian, Czech, Norwegian, and Indonesian were auto-translated by Google Translate using my Translate Tool.

Todo

A list of “user stories” (and I use that term very loosely) guiding the development of this app is available in design/user-stories.md; any unchecked boxes are outstanding items on the todo list!

timecop's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

timecop's Issues

button to enable dark mode

In some android devices, there is no option to enable dark mode in the display settings, so timecop does not switch to dark mode.
It would be useful to have the possibility to enable dark mode from within the application settings too.

Search: two suggestions

  1. Currently two taps are needed for searching. One to bring up the search input field, then one in the field itself to prompt the keyboard. Any way to make this happen directly, with one tap?

  2. Search field is very hard to read on the dark background, as it uses dark font. I suggest the icon and text be a lighter color.

Search isn't something I though I'd be using. But since I usually start a new timer based on a previous one, I found the easier way is by Searching for it, then starting it from there. I'd rather do this directly in the bottom input text field, by tapping the options given by autocomplete. However, as I mentioned before, doing that doesn't populate the Project field, only the Description.

Timecop is great

Just to mention how useful this app has been to me.

It has also become very stable since a recent update - no more random crashes. Thanks for that.

I'd still like to see at least some of the more critical issues dealt with occasionally.

Thank you!

Option to append Project Name to Description

Would be great to have the option to enable showing the Project name in front of the Description.

So that:
🟠 Testing
🟡 Meeting
🔴 Sketching
🟡 Phone call

Becomes:
🟠 Samsung: Testing
🟡 Uncle: Meeting
🔴 Personal: Sketching
🟡 Uncle: Phone call

For me it's hard to remember the color for every single project. Descriptions are usually very minimal (as they should be), so it's hard to tell just by looking at them.

I appreciate that some users working with fewer projects wouldn't have this problem, and would prefer not to waste that space. Maybe just add this as an option in Settings. (People who decide to enable it would probably use shorter project names anyways)

Implementation itself wouldn't need (I think) to add any new elements to the UI. Project name could be appended to start of the text field currently showing the Description (ideally in bold, like in my example above). Just a suggestion, of course!

Option to enable compact view

Not sure if I should make a single issue for all the ideas that I have or keep creating separate ones 😄

Anyway... the option to enable a more compact view for those days that a really dense in terms of events would be awesome! I imagine keeping the meeting colour indicator, but in a smaller size and then decreasing the margin all around. Also, the meeting colour indicator could exist not as a space-consuming circle, but as a single, somewhat thick coloured bar on the side; this would give more space to the event name.

All the best!

Project archiving

I just started trying out Time Cop and really like it so far.

I love the simple/lightweight approach, however I did miss a feature that I'd need to be able to continue using it long-term: the ability to archive projects that I'm done with.

At any given time I usually have around 5 projects which are Ongoing (stuff I'll always have, such as Admin work), and then around 5 more which eventually get finished. As I use the app, eventually these projects will clutter up the list, making it too difficult to navigate.

Any plans on including some (minimal) Project archiving feature?

Expand all days (Feature request)

Timecop is very useful when I want to have an idea of my wok on a certain project/task in the past few days or weeks.

I just search on top for a string that is unique to that task (such as "Working on Website X"), and then explore the filtered entries below.

Sometimes that's enough, but usually I need to manually expand each day to see the details (I have a habit of appending specific information for what I did in that day, such as "Working on Website X (fix home page)")

Would be very useful if there was an expand all button on top, that would expand all days currently on screen.

Edit: I realize there is an option to disable Collapsing Days in the settings. But except for the case above, I do want that feature.

Port the app to macOS

As Flutter now allows somewhat painless porting to desktop platforms, it'd be nice to see TimeCop on macOS too (even if initially not particularly optimized for mouse input).

Search issues (though autocomplete works fine)

The search (on top) isn't finding certain entries - seems to happen only for older ones.

On the other hand, autocomplete in the New Entry field always seems to find what I want. (though I then need to add the Project)

Let me know if you want any further info.

Best way to clear database up until a certain date?

After a little over a year using TimeCop I'd like to backup my existing entries and start anew.

To keep it tidy, I'd like to backup only the exact first year (ie. from 2020/04/01 to 2021/04/01), and keep all entries after that in the app (ie. from 2021/04/02 till today).

What would be the best way to do that?

I was hoping to be able to export only the more recent entries, then re-import it in a way that replaces the current database. But I wasn't able to reimport the database (see my previous issue).

Thanks.

Option to group same task timers together across days

If you start a timer for the same issue multiple times, they will be grouped together allowing you to see the total time spent. If the timer spans multiple days however, this is not the case.

It would be nice to have an option to allow us to easily see the total time spent for a long running task.

Thanks for the great app btw!

Ask for notification permission

When the user first toggles the "Show Running Timer Notifications" setting, ask them for permission to send notifications.

A suggestion.

A suggestion:

in ExportMenu.dart

Change lines with
scaffoldKey!.currentState!.showSnackBar(SnackBar(

for
ScaffoldMessenger.of(context).showSnackBar(SnackBar(

That is because I received dart errors with first line.

Plans for update?

I purchased TimeCop 2 years ago and it has been very useful every since. Because I've been using it so much, my database is getting quite huge,I'd like to clear it (after performing a backup, of course). According to this previous conversation, it doesn't seem this is a priority, so I think I'll move on to a different app.

Before doing that I'd like to check if there are any plans for update (last one is from one and a half year ago). Perhaps an update could mitigate my main issues in some way, and I could continue using this wonderful app!

Allow changing default time span for the search (Feature request)

The search on top seems to be limited to a month back by default (to make sure most users won't run into performance issues, I figure?).

I'm glad that I can override that to a longer span if I need to. But that always reverts back after I've done other operations in the app.

Usually I'd want the default span to be longer. So if there were an option for manually defining this default, it would be very useful!

incorrect DB scheme "corrupts" existing data when updated to 1.6.0

Yesterday I got auto-updated by Google Play to version v1.6.0+36 (Android v8.0.0). After that my old projects disappeared the same way as described in #40.

I believe the issue is caused by incorrect scheme of projects table:

archived boolean not null default false

After DB upgrade for all old projects archived contains string false but the application expects integer there (0 or 1).

The scheme is incorrect from the application POV but I think that SQL doesn't support such tables either though I don't know SQL that much.

As a workaround I exported my DB then manually edited the scheme in sqlite editor: changed the archived field description in the projects table to the following:

archived boolean not null default 0

Then I cleared data of the application on the phone and imported modified DB file. After small delay I can now use the app again.

Integrate with an online service

It'd be great if this app could sync with Clockify. It should be possible using their official API

(It's the app my work uses and it has a completely unusable mobile app, so I'd love to replace it with Time Cop.)

"Time Cop has stopped"

I've been getting "Time Cop has stopped" every couple of days.
It happens whenever I try to open the app, when it's already in the background.

It doesn't seem to be anything serious. It never seems to lose any data. And after the crash it always opens OK. (Also, considering I open the app dozens of times a day, it's quite rare)

However, I have a feeling it's been happening gradually more often (due to increase in data, I assume).

I've been using the app for around a month and a half. This started to happen after around 1 month of usage. I currently have around 15 projects, and do around 10-20 unique entries on average a day.

Build is broken?

As of writing this issue, I have about 42 minutes of experience with flutter, apologies if I've missed something trivial.

I tried to setup the code to build locally, and couldn't get the app to build. I get a dependency resolution error:

$ flutter run
Because no versions of screenshots match >2.1.1 <3.0.0 and screenshots 2.1.1 depends on process ^3.0.9, screenshots ^2.1.1 requires process ^3.0.9.
And because every version of flutter_driver from sdk depends on process 4.0.0-nullsafety.2, screenshots ^2.1.1 is incompatible with flutter_driver from sdk.
So, because timecop depends on both flutter_driver any from sdk and screenshots ^2.1.1, version solving failed.
Running "flutter pub get" in timecop...
pub get failed (1; So, because timecop depends on both flutter_driver any from sdk and screenshots ^2.1.1, version solving failed.)

and I just installed flutter stable:

$ flutter --version
Flutter 1.22.4 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 1aafb3a8b9 (6 days ago) • 2020-11-13 09:59:28 -0800
Engine • revision 2c956a31c0
Tools • Dart 2.10.4

Based on a quick search, it looks like the dependencies and sdk versions are incompatible?

A couple more questions/suggestions

(This is the last one, I swear!)

  1. Why is there a cumulative timer at the top of the Running Timers section? How is that number useful? It seems to me it could be removed to decrease clutter.

  2. Why do the task actions (swipe right = Delete; swipe left = Play/Stop) require an additional step (tapping the actual buttons)? Could you add an option in the Settings for users that would like the actions to be triggered only by swiping?

  3. Why does the Play button at the bottom right change to a Stopwatch once more than one task is active? It is a bit counter-intuitive (due to the location of that button, it will always seem like it refers to the text field to its left).
    If the only reason this happens is as a way to allow for the "Stop all tasks" action, I'd suggest not having it (since it doesn't seem like it would be much used). Or have this "Stop all tasks" action be triggered in a different way - maybe left swiping the top part of the "Running Timers" section could cause all active timers to swipe left, with only 1 STOP button showing on the right, suggesting that this action applies to all active tasks).

Thanks!

Option to have ongoing notification for ongoing timers

Many a time have I forgotten to leave a timer going just because I closed the application to go do something else (on the phone). If there was a notification icon that would expand to the event description (maybe also the project under which it is) and the currently elapsed time, then when it would always be there in the periphery or at the very least be something that gets reminded when the phone is opened (as the notification would be visible in the lock screen).

[UX] Communicate which filters are applied

When using Time Cop, it's not clear that the entries are filtered to those from a certain date onward by default.

I tried to bring over a 2 month old project from Clockify to Time Cop and was surprised when newly added entries for old dates would not be added.

It'd be great if there was a small note about the applied filters at the end of the entry list — e.g. "Filtering entries from October 1, 2021 onward."

Can't build project

When I try to build the project, I got the following error:

`Launching lib/main.dart on iPhone 12 Pro Max in debug mode...
lib/main.dart:1
Upgrading contents.xcworkspacedata
Xcode build done. 20,0s
../../../../../data/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_datetime_picker-1.5.1/lib/flutter_datetime_picker.dart:311:32: Warning: Operand of null-aware operation '??' has type 'Color' which excludes null.

  • 'Color' is from 'dart:ui'.
    color: theme.backgroundColor ?? Colors.white,
    ^
    Connecting to VM Service at ws://127.0.0.1:56277/qZHE7rzceUs=/ws
    `

Environment:

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel beta, 2.2.0, on macOS 11.3.1 20E241 darwin-arm, locale de-DE)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[✓] Xcode - develop for iOS and macOS
[✓] Chrome - develop for the web
[✓] Android Studio (version 4.1)
[✓] IntelliJ IDEA Ultimate Edition (version 2020.3.3)
[✓] VS Code (version 1.56.2)
[✓] Connected device (3 available)

flutter --version
Flutter 2.2.0 • channel beta • https://github.com/flutter/flutter.git
Framework • revision b22742018b (6 days ago) • 2021-05-14 19:12:57 -0700
Engine • revision a9d88a4d18
Tools • Dart 2.13.0

Can't figure out how to build. Which flutter sdk is required?

problem deleting project

message recieved:
_CastError (type 'Future<bool?>' is not a subtype of type 'FutureOr' in type cast)
ProjectScreen.dart. line 119

How delete a task for Linux?

Sorry to ask this basic question. After completing a task I can't find any option to delete it from the list. When clicked on the task it goes to the edit mode. Please let me know how to delete a task.
It would be better if a delete icon was added next to the completed task. I am using this app in POP OS.

Update plans?

@hamaluik , do you plan to address the feedback and bug reports we've added in the past several months?

At the time I purchased Time Cop, it was the best tool around. However the lack of updates is making me consider looking for new tools. I'd rather not, since I really like your app!

To be clear, I'm not complaining or trying to pressure you or anything like it! I'm really just asking what are your plans, so I can decide what to do.

A neater way to retrospectively add time

When moving to TimeCop for the first time, or for people whose workflow doesn't really work well with using "real-time" capture of time, it might be helpful to have a way to add historical time records manually.

Currently you can do this by starting a new timer, then immediately stopping it, and editing the start/end times. This is not ideal when doing it a few times. There are a couple of quirks when adding time:

  1. End time defaults to thee current time (today, now), even after shifting start time back. If the start time is manually adjusted by more than 1 day, perhaps the end time could default to being the same as the start time, to aid in dealing with the most common scenario, where the end time is near to the start time?

  2. When adjusting end date by changing it back a day, the hour and minute default to 23:59. It would probably be better to leave these "as-is", rather than forcibly jumping down to 23:59.

Option to add additional information to an event

First of all, thanks for the wonderful app; already gotten my money's worth!

Secondly, I was wondering if it would be possible to add additional information to an event? I'm currently logging the time I am in various meetings and the ability to quickly add more information other than the single sentence description would be wonderful!

I can see this being useful for more meaningful project work as well as for an event such as "Creating new module" you could add bullet points of smaller tasks within that.

Thanks again and keep up the good work!

Timer editing error

Editing Timer Problem

When a project is archived and I try to edit a timer associated with it, the app shows (Dropdown.dart) this error:

Exception has occurred.

_AssertionError ('package:flutter/src/material/dropdown.dart': Failed assertion: line 890 pos 15: 'items == null || items.isEmpty || value == null ||
items.where((DropdownMenuItem item) {
return item.value == value;
}).length == 1': There should be exactly one item with [DropdownButton]'s value: Project(5, Berlinale 2023, Color(0xffe91e63), true).

Either zero or 2 or more [DropdownMenuItem]s were detected with the same value)

Timecop version: 1.7.2
name: timecop
description: Simple private time tracking.
version: 1.7.2+43
publish_to: none
I am building for MacOs(Darwin) with Flutter: 3.3.0

Why a timer associated with an archived project appears in timers list?
Thanks for your attention.
Screen Shot 2022-09-07 at 6 19 46 PM

Screen Shot 2022-09-07 at 6 20 03 PM

Exported Timecop data does not escape commas

Description

Timecop exports its data in csv format. The UI lets users add commas to their what are you doing? descriptions. When Timecop exports data to csv it leaves those commas intact and unescaped. This breaks the csv format by changing the number and alignment of columns.

Request

Add an option in the Options part of the Export menu to specify some kind of escape characters such as double quotes around the Description field. There's some info about escaping commas in the official csv RFC that might be useful.

Lost project data and export issues

Hello,
Earlier today I lost all my project data: current and old timers are still available, however everything is now listed as "no project" and all my saved projects were removed.

Additionally, when I export my data to CSV, only those timers which were previously listed as "no project" get exported, even though now all the timers appear as "no project".

I remade some projects and assigned them to old timers, however upon re-opening the app the projects were gone and the timers were set back to "no project"

Ability to pause any current timer

Pretty much exactly as it says on the tin. While I do appreciate the ability to add parallel events, another button to just pause the current one would be just fantastatic.

Keep up the good work!

Task multiselect

It'd be useful to be able to select multiple recorded tasks and perform commands on them, including:

  • deleting multiple tasks at the same time
  • changing their project
  • changing their description

Here's a wireframe of what that could look like:
Home  multiselect

To enter this multiselect mode, one would simply long-press an item.

An alternative "comfortable" view

To show project names along with tasks as well as to enable a quicker way to pick up older tasks even on mobile, it'd be nice to have a less dense view as an alternative to the current compact view.

Here's a wireframe for this new view:
Home  complex view

The view would only affect the task list and could be toggled on or off in settings.

Generate screenshots using automated integration tests

Time Cop used to use the screenshot package for automated tests, but unfortunately, that package is obsolete and non-functional now.

Thankfully, Flutter 2.5 and above make it easy to take screenshots inside integration tests. It'd be useful if new tests were written to make generating screenshots easy again.

Here's a relevant article on this: https://dev.to/mjablecnik/take-screenshot-during-flutter-integration-tests-435k

And here's an example of a project using this in practice: https://github.com/wger-project/flutter/tree/feature/exercise-crowdsourcing/integration_test

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.