Code Monkey home page Code Monkey logo

hacki's Introduction

Hacki for Hacker News

A Hacker News client built with Flutter.

App Store Fdroid version GH version style: effective dart GitHub

Features:

  • Log in using your Hacker News account.
  • Browse stories from various categories.
  • Search for stories.
  • Submit stories.
  • Pin stories.
  • Mark stories as favorite.
  • Leave comments.
  • Collapse comments.
  • View parent comments without scrolling up.
  • View and participate in polls.
  • Browse comments and stories you have posted.
  • Vote on comments or stories.
  • Get in-app notification when there is new reply to your stories or comments.
  • Download stories and comments for offline reading.
  • Pick up where you left off.
  • Synced favorites and pins across devices. (iOS only)
  • Export or import your favorites.
  • Launch from system share sheet.
  • And more...

01 06 02 07 03 08 04 09 05 10 ipad-01 ipad-02 ipad-03 ipad-04

hacki's People

Contributors

livinglist avatar

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

hacki's Issues

Can't open links

I'm unable to open links. Tapping the title and the starburst icon does nothing at all. Similarly, tapping links in posts and links in the about page also does nothing (view licenses and close works; developer, source code, and like do not).

See a video here.

Version: 0.2.9 installed via fdroid.
Android 12 on SM-T860 (Galaxy Tab S6)

logcat, error

I'm pretty sure the relevant part is ChromeCustomTabs is not available!, however chrome is absolutely installed and up to date (though I mostly use Lynket with Firefox as renderer; I've got Chrome, Brave, Firefox, Firefox Nightly, jQuarks, Samsung Internet, and Samsung Internet Beta installed). Even if this wasn't the case for me, custom tabs should fall back to the default browser.

The logcat below was created with pidcat com.jiaqifeng.hacki.

                            Process com.jiaqifeng.hacki created for pre-top-activity {com.jiaqifeng.hacki/com.jiaqifeng.hacki.MainActivity}
                            PID: 13708   UID:    GIDs: 

b'           ProcessState  D  Binder ioctl to enable oneway spam detection failed: Invalid argument'
b'         ActivityThread  D  setConscryptValidator'
b'                         D  setConscryptValidator - put'
b'                         D  handleBindApplication()++ app=com.jiaqifeng.hacki'
b'atibilityChangeReporter  D  Compat change id reported: 171979766; UID 10611; state: DISABLED'
b'         jiaqifeng.hack  W  ClassLoaderContext classpath element mismatch. expected=/system_ext/framework/androidx.window.sidecar.jar, found=/system/system_ext/framework/androidx.window.sidecar.jar (PCL[]{PCL[/system_ext/framework/androidx.window.sidecar.jar*3941666722]} | PCL[]{PCL[/system/system_ext/framework/androidx.window.sidecar.jar*3941666722]})'
b"    GraphicsEnvironment  V  ANGLE Developer option for 'com.jiaqifeng.hacki' set to: 'default'"
b'                         V  App is not on the allowlist for updatable production driver.'
b'              LoadedApk  D  LoadedApk::makeApplication() appContext.mOpPackageName=com.jiaqifeng.hacki appContext.mBasePackageName=com.jiaqifeng.hacki'
b'  NetworkSecurityConfig  D  No Network Security Config specified, using platform default'
b'                         D  No Network Security Config specified, using platform default'
b'   WM-WrkMgrInitializer  D  Initializing WorkManager with default configuration.'
b'         ActivityThread  D  handleBindApplication() --'
b'         OpenGLRenderer  D  RenderThread::requireGlContext()'
b'           AdrenoGLES-0  I  QUALCOMM build                   : 3dad7f8ed7, I593c16c433'
b'                         I  Build Date                       : 10/01/21'
b'                         I  OpenGL ES Shader Compiler Version: EV031.32.02.02'
b'                         I  Local Branch                     :'
b'                         I  Remote Branch                    : refs/tags/AU_LINUX_ANDROID_LA.UM.9.1.R1.11.00.00.604.073'
b'                         I  Remote Branch                    : NONE'
b'                         I  Reconstruct Branch               : NOTHING'
b'                         I  Build Config                     : S P 10.0.7 AArch64'
b'                         I  Driver Path                      : /vendor/lib64/egl/libGLESv2_adreno.so'
b'                         I  PFP: 0x016ee190, ME: 0x00000000'
b'atibilityChangeReporter  D  Compat change id reported: 160794467; UID 10611; state: DISABLED'
b'         OpenGLRenderer  D  RenderThread::setGrContext()'
b'         WebViewFactory  I  Loading com.google.android.webview version 101.0.4951.61 (code 495106134)'
b'  cr_WVCFactoryProvider  I  Loaded version=101.0.4951.61 minSdkVersion=29 isBundle=true multiprocess=true packageId=2'
b'       cr_LibraryLoader  I  Successfully loaded native library'
b'  cr_CachingUmaRecorder  I  Flushed 8 samples from 8 histograms.'
b'vityAndFragmentDelegate  W  A splash screen was provided to Flutter, but this is deprecated. See flutter.dev/go/android-splash-migration for migration steps.'
b'              DecorView  I  [INFO] isPopOver=false, config=true'
b'                         I  updateCaptionType >> DecorView@49e3df5[], isFloating=false, isApplication=true, hasWindowControllerCallback=true, hasWindowDecorCaption=false'
b'                         D  setCaptionType = 0, this = DecorView@49e3df5[]'
b'                         I  getCurrentDensityDpi: from real metrics. densityDpi=360 msg=resources_loaded'
b'                         I  notifyKeepScreenOnChanged: keepScreenOn=false'
b'l@4a3a2d7[MainActivity]  I  setView = com.android.internal.policy.DecorView@49e3df5 TM=true'
b'    SurfaceView@cc5e00b  I  onWindowVisibilityChanged(0) true io.flutter.embedding.android.h{cc5e00b V.E...... ......I. 0,0-0,0} of ViewRootImpl@4a3a2d7[MainActivity]'
b'l@4a3a2d7[MainActivity]  I  Relayout returned: old=(0,0,1600,2560) new=(0,0,1600,2560) req=(1600,2560)0 dur=12 res=0x7 s={true -5476376632029528064} ch=true fn=-1'
b'    SurfaceView@cc5e00b  I  windowStopped(false) true io.flutter.embedding.android.h{cc5e00b V.E...... ......ID 0,0-1600,2452} of ViewRootImpl@4a3a2d7[MainActivity]'
b'l@4a3a2d7[MainActivity]  I  [DP] dp(1) 1 android.view.ViewRootImpl.reportNextDraw:11374 android.view.ViewRootImpl.performTraversals:4167 android.view.ViewRootImpl.doTraversal:2893'
b'        hw-ProcessState  D  Binder ioctl to enable oneway spam detection failed: Invalid argument'
b'         OpenGLRenderer  D  eglCreateWindowSurface'
b'    SurfaceView@cc5e00b  I  pST: sr = Rect(0, 0 - 1600, 2452) sw = 1600 sh = 2452'
b'                         I  onSSPAndSRT: pl = 0 pt = 0 sx = 1.0 sy = 1.0'
b'                         I  pST: mTmpTransaction.apply, mTmpTransaction = android.view.SurfaceControl$Transaction@c06e7bc'
b'                         I  updateSurface: mVisible = true mSurface.isValid() = true'
b'                         I  updateSurface: mSurfaceCreated = false surfaceChanged = true visibleChanged = true'
b'                         I  surfaceCreated 1 #8 io.flutter.embedding.android.h{cc5e00b V.E...... ......ID 0,0-1600,2452}'
b'                         I  surfaceChanged (1600,2452) 1 #8 io.flutter.embedding.android.h{cc5e00b V.E...... ......ID 0,0-1600,2452}'
b'l@4a3a2d7[MainActivity]  I  [DP] dp(2) 1 android.view.SurfaceView.updateSurface:1375 android.view.SurfaceView.lambda$new$1$SurfaceView:254 android.view.SurfaceView$$ExternalSyntheticLambda2.onPreDraw:2'
b'                         I  [DP] pdf(1) 1 android.view.SurfaceView.notifyDrawFinished:599 android.view.SurfaceView.performDrawFinished:586 android.view.SurfaceView.$r8$lambda$st27mCkd9jfJkTrN_P3qIGKX6NY:0'
b'    SurfaceView@cc5e00b  I  uSP: rtp = Rect(0, 0 - 1600, 2452) rtsw = 1600 rtsh = 2452'
b'                         I  onSSPAndSRT: pl = 0 pt = 0 sx = 1.0 sy = 1.0'
b'                         I  aOrMT: uB = true t = android.view.SurfaceControl$Transaction@f42345 fN = 1 android.view.SurfaceView.access$500:124 android.view.SurfaceView$SurfaceViewPositionUpdateListener.positionChanged:1728 android.graphics.RenderNode$CompositePositionUpdateListener.positionChanged:319'
b'                         I  aOrMT: vR.mWNT, vR = ViewRootImpl@4a3a2d7[MainActivity]'
b'l@4a3a2d7[MainActivity]  I  mWNT: t = android.view.SurfaceControl$Transaction@f42345 fN = 1 android.view.SurfaceView.applyOrMergeTransaction:1628 android.view.SurfaceView.access$500:124 android.view.SurfaceView$SurfaceViewPositionUpdateListener.positionChanged:1728'
b'                         I  mWNT: merge t to BBQ'
b'    BufferQueueProducer  I  [ViewRootImpl@4a3a2d7[MainActivity]#0(BLAST Consumer)0](id:358c00000000,api:1,p:13708,c:13708) queueBuffer: queued for the first time.'
b'l@4a3a2d7[MainActivity]  I  [DP] pdf(0) 1 android.view.ViewRootImpl.lambda$addFrameCompleteCallbackIfNeeded$3$ViewRootImpl:4969 android.view.ViewRootImpl$$ExternalSyntheticLambda16.run:6 android.os.Handler.handleCallback:938'
b'                         I  [DP] rdf()'
b'                         D  reportDrawFinished (fn: -1)'
b'                         I  MSG_WINDOW_FOCUS_CHANGED 1 1'
b'     InputMethodManager  D  startInputInner - Id : 0'
b'                         I  startInputInner - mService.startInputOrWindowGainedFocus'
b'                         D  startInputInner - Id : 0'
b'    BufferQueueProducer  I  [SurfaceView - com.jiaqifeng.hacki/com.jiaqifeng.hacki.MainActivity@cc5e00b@0#1(BLAST Consumer)1](id:358c00000001,api:1,p:13708,c:13708) queueBuffer: queued for the first time.'
b'l@4a3a2d7[MainActivity]  I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'                         I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'            UrlLauncher  I  component name for https://www.priv.gc.ca/en/opc-news/news-and-announcements/2022/nr-c_220601/ is {kuesji.link_eye/kuesji.link_eye.Main}'
b'                flutter  E  [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: PlatformException(ChromeBrowserManager, ChromeCustomTabs is not available!, null, null)'
b'                         E  #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607)'
b'                         E  #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:167)'
b'                         E  <asynchronous suspension>'
b'                         E  #2      ChromeSafariBrowser.open (package:flutter_inappwebview/src/chrome_safari_browser/chrome_safari_browser.dart:112)'
b'                         E  <asynchronous suspension>'
b'l@4a3a2d7[MainActivity]  I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'            UrlLauncher  I  component name for https://news.ycombinator.com/item?id=31585612 is {kuesji.link_eye/kuesji.link_eye.Main}'
b'                flutter  E  [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: PlatformException(ChromeBrowserManager, ChromeCustomTabs is not available!, null, null)'
b'                         E  #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607)'
b'                         E  #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:167)'
b'                         E  <asynchronous suspension>'
b'                         E  #2      ChromeSafariBrowser.open (package:flutter_inappwebview/src/chrome_safari_browser/chrome_safari_browser.dart:112)'
b'                         E  <asynchronous suspension>'
b'l@4a3a2d7[MainActivity]  I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'                         I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'                         I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'                         I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'                         I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'                         I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'                         I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'                         I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'                         I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'                         I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'                         I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'            UrlLauncher  I  component name for https://livinglist.github.io is {kuesji.link_eye/kuesji.link_eye.Main}'
b'                flutter  E  [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: PlatformException(ChromeBrowserManager, ChromeCustomTabs is not available!, null, null)'
b'                         E  #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607)'
b'                         E  #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:167)'
b'                         E  <asynchronous suspension>'
b'                         E  #2      ChromeSafariBrowser.open (package:flutter_inappwebview/src/chrome_safari_browser/chrome_safari_browser.dart:112)'
b'                         E  <asynchronous suspension>'
b'l@4a3a2d7[MainActivity]  I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'            UrlLauncher  I  component name for https://github.com/Livinglist/Hacki is {kuesji.link_eye/kuesji.link_eye.Main}'
b'                flutter  E  [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: PlatformException(ChromeBrowserManager, ChromeCustomTabs is not available!, null, null)'
b'                         E  #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607)'
b'                         E  #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:167)'
b'                         E  <asynchronous suspension>'
b'                         E  #2      ChromeSafariBrowser.open (package:flutter_inappwebview/src/chrome_safari_browser/chrome_safari_browser.dart:112)'
b'                         E  <asynchronous suspension>'
b'l@4a3a2d7[MainActivity]  I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'            UrlLauncher  I  component name for https://play.google.com/store/apps/details?id=com.jiaqifeng.hacki&hl=en_US&gl=US is {com.android.vending/com.google.android.finsky.activities.MainActivity}'
b'                flutter  E  [ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: PlatformException(ChromeBrowserManager, ChromeCustomTabs is not available!, null, null)'
b'                         E  #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607)'
b'                         E  #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:167)'
b'                         E  <asynchronous suspension>'
b'                         E  #2      ChromeSafariBrowser.open (package:flutter_inappwebview/src/chrome_safari_browser/chrome_safari_browser.dart:112)'
b'                         E  <asynchronous suspension>'
b'l@4a3a2d7[MainActivity]  I  ViewPostIme pointer 0'
b'                         I  ViewPostIme pointer 1'
b'                         I  ViewPostIme key 0'
b'                         I  ViewPostIme key 1'
b'                         I  MSG_WINDOW_FOCUS_CHANGED 0 1'
b"         InputTransport  D  Input channel destroyed: 'ClientS', fd=175"
b'l@4a3a2d7[MainActivity]  I  handleAppVisibility mAppVisible=true visible=false'
b'    SurfaceView@cc5e00b  I  onWindowVisibilityChanged(8) false io.flutter.embedding.android.h{cc5e00b V.E...... ........ 0,0-1600,2452} of ViewRootImpl@4a3a2d7[MainActivity]'
b'                         I  pST: mTmpTransaction.apply, mTmpTransaction = android.view.SurfaceControl$Transaction@c06e7bc'
b'                         I  surfaceDestroyed callback.size 1 #2 io.flutter.embedding.android.h{cc5e00b V.E...... ........ 0,0-1600,2452}'
b'                         I  updateSurface: mVisible = false mSurface.isValid() = true'
b'                         I  tryReleaseSurfaces: set mRtReleaseSurfaces = true'
b'                         I  112235436 wPL, frameNr = 0'
b'                         I  remove() from RT android.view.SurfaceView$SurfaceViewPositionUpdateListener@6b093ac Surface(name=SurfaceView - com.jiaqifeng.hacki/com.jiaqifeng.hacki.MainActivity@cc5e00b@0)/@0x9357875'
b'                         I  remove() io.flutter.embedding.android.h{cc5e00b V.E...... ........ 0,0-1600,2452} Surface(name=SurfaceView - com.jiaqifeng.hacki/com.jiaqifeng.hacki.MainActivity@cc5e00b@0)/@0x9357875'
b'                         I  aOrMT: uB = true t = android.view.SurfaceControl$Transaction@f693e98 fN = 0 android.view.SurfaceView.access$500:124 android.view.SurfaceView$SurfaceViewPositionUpdateListener.positionLost:1785 android.graphics.RenderNode$CompositePositionUpdateListener.positionLost:326'
b'                         I  aOrMT: vR.mWNT, vR = ViewRootImpl@4a3a2d7[MainActivity]'
b'l@4a3a2d7[MainActivity]  I  mWNT: t = android.view.SurfaceControl$Transaction@f693e98 fN = 0 android.view.SurfaceView.applyOrMergeTransaction:1628 android.view.SurfaceView.access$500:124 android.view.SurfaceView$SurfaceViewPositionUpdateListener.positionLost:1785'
b'                         I  mWNT: merge t to BBQ'
b'         OpenGLRenderer  D  setSurface called with nullptr'
b'                         D  setSurface() destroyed EGLSurface'
b'                         D  destroyEglSurface'
b'l@4a3a2d7[MainActivity]  I  Relayout returned: old=(0,0,1600,2560) new=(0,0,1600,2560) req=(1600,2560)8 dur=5 res=0x5 s={false 0} ch=true fn=34'
b'    SurfaceView@cc5e00b  I  windowStopped(true) false io.flutter.embedding.android.h{cc5e00b V.E...... ........ 0,0-1600,2452} of ViewRootImpl@4a3a2d7[MainActivity]'
b'                         D  updateSurface: surface is not valid'
b'                         D  updateSurface: surface is not valid'
b'l@4a3a2d7[MainActivity]  I  stopped(true) old=false'
b'    SurfaceView@cc5e00b  D  updateSurface: surface is not valid'
b'                         I  onDetachedFromWindow: tryReleaseSurfaces()'
b'         OpenGLRenderer  D  setSurface called with nullptr'
b'l@4a3a2d7[MainActivity]  I  dispatchDetachedFromWindow'
b"         InputTransport  D  Input channel destroyed: '678b920', fd=154"

                            Process com.jiaqifeng.hacki (PID: 13708) ended

Add the app privacy policy to the About section

Would be great if you had a privacy policy of the app in the About menu.

Regarding privacy policy, it is obvious that the app connects to HN servers, however it is unclear whether it sends some other data, like analytics or telemetry anywhere else. Also it is unclear whether the API requests of the logged in user somehow differ from those of one without an account (will HN know who you are if you don't post anything but use the app while logged in)

Feature - change default "home" page

being able to move the pages around would be wonderful. I often browse "show HN" more than top posts, as that gets me fresher content and tools that might not make it to "top"

White borders on app icon

When using the Pixel launcher, the app-icon is displayed with small white spots at the bottom and on the right side of the orange background.

Using the Nova Launcher, however, the icon is displayed correctly.

It's a small thing, but now that I've seen it once, I can't unsee it.

Screenshot_20221119-202232_Pixel Launcher

Found a bug in Hacki

Please describe the problem.

[I] updating tabs to [StoryType.top, StoryType.ask, StoryType.show, StoryType.best, StoryType.latest]
[I] resetting comments in CommentCache
[I] resetting comments in CommentCache
[I] resetting comments in CommentCache
[I] resetting comments in CommentCache
[I] resetting comments in CommentCache
[I] resetting comments in CommentCache
[I] resetting comments in CommentCache
Current session logs:
[I] updating tabs to [StoryType.top, StoryType.ask, StoryType.show, StoryType.best, StoryType.latest]
[I] resetting comments in CommentCache
[I] resetting comments in CommentCache
[E] Instance of 'DiagnosticsProperty' ERROR: Provider not found for BlocklistState>
[E] Instance of 'DiagnosticsProperty' ERROR: Provider not found for BlocBuilder<BlocklistCubit, BlocklistState>
[E] Instance of 'DiagnosticsProperty' ERROR: Provider not found for BlocBuilder<BlocklistCubit, BlocklistState>
[E] Instance of 'DiagnosticsProperty' ERROR: Provider not found for BlocBuilder<BlocklistCubit, BlocklistState>
[I] resetting comments in CommentCache
[E] Instance of 'DiagnosticsProperty' ERROR: Provider not found for BlocBuilder<BlocklistCubit, BlocklistState>
[E] Instance of 'DiagnosticsProperty' ERROR: Provider not found for BlocBuilder<BlocklistCubit, BlocklistState>
[I] resetting comments in CommentCache

Feature request: Add link preview

Add option to enable link preview, like on Hacker News.

e.g. a thread about github.com/Livinglist/Hacki would show github.com/Livinglist
or www.example.com/path/to/article would show example.com

In list view the link could appear in its own line, like the metadata.
And in discussion view it could appear below the title.

F-Droid release

Hi, Thanks for making this App!

I just wanted to suggest that you publish this app on the open source app market 'f-droid'. As this application is made for tech savvy people, some of them with privacy concerns, I think this would be a good fit.

Greetings

battery drain

Details

Target Platform: iPhone
Target OS version/browser: iOS15
Devices: iPhone 12

I have recently made a Hacker News reader with Flutter - Hacki, everything seemed great until I discovered its severe battery drain. Attached below are screenshots from my iPhone 12, and as you can see, one hour of Hacki usage consumed three times more battery than Youtube app.

Logs

Logs
Analyzing hacki...                                                      
No issues found! (ran in 3.1s)
[✓] Flutter (Channel stable, 2.10.0, on macOS 12.1 21C52 darwin-arm, locale en)
[!] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
    ✗ cmdline-tools component is missing
      Run `path/to/sdkmanager --install "cmdline-tools;latest"`
      See https://developer.android.com/studio/command-line for more details.
    ✗ Android license status unknown.
      Run `flutter doctor --android-licenses` to accept the SDK licenses.
      See https://flutter.dev/docs/get-started/install/macos#android-setup for
      more details.
[✓] Xcode - develop for iOS and macOS (Xcode 13.2.1)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2020.3)
[✓] VS Code (version 1.64.1)
[✓] Connected device (2 available)
[✓] HTTP Host Availability

Screen Shot 2020-03-03 at 1 22 57 PM Screen Shot 2020-03-03 at 1 22 57 PM

Feature request: a way to expand the content view to fullscreen on tablets

I'm using a 10" tablet, and when I open a story, I'd prefer to see only the comments on that story, and not also see the list of articles. It would be nice to have either of the following:

  1. A setting to emulate the (I assume) mobile view down in the screenshots, where only comments and not stories are shown
  2. A button to expand the current view to fullscreen

Feature request: Add share buttons

Please add a share button to the top right, and another in the comment menu for sharing links to individual comments. (I'll try to take a look at how to do this in a few days, but right now it's sleepy time and I'm guessing you can probably do it in about a minute)

F-Droid build failed

e: /home/vagrant/.pub-cache/hosted/pub.dartlang.org/workmanager-0.4.1/android/src/main/kotlin/be/tramckrijte/workmanager/BackgroundWorker.kt: (132, 21): Object is not abstract and does not implement abstract member public abstract fun error(p0: String, p1: String?, p2: Any?): Unit defined in io.flutter.plugin.common.MethodChannel.Result
e: /home/vagrant/.pub-cache/hosted/pub.dartlang.org/workmanager-0.4.1/android/src/main/kotlin/be/tramckrijte/workmanager/BackgroundWorker.kt: (137, 25): 'error' overrides nothing
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':workmanager:compileReleaseKotlin'.

Could you please take a look? Thanks!

"Favorite" comment action?

There doesn't seem to be a "favorite"/save action for comments. (Which is something that can be done in the browser and in Glider.)

F-Droid inclusion

Hi,

Since this app is GNU GPL v3 licensed, are you considering the fact to add it to F-Droid? There is a strong community behind.

You can find some documentation here.

Otherwise, if you don't want to work on the inclusion of this app by yourself, would it be ok for you if someone else do it for you?

On First Comment Collapse, Subsequent Top Level Comments Fail To Load

I'm on a Pixel 6 Pro stock Android stable.

When you collapse the first comment tree in a thread, the subsequent comments do not load when you scroll down. You must uncollapse the top comment, then scroll down to get the comments to load. I'm not sure I'd call this a bug, but I'd prefer an option to more aggressively load comment content. Maybe a middle ground between the full blown offline mode and the current implementation.

Love the app and thanks for the hard work and frequent updates!

Feature request: View other user profiles from comments

The API makes user info available, such as user's total points (slightly interesting), profile information (important, sometimes has contact info) and the date the profile was created (can be useful to know if it was made the same day sometimes). Please implement at least the profile data in Hacki. Suggested method is tapping on the username on a comment, but the comment menu may work better.

what about android build?

Could you provide build for android? Check github actions docs cuz it will help to create automation and builds for most of usage platforms.

Consistency - slide vs press

with slide navigation and log press to show options on main posts, there is an inconsistency in the UX, since you still slide comments.

Would it be possible to long-press comments instead of a slide?

Going previous activity is painful

On recent smartphones, the action of going to the previous activity is not done with buttons but by swiping from the border to the centre of the screen instead.

Doing this on the app triggers actions such as pinning to the top for example.

I suggest the actions have a margin so they don't trigger if I swipe from the border of my screen.

Feature - share comment link

Coming back with yet another feature!

i'd like to share the comment link, not just the comment text, as sometimes I share a comment in the middle of a thread with someone, with intention of them reading the thread, not just the out-of-context message.

Navigation to next comment of first level and same level

Hello,

Currently we must collapse the current level comment to reach the next same level one. Furthermore, to reach the next first level comment (which often carries a diferent argument) it is necessary either scroll, often a lot, or to collapse all second level comments to reach it quicker. This makes posts with a lot of comments hard to navigate.

I suggest navigation arrows or a swipe gesture that will take you directly to the next comment of the same level as the current one and to the next root one

Thank you.

Bugs when switching apps

This might be useful: flutter/flutter#20897

  1. start Hacki by opening a URL to a story on news.ycombinator.com.
  2. Switch to a different story
  3. scroll down a ways, start replying
  4. Switch apps (or open the story link or a comment link in the external browser)
  5. Close the new app you've opened by hitting the back button in Android or telling the app to close itself
  6. Instead of being back at Hacki, I'm now at my launcher.
  7. Open Hacki from recents
  8. Hacki opens to the link from step 1, not step 2
    • if Hacki was opened from launcher, without steps 1-2, it opens to the main page with no story open.
    • if I was in the middle of writing a comment, and opened browser to research that comment, everything I've written has disappeared
    • Pick up where you left off doesn't appear until after the story list has finished loading/animating (this should probably be a separate bug report)

markdown support

I noticed how many comments often use markdown syntax for emphasis with '*foo*', or '> lorem ipsum' for quote. It would be nice if these were formated.
Also would be really cool to be able to change the font from a file, or pre installed ones.

Add tap zones to post titles to open link and comments

Hello.

Currently we define a setting to load either comments or the article.

I would believe it to be an improvement if tapping the post thumbnail would lead to the articles and tapping the post title text would lead to the comments.

Thank you.

Uncollapse comments

When comments are collapsed clicking on "collapsed (xx)" should uncollapse the comments or the context menu should include an option to uncollapse the comments.

Feature - more share options

It would be nice to share the link to HN, or to the article.

For example, there was a post recently about https://eli5.gg. I want to share it with my wife, but she doesn't care about HN comments, just the product. having a share HN share article distinction would be awesome

Feature - slide to article from comments

going inline with #132, Materialistic has a really nice feature where you can swipe left/right between comments and the article. If slide nav was turned on, it would be cool to slide to article and back to comments

Rename "Clear Data" to "Clear Cache"

Usually "Clear Data" means clearing all of the app data, including the settings and user account(s), so I think "Clear Cache" would be more intuitive

Minor bug: comment box remains open when switching stories

When I start a comment, change my mind and switch to a different story, the comment box remains open. It should probably close to prevent the user from accidentally submitting a reply to the wrong story.

If there's any text in the comment box, it might be worth popping up a confirmation to ensure it wasn't accidental.

Cannot login on Android 11

I have several devices with Android 11 and when I try to login to my Hacker News account the app keeps loading and never succeeds to gain access to it.
Screenshot_2022-06-22-07-50-29-671_com.jiaqifeng.hacki.jpg

Notifications bar icons stays dark/black whatever the theme is, having them invisible or almost

With version 1.3.4 of the application, the notification tray icons stays black, so with the dark theme they're very hard to read, and with the true black one it's black on black, therefore absolutely nothing is visible.
This happens on an Android Oreo (8.0) device, and is maybe related to the changes that were done to fix the system buttons which had a similar issue?

Screenshot of the issue

Screenshot_20230407-003007

missing a regular serif font

Thanks for Hacki! It's great that we can choose font for the text. But I'm missing a "regular" serif font, in addition to the (Roboto) Slab. I'm not sure which one it should be. Could the one selectable within the Wikipedia Android app be a candidate? I don't know which one that is though.

Minimum android version support

Hey,

After trying a few hacker news app, yours has become my favorite!

Is it possible to lower the minimum android version? My smartphone is using Android 10 and I can't install your new updates now because the minSDKVersion is 30 while I'm 29 😭.

Cheers!

Allow users to block stories and comments containing certain keywords

Hi! Would it be possible to add some kind of filter? It would be very nice to block the stories concerning ChatGPT. They are really too many, bordering on spam.

The user provides a set of keywords, and if one of them appears in a story title or comment then they are not shown.

Option to disable all popup or banners

Every time when I click a story I see this popup or banner (in orange color) with a caption
example:
Fav a Story
add it to your favorites

I noticed similar banners as well in the app. Orange banner / popup never goes off.

I could not find any option to disable this banners in "settings". I request for an option to disable such banners.

Thanks for the nice app :)

Feature/enhancement request: Enable back button functionality

Back button should do the following, instead of always closing the app like it currently does:

  1. When in expanded comments view, go back to the combined article list/comments view
  2. When writing a comment in expanded view, shrink the comment field again
  3. When writing a comment not in expanded view, just cancel writing the comment
  4. Even when not doing anything, prompt the user if they want to exit, or require tapping back a second time

Hacki works differently from most other HN clients and similar apps (Reddit/Twitter clients, etc), and I keep accidentally pressing back to cancel a comment or to leave the current article and go to the next. Since I mostly use Hacki in windowed mode, exiting doesn't bring me back to the home screen, it just closes the window. If I have other windowed apps running, going to the home screen to restart Hacki minimizes them, and they all have to be restored individually (this is on Google, but preventing the user from accidentally closing the app should be easy).

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.