2013/12/31

漫畫下載器 v4.0.5

v4.0.5 -
+ 新增 crash report, 如果 FC, 請把根目錄的 comicsdownloder.log 寄給我們.
+ 新增影像解析度模式, 閱讀時常出現錯誤的請至設定調整成 Low memory mode.
+ 加速檢查我的最愛的速度
+ 調整部份 UI

- 修正搜尋無結果問題
- 修正部份容易出現 FC 的問題
- 修正部份四角縮放的問題

Box: v4.0.5

2013/12/28

小說閱讀器 v 1.8.3

v 1.8.3
+ 增加文字檔的繁簡轉換
> 根據設定裡的內文設定.

BUGS:
- 修正 '520xs' 章節順序錯亂問題


Google Play: 小說閱讀器 v1.8.3

2013/12/26

漫畫下載器 v4.0.1

之前舊版本原始碼我自己都無法編譯了.
所以重新弄了一個, 也針對現在網站的一些編碼重新'處理'一下.

支援 android 4.1.2 版本以上.
目前支援以下:
+ 線上閱讀
+ 離線閱讀 (下載後閱讀)
+ 我的最愛 (匯出匯入功能, 相容之前舊版本)
+ 點擊換頁, 點擊換話(集)
+ 自動檢查更新
+ 支援多線程下載
+ 支援瀏覽方向切換 (左右切換)
..
陸續會支援其他功能


Box: v4.0.1

2013/12/19

小說閱讀器 v 1.8.1

v 1.8.1
+ 修改點擊圖檔後顯示方式.

BUGS:
- 修正部份 FC 問題
- 修正部份自動檢查更新的問題
- 修正 '大文學' 部份小說無法載入問題
- 修正 '晉江文學' 部份小說無法載入問題
- 修正旋轉後, 會退回網站列表的問題


Google Play: 小說閱讀器 v1.8.1

2013/12/11

FlickrBot v1.0.2

v 1.0.2
+ Add show photo description
+ Switch back to use 'single-tap' to play video
+ Add auto create default set if default set is not exist
+ Add 'prompt' option for default sets in setting page
> This will ask you to choose or create sets when upload

*BUGS:*
- Fix download bug in view mode
- Fix even remove items from queue, it is still not removed
- Fix when upload to a set, press OK will reset the set chosed
- Fix some default set and tag bug
> Please re-config to fix the bug

Google Play: FlickrBot v1.0.2

2013/12/08

OAuth Example

最近由於正在做 flickr 的 client , 所以稍微實作了一下 OAuth 的部份.

OAuth 認證部份可以透過 http://www.flickr.com/services/api/auth.oauth.html 了解.

以下是實作部份.

最主要部份是上面網址的 2 -> 3, 要怎麼去收到使用者輸入後所得到的 verifier 來取得 access token.

這邊我們使用 scribe 套件.


        OAuthService service = new ServiceBuilder()
                .provider(FlickrApi.class)
                .apiKey(YOUR_API_KEY)
                .apiSecret(YOUR_API_SECRET)
                .callback(CALLBACK_SCHEME)
                .build();

這邊 callback_scheme 可以隨便自己定義, 但記得使用這樣的格式 'xxxx://xxxxx'.
callback 是當使用者輸入他的帳號密碼後, flickr api 會呼叫 callback 所指向的位址.
而我們就可以透過此位址來得到 verifier 以便之後取得 access token.
以下就可以看到回傳的格式, 這樣我們很方便可以透過 Uri 來取得 oauth_verifier
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                mProgress.setVisibility(View.VISIBLE);
                mProgress.setIndeterminate(false);
                mProgress.setProgress(0);
            }

            @Override
            public void onPageFinished(final WebView view, String url) {
                mProgress.setVisibility(View.GONE);
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url == null) {
                    return true;
                }

                if (!url.startsWith(CALLBACK_SCHEME)) {
                    /**
                     * if this is not our callback scheme, just pass it to the webview
                     */
                    view.loadUrl(url);
                    return true;
                }

                //tw.clotai.oauthexample:callback?oauth_token=72157638471772995-ad1973723cfdceb4&oauth_verifier=b0ef999e41547457

                Uri uri = Uri.parse(url);
                String verifier = uri.getQueryParameter("oauth_verifier");
                return true;
            }
        });


這範例很簡單, 主要部份只要注意這邊即可. 其他應該也不用多說.

完整的原始碼: OAuthExample.zip

小說閱讀器 v 1.7.9

試著解決最近幾個版本容易跳出的問題.
如果這版本一樣有問題, 麻煩告知.

剛放上去, 約 1-2 小時可以使用.

v 1.7.9
+ 修改退出 app 方式為連按兩次退出
+ 增加開關 '自動回報錯誤', 預設開啟

BUGS:
- 修正部份使用 wifi 所導致的連線問題
- 修正部份文字檔無法存在最近閱讀的問題
- 試著修復容易跳開的問題


Google Play: 小說閱讀器 v1.7.9

2013/12/06

FlickrBot v1.0.1

v 1.0.1
+ Switch to use 'double-tap' to play video
+ Better error-handling
+ Add default set, tags setting for upload
+ Add ability to have different default privacy settings and upload settings for different account
> Please re-config again to make it work.

*BUGS:*
- Fix some UI Bugs
- Fix when uploading large files, it will crash
- Fix choose exist set, it won't upload to this selected set
- Fix some FC issues


Google Play: FlickrBot v1.0.1

2013/12/05

小說閱讀器 v 1.7.7

v 1.7.7
+ 最近閱讀會顯示從我的書櫃閱讀的小說
+ 增加離開確認視窗.
+ 增加點擊插圖可另開新窗檢視.
+ 新增 '大文學' 支援
+ 新增 '燃文小說網' 支援
> 此網站是由 '燃文中文網' 改版, 舊版本跟新版本不相容

BUGS:
- 修正 android 4.4 內文位置紀錄錯誤的問題
- 修正部份 FC 問題
- 修正檢查小說更新的部份問題


Google Play: 小說閱讀器 v1.7.7

2013/12/04

FlickrBot v1.0.0

Feature:
+ Multiple account supported
+ Easy to browse photos and videos
+ Video supported. (Using external video player)
+ Batch upload.
+ Batch download. You can select the download photo quality in the settings, default is 'Best'
+ Explore the days most interesting photos.
+ Explore the most recent photos.
+ Easy to check on someone's photostream, favorites and sets. (By click on their's buddy icon)
+ Pinch to zoom
+ Add/Remove your favorite photos or videos.
+ Integration with other apps (upload one or multiple image/video from other apps)


Supports:
If you have any suggestions or problems, you can email to weakapp@gmail.com with the details if this is a bug (device, android version and steps to reproduce the problem)

** This app is using the Flickr API but is not endorsed or certified by Flickr. **

Changelog

v 1.0.0
+ Beta Release
+ Multi-account supported
+ Batch upload/download supported
+ Video supported (Using external video player to play)
+ Logout supported


Google Play: FlickrBot v1.0.0

2013/11/29

小說閱讀器 v 1.7.5

v 1.7.5
+ 小說類別和清單新增 'Feedback' 功能, 有問題可透過此回報.
+ 新增 '非凡TXT下載' 小說網站支援

BUGS:
- 修正下載勾選章節部份, 輸入不清楚的問題. (選擇黑底時才會發生)
- 修正 '燃文中文網' 分類錯誤, 頁數錯誤以及內文短缺的問題
- 修正部份 FC 問題
- 修正 'SF - 輕小說' 搜尋不能有空格的問題
- 修正部份顯示的問題


Google Play: 小說閱讀器 v1.7.5

2013/11/23

小說閱讀器 v 1.7.3

v 1.7.3
+ 新增 '橫向鎖定', '直向鎖定' 功能

BUGS:
- 修正白底時, 登入畫面輸入會看不到字的問題
- 修正 '伊莉 - BL' 載入問題
- 修正部份 '夜玥' 小說沒有載入的問題
- 修正長按小說清單跳出選單的問題
- 修正 android 2.3.x 版本, 隱藏標題時, 在章節目錄下載的問題
- 試著再度修正章節自動紀錄的問題, 請如果還有問題幫忙回報一下


Google Play: 小說閱讀器 v1.7.3

2013/11/21

小說閱讀器 v 1.7.2

v 1.7.2
BUGS:
- 修正容易 FC 問題
- 修正 '迷糊動漫' 插圖無法觀看的問題
- 修正 '摘書網' 搜尋問題


Google Play: 小說閱讀器 v1.7.2

2013/11/20

小說閱讀器 v 1.7.0

v 1.7.0
+ 增強章節目錄載入的錯誤處理
+ 增加設定可選擇 '白底' 或者 '黑底'
+ 新增 '伊莉' 的 'BG-GL 小說'
+ 新增 '燃文中文網' 支援
+ 新增 '宙斯小說網' 支援
+ 移除 '簡潔小說網' 支援
+ 移除 '卡提諾' 的 '全本小說'
> 目前卡提諾移除此區了
+ 章節目錄增加選項 '使用瀏覽器開啟'
> 當遇到問題可使用此選項確認是否是網站問題

BUGS:
- 修正 '瀟湘書院' VIP 文章顯示載入錯誤問題
- 試著解決自動紀錄閱讀位置錯誤的問題
- 修正 '起點' 勾選 '內文使用網站預設編碼'時無法載入內容問題


Google Play: 小說閱讀器 v1.7.0

2013/10/31

論壇瀏覽器 v2.3.4

v 2.3.4
+ 新增可修改自訂論壇的設定
+ 加強部份論壇系列的支援

**BUGS:**
- 修正 bbs.gfan.com 讀帖會開啟瀏覽器的問題


Google play store: v2.3.4

2013/10/29

小說閱讀器 v 1.6.5

v 1.6.5
+ 設定頁面增加亮度調整功能
> 由於增加亮度設定, 所以必須新增 android 權限
+ 修改 UI 為黑色背景
+ 新增 '瀟湘書院' 支援
+ 新增 '自在讀小說網' 支援
+ 新增 '摘書網' 支援
> 搜尋部份目前我們只支援第一頁

BUGS:
- 修正在章節目錄按音量鍵會導致 FC 問題
- 修正部份載入問題

Google Play: 小說閱讀器 v1.6.5

2013/10/22

小說閱讀器 v 1.6.2

v 1.6.2
+ 新增 '迷糊動漫 - 輕小說' 支援
+ 新增 '黃金屋中文' 支援
+ 搜尋頁面新增小說封面顯示
+ 我的下載清單新增可單獨刪除一本小說
+ 新增設定, 可設定 app 開啟時的預設頁面
+ 新增文字檔自動判斷編碼的功能
> 如果無法判斷則使用所設定的內文編碼

BUGS:
- 修正部份 FC 問題
- 修正部份讀取文字檔錯誤的問題
- 修正 VPON 廣告點擊後的行為
- 修正部份搜尋的 bug
- 修正判斷下載失敗的問題


Google Play: 小說閱讀器 v1.6.2

2013/10/12

LG G2 K 版 - 移除最近程式下面的快捷 ICON


首先必須要 deodex, 不會的可看此篇 如何 deodex stock rom 的 apk 檔案

下面紀錄一下如何移除.

apktool d LGSystemUI.apk

進入目錄 LGSystemUI, 找到以下檔案
res/layout-port/recent_mobile_ktf.xml
res/layout-land/recent_mobile_ktf.xml

以下為原始檔案


    
        
        
    
    
        
        
    
    
        
        
    
    
        
        
    


在每個 LinearLayout 後面加上 android:visibility="gone"

以下為局部內容
    
        
        
    

這樣四個 icon 就不見了.

接著修改以下檔案
res/layout/status_bar_recent_panel.xml
找到 recent_mobile_ktf
修改成以下


res/layout-land/status_bar_recent_panel.xml
找到 recent_mobile_ktf
修改成以下


接著就是把 apk 重組後放置到 system/app 就可以了. 記得修改權限.


小說閱讀器 v 1.6.1

v 1.6.0 更新沒多久就又發現有平板無法開啟問題.
不同 Layout 要注意每個都有改到的問題還真麻煩.


v 1.6.1
+ 移除 Dropbox, 我們打算採用 Google Sync 方案.

BUGS:
- 修正 '平版機型' 載入搜尋失敗的問題
- 修正搜尋時的部份問題


v 1.6.0
+ 採用舊式快速捲動的方式, 觸控界面較大比較方便快速捲動
+ 搜尋畫面增加搜尋字串可轉簡繁體的功能
+ 修正單篇小說無法顯示在我的下載清單裡面

BUGS:
- 修正部份閱讀及載入圖檔文章的問題
- 修正 ck101, Eyny 在小說清單選擇搜尋時, 沒提示要登入的問題
- 修正 2.3.x android OS 在載入更多時, 無法點擊的問題
- 試著修正部份機型出現白屏的問題
> 還有發生麻煩來信告知


Google Play: 小說閱讀器 v1.6.1

2013/10/08

LG G2 韓版 - 如何開啟相機無聲的選項 for Kitkat

首先必須要有編譯反編譯的基礎.
由於基本上原廠 rom 都是 odex 的, 所以也必須要 deodex.

如何 deodex 和 odex , 可以參考以下文章.
如何 deodex stock rom 的 apk 檔案.

以下是如何修改相機無聲選項.

搜尋以下字串 'isSupportShutterSoundOff'

以下為修改好的部份

.method public static isSupportShutterSoundOff()Z
    .locals 1

    .prologue
    .line 20
    #sget-boolean v0, Lcom/lge/camera/properties/ShutterSoundProperties;->mShutterSoundOff:Z
    const/4 v0, 0x1

    return v0
.end method

儲存, 這樣相機無聲的選項就開啟了. 接著上面連結所說的做就可以了.

但是即使是相機開無聲, 對焦時還是會有逼逼的聲音.
以下就是連逼逼都去掉.

com/lge/camera/controller/SoundController.smali

.method public playAFSound(Z)V
    .registers 6
    .param p1, "seccess"    # Z

    .prologue
    const/4 v3, 0x0

    .line 769
    const-string v0, "CameraApp"

    new-instance v1, Ljava/lang/StringBuilder;

    invoke-direct {v1}, Ljava/lang/StringBuilder;->()V

    const-string v2, "playAFSound : seccess="

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1

    invoke-static {v0, v1}, Lcom/lge/camera/util/CamLog;->d(Ljava/lang/String;Ljava/lang/String;)V
    
# Add Begin
    invoke-static {}, Lcom/lge/camera/properties/ShutterSoundProperties;->isSupportShutterSoundOff()Z

    move-result v0

    if-eqz v0, :cond_2

    const-string v0, "off"

    iget-object v1, p0, Lcom/lge/camera/controller/Controller;->mGet:Lcom/lge/camera/ControllerFunction;

    const-string v2, "key_camera_shutter_sound"

    invoke-interface {v1, v2}, Lcom/lge/camera/ControllerFunction;->getSettingValue(Ljava/lang/String;)Ljava/lang/String;

    move-result-object v1

    invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z

    move-result v0
    
    if-nez v0, :cond_0

    :cond_2
# Add End

    .line 770
    if-eqz p1, :cond_29

    .line 771
    iget v0, p0, Lcom/lge/camera/controller/SoundController;->mSound_afSuccess:I

    invoke-direct {p0, v0, v3}, Lcom/lge/camera/controller/SoundController;->checkSoundLoaded(IZ)Z

    move-result v0

    if-eqz v0, :cond_28

    .line 772
    iget v0, p0, Lcom/lge/camera/controller/SoundController;->mSound_afSuccess:I

    invoke-virtual {p0, v0}, Lcom/lge/camera/controller/SoundController;->soundPlay(I)V

    .line 779
    :cond_28
    :goto_28
    return-void

    .line 775
    :cond_29
    iget v0, p0, Lcom/lge/camera/controller/SoundController;->mSound_afFail:I

    invoke-direct {p0, v0, v3}, Lcom/lge/camera/controller/SoundController;->checkSoundLoaded(IZ)Z

    move-result v0

    if-eqz v0, :cond_28

    .line 776
    iget v0, p0, Lcom/lge/camera/controller/SoundController;->mSound_afFail:I

    invoke-virtual {p0, v0}, Lcom/lge/camera/controller/SoundController;->soundPlay(I)V

    goto :goto_28
.end method

這樣就可以連對焦的聲音都關閉了.

2013/10/07

小說閱讀器 v 1.5.9

v 1.5.9
+ 增加 '自動紀錄所選擇文字檔編碼' 的功能
+ 搜尋增加 "搜尋" 按鈕
+ '精品文學網' 新增如果原本使用伺服器找不到, 會使用另一個伺服器

BUGS:
- 修正 '卡提諾 - 小說頻道' 部份文章顯示問題
- 修正顯示 null 的問題
- 修正 2.3.x 版本在選擇下載目錄或者我的書櫃目錄時, 背景顏色問題
- 解決閱讀時會切換章節會跳至前面的問題
- 修正部份 FC 問題


Google Play: 小說閱讀器 v1.5.9

2013/10/03

如何 deodex stock rom 的 apk 檔案.

原廠的 android rom 通常都是 odex 過的. 這代表沒辦法直接去修改 apk 來達到想要的目的.
這邊紀錄一下怎麼 deodex , 免得自己忘記.

需要工具:
1. https://code.google.com/p/smali/ (deodex, odex 工具)
2. rom 裡面的 /system/framework 整個目錄
3. 你想要 deodex 的檔案, 這邊用 Calculator.apk, Calculator.odex 當作範例.

以下是步驟.
1.
java -jar baksmali-2.0b6.jar -x Calculator.odex -d system/framework # 產生 out 目錄
java -jar smali-2.0b6.jar out -o classes.dex # 產生 classes.dex

2.
用壓縮軟體開啟 Calculator.apk, 把 classes.dex 直接拉進去.


就這麼簡單. 接下來只要把 rom 裡面的 Calculator.apk, Calculator.odex 移除, 換上作好的 Calculator.apk.
這樣就可以了.

2013/10/02

How to use usb stick to install linux

紀錄一下如何製作 linux 的 usb 安裝碟. (家裡想不到找不到任何空白光碟可以燒 iso).

Debian 可至 : http://http.us.debian.org/debian/dists/stable/main/ 找尋對應的 installer (本人用 amd64).

AMD64: boot.img

AMD64 netinstall iso: http://cdimage.debian.org/debian-cd/7.1.0/amd64/iso-cd/debian-7.1.0-amd64-netinst.iso


Fedora 可至 : http://mirrors.yun-idc.com/fedora/releases/ 找尋你想要的 fedora 版本後. 再去 Fedora/x86_64/os/images/ 路徑找尋 boot.iso
基本上你點進 fedora 你必須選擇你要用 i386 or x86_64, 我都是直接用 x86_64

X86_64: http://mirrors.yun-idc.com/fedora/releases/18/Fedora/x86_64/os/images/boot.iso


將 usb 接入到你的電腦, 查詢一下所對應的 device
[17026.550768] scsi 7:0:0:0: Direct-Access     USB 2.0  USB Flash Drive  0.00 PQ: 0 ANSI: 2
[17026.552591] sd 7:0:0:0: Attached scsi generic sg2 type 0
[17026.552691] sd 7:0:0:0: [sdb] 3948544 512-byte logical blocks: (2.02 GB/1.88 GiB)
sdb 就是這 usb 對應的 device.


Debian 和 Fedora 方式有所不同. 以下分別說明.

[Debian]
zcat boot.img.gz > /dev/sdb
mkdir tmp
sudo mount /dev/sdb tmp
cp debian-7.1.0-amd64-netinst.iso /tmp
sudo umount tmp

[Fedora]
su -c 'dd if=boot.iso of=/dev/sdb'

這樣就完成!

2013/10/01

小說閱讀器 v 1.5.8

v 1.5.8
+ 設定是否啟動 '點擊平滑換頁' 的功能
+ 增加內文上下篇章節連結的位置設定
> 可設定 '隱藏', '右邊', '左邊', '中間'
> 已經暫存的必須重新暫存才會生效

BUGS:
- 修正部份 FC 問題
- 修正未設定我的書櫃路徑時, 重新整理會 FC 的問題
- 修正 '夜玥 - 耽美小說區' 下載是亂碼的問題
- 修正 '17K' 出現 null 問題. (基本上這些都是 vip 章節)
- 修正音量鍵失效的問題
- 修正 '我的書櫃' 說明每次進去都會顯示的問題
- 修正 '卡提諾 - 小說頻道' 長篇小說在全本小說分類沒有顯示的問題
- 試著解決因為廣告而導致跳動的問題. (如果還有問題請再反應)
- 修正內文背景顏色不是白色, 點擊換頁會閃爍的問題.
- 修正部份網站即使使用 '低記憶體模式' 無效的問題.


Google Play: 小說閱讀器 v1.5.8

2013/09/29

小說閱讀器 v 1.5.7

v 1.5.7
+ 修改點擊換頁的動作. 改成直接跳動而不是滑動.
+ 主頁面新增選項 '分享此 app' . 希望大家多幫忙分享.
+ 增加閱讀小說的 '低記憶體' 設定, 不會預載下一篇. 預設關閉.
> 如果記憶體比較不夠的可以開啟此功能
+ 增加 '夜玥 - 耽美小說區' 支援.
> 目前不支援登入功能, 所以需要權限的小說無法觀看.
> 看到紅色字體就是無法觀看.
+ 修改部份 UI, 操作動作.
> 如果設備是手機, 可以點擊左上角開啟選單, 或者由左往右拉也可以開啟選單.
+ 設定新增連結 Dropbox 同步帳戶
> 目前其他功能還未放上去, 請先測試看看是否能成功的連結 Dropbox

BUGS:
- 修正魅族選擇繁體時, 內文一樣顯示簡體.
- 修正魅族部份文章載入不完全的問題.
- 修正部份伊莉小說字體無法放大的問題.
- 修正伊莉搜尋顯示少部份資訊的問題.
- 修正起點缺少 '科幻' 分類的問題.
- 修正部份在 andorid 2.3.x 版本的問題.


Google Play: 小說閱讀器 v1.5.7

2013/09/21

論壇瀏覽器 v2.3.3

v 2.3.3 -
+ 加強部份論壇系列的支援

**BUGS:**
- 修正字體設定後, 進入內文閱讀必須在設定一次的問題
- 修正部份 PM 問題


Google play store: v2.3.3

2013/09/19

Broken usb cable ??

我的 host 使用 linux , 所以當要使用 網路 ATM 就必須透過 virtualbox 來使用.
不過有時遇到下面錯誤. 這時怎樣都不能操作了.
Broken usb cable

解決方式如下:
sudo rmmod ehci_hcd; sudo modprobe ehci-hcd

PS: 記得這要同一個指令, 否則你的 usb devices 就不能用了. (當你使用 usb 鍵盤, 你就連操作都不能操作.)

小說閱讀器 v 1.5.6

持續努力修改中.

v 1.5.6
+ 增加 '魅族小說網' 支援
+ 增加 '晉江文學網' 支援
+ 設定增加 '使用內文預設編碼'
> 此功能是內文會預設使用網頁編碼, 不會自動繁轉簡或簡轉繁

BUGS:
- 修正設定畫面, 在某種狀況下無法設定下載目錄和我的書櫃目錄的問題
- 修正部份 FC 問題
- 試著修復最後一頁有可能導致閱讀位置錯誤的問題


Google Play: 小說閱讀器 v1.5.6

2013/09/17

小說閱讀器 v 1.5.4

v 1.5.4
* 我的書籤, 最近閱讀新增封面
* 部份刪除動作加上確認提示

BUGS:
* 修正部份九天無法載入的問題
* 修正九天小說封面載入的問題(簡體才會發生)
* 修正部份 Nch 小說載入有亂碼的問題
* 修正設定畫面部份 FC 的問題
* 修正部份 'SF - 輕小說' 部份文章文字顏色無法設定的問題

Google Play: 小說閱讀器 v1.5.4

2013/09/11

小說閱讀器 v 1.5.0

v 1.5.0
* 增加 '卡提諾 - 小說頻道' 更多分類
* 增加 '耽美小說中文網, 17K中文網, 17K女生網' 的支援
* 設定增加開啟/關閉 '點擊換頁' 功能
* 線上小說網站增加選項 '使用瀏覽器開啟'
> 如果遇到線上小說網站一直連線失敗, 請使用此選項開啟看是否正常
* 修改載入簡介的方式, 改成直接載入網頁
> 簡介只能看簡介, 所有連結都無法使用

BUGS:
* 修正部份 FC 問題
* 修正部份搜尋錯誤
* 修正 '我的書櫃' 出現 FC 的問題
* 修正部份金沙圖檔文章無法放大的問題
* 修正金沙搜尋, 點擊簡介有時會永遠載入失敗的問題
* 修正書籤匯出匯入錯誤的問題
* 修正 'SF - 輕小說' 部份小說載入失敗的問題

Google Play: 小說閱讀器 v1.5.0

2013/09/06

小說閱讀器 v 1.4.8

v 1.4.8
BUGS:
* 緊急修正如果隱藏標題列, 則無法閱讀小說的問題

小說閱讀器 v 1.4.7

v 1.4.7
* 書籤頁面增加 '加入書籤時間' 排序
* 小說閱讀頁面新增加入書籤功能
* 增加 'SF - 輕小說' 支援
* 修改卡提諾載入網址

BUGS:
* 修正搜尋時, 有時關閉搜尋畫面必須關兩次的問題
* 修正部份閱讀內文紀錄錯誤的問題
* 修正主頁面移除書籤後, 點擊最近閱讀動作不正確的問題
* 再度修正部份資料庫錯誤問題
* 修正部份小說章節的問題
* 修正 '伊莉 - 長篇小說' 自動跳入登入畫面時, 登入永遠失敗的問題
* 修正 '我的書櫃' 部份問題


Google Play: 小說閱讀器 v1.4.7

2013/09/03

小說閱讀器 v 1.4.6

v 1.4.6
* 修改部份圖示解析度

BUGS:
* 修正搜尋時出現 FC 的問題
* 修正部份容易 FC 問題
* 修正部份廣告導致的問題


Google Play: 小說閱讀器 v1.4.6

2013/09/02

小說閱讀器 v 1.4.5

v 1.4.5
* 新增搜尋作者的功能
* 新增 '飛鳥中文網' 支援
* 恢復自動暫存的功能, 請至設定中開啟, 預設關閉
* 增加可設定廣告位置, 預設在畫面下方
* 修改部份廣告顯示方式

BUGS:
* 修正部份 FC 問題
* 修正部份資料庫問題


Google Play: 小說閱讀器 v1.4.5

2013/08/31

論壇瀏覽器 v2.3.2

v 2.3.2 -
* 加強部份 Discuz2.x, 3.x 系列支援度
* 增加滑動換頁的功能

**BUGS:**
* 修正部份回覆出現亂碼的問題
* 修正微風載入的問題
* 修正 TvBoxNow 部份載入失敗問題
* 修正部份 FC 問題
* 修正部份 JKForum 顯示問題


Google play store: v2.3.2

2013/08/29

小說閱讀器 v 1.4.4

v 1.4.4
* 章節目錄新增可清除選擇的章節暫存
* 移除閱讀快取功能, 要快取請使用離線暫存功能
* 新增部份使用說明
* 新增部份線上小說分類
* 新增 '伊莉 - 長篇小說' 支援 (須登入才能觀看全文)
* 小說清單, 新增選項可跳至小說簡介
> '簡潔', '卡提諾', '伊莉' 沒有小說簡介

BUGS:
* 修正金沙中文網搜尋時, 如果只有一個結果時會判斷搜尋不到
* 修正金沙中文網無法載入簡介的問題
* 修正在設定取消快取時, 下載也無法觀看的問題
* 修正 天使論壇-輕小說 顯示標題不完整的問題
* 修正 天使論壇-輕小說 '全部' 的小說清單列表錯誤的問題
* 修正部份 FC 問題


Google Play: 小說閱讀器 v1.4.4

2013/08/26

論壇瀏覽器 v2.3.1

v 2.3.1 -
* 增加顯示 Discuz7.x 投票選項 (我們不會支援投票功能)
* 加強 Discuz2.x, 3.x, Discuz6.x 系列支援.
* Discuz NT! 系列可以使用 Discuz7.x 測試

**BUGS:**
* 修正 Discuz7.x 系列部份操作問題
* 修正 輕之國度 搜尋出現亂碼的問題
* 修正泉川部份文章內容有亂碼的問題
* 修正 Eyny PM 讀取會失敗的問題


Google play store: v2.3.1

2013/08/23

小說閱讀器 v 1.4.3

v 1.4.3
* 起點中文, 起點女生網新增免費區, 在此區的列表不會有 vip 小說在裡面
* 起點中文, 起點女生網新增 vip 小說提示
* 雲端備份(Dropbox)功能暫時取消 (經測試在部份手機上會有問題)

BUGS:
* 修正螢幕旋轉圖示切換章節後顯示錯誤的問題


Google Play: 小說閱讀器 v1.4.3

how to show remote tags

紀錄一下
git ls-remote --tags 

論壇瀏覽器 v2.3.0

v 2.3.0 -
* 新增 discuz 7.x 系列的支援
* 移除部份頁面的廣告
* 移除跳至 Go Top 按鈕
* 增加以下論壇支援. (如有任何問題請來信告知)
> plus28, wahas, tvboxnow, 泉川生徒會, 輕之國度

**BUGS:**
* 修正點擊圖片時, 出現黑畫面的問題
* 修正部份連結錯誤的問題
* 修正部份論壇檢視 PM 會發生錯誤的問題


Google play store: v2.3.0

2013/08/19

論壇瀏覽器 v2.2.9

v 2.2.9 -
* 增加 discuz 6.x, discuz 2.5X 系列的支援性
> 原本自訂論壇有問題的可以再測試看看.
* 增加 https 支援
* 置換 ActionBarSherlock 第三方軟體, 改使用 Google AppCompat 套件
> 可能會導致 android 3.x 版本的相容性變差.

**BUGS:**
* 修正搜尋後的連結點擊出現未支援的問題
* 修復載入 PM 失敗的問題
* 修復 A4TW, Taiwan City, FDZone, 無限論壇 支援
> 已加入書籤者請重新加入書籤


Google play store: v2.2.9

2013/08/14

Example of using AppCompat

Actionbar 是 android 3.0 以後才有的, 所以之前都是使用 actionbarsherlock 來往前相容.
最近發現 google 也推出 actionbar compat 的版本, 所以就改使用 google.
以下是使用範例 :

要使用 actionbar, 首先在 menu layout 就必須做一些修正.
以下是使用的 layout, 可以看到在 showAsAction 的部份的不同. myapp 可以自訂成自己所要使用的字串
<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:myapp="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100"
        android:icon="@android:drawable/ic_menu_preferences"
        myapp:showAsAction="ifRoom" />
</menu>

以下是測試的 layout.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              tools:context=".MainActivity"
              android:orientation="vertical">

    <ListView
            android:id="@+id/list"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
</LinearLayout>

而要使用 AppCompat 的話, activity 必須繼承 ActionBarActivty
package tw.clotai.appcompatexample;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends ActionBarActivity {

    final String[] data = {"1", "2", "3", "4", "5", "6"};

    ListView mList = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this, android.R.layout.simple_list_item_1, data);

        mList = (ListView)findViewById(R.id.list);
        mList.setAdapter(adapter);

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}


特別注意的是在 AndroidManifest.xml 裡面的 theme 必須使用以下幾種, 否則就會有問題.
Theme.AppCompat
Theme.AppCompat.Light
Theme.AppCompat.Light.DarkActionBar


小說閱讀器 v 1.4.0

v 1.4.0
* 新增點擊最近閱讀的小說, 有加入書籤則跳至最後閱讀位置, 否則跳至章節目錄

BUGS:
* 修正部份 FC 問題
* 修正 NCH 部份小說內容無法顯示的問題


Google Play: 小說閱讀器 v1.4.0

2013/08/11

小說閱讀器 v 1.3.9

v 1.3.9
* 再度優化部份記憶體使用
* 增加在閱讀小說時, 可隱藏標題列
> 長按畫面可隱藏或顯示標題列

BUGS:
* 修正部份 FC 問題


Google Play: 小說閱讀器 v1.3.9

2013/08/07

小說閱讀器 v 1.3.8

v 1.3.8
* 優化部份記憶體的使用
* 卡提諾選單新增選項可跳至樓層(只限於此頁面的樓層)

BUGS:
* 修正在我的書籤頁面, 刪除書籤會 Fc 的問題
* 修正主頁面加入刪除書籤的問題
* 修正部份機型選單問題
* 修正在小說清單, 已經加入書籤的不會顯示星號的問題
* 再度試著解決部份資料庫問題(閱讀紀錄問題)


Google Play: 小說閱讀器 v1.3.8

2013/08/04

小說閱讀器 v 1.3.7

* 書籤新增排序功能, 可選擇排序
* 書籤新增標籤, 可自訂標籤

BUGS:
* 修正 TSDM 搜尋的問題
* 修正主畫面部份錯誤
* 修正鎖定旋轉功能失效的問題


Google Play: 小說閱讀器 v1.3.7

2013/08/02

小說閱讀器 v 1.3.6

v 1.3.6
* 新增是否開啟暫存, 預設開啟
* UI 部份調整
* 改變小說網站載入方式, 必須透過網路載入
* 新增小說網站
> 天使動漫 - 輕小說

BUGS:
* 修正在主頁面, 選轉時, 軟體封面會再顯示的問題.
* 修正在 2.3.x 版本, 部份選單錯誤的問題
* 試著修正有時無法跳至閱讀章節的問題


Google Play: 小說閱讀器 v1.3.6

2013/07/30

2013/07/29

java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. !!

環境: android-17

java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification.
Make sure the content of your adapter is not modified from a background thread,
but only from the UI thread. [in ListView(16908298, class android.widget.ListView)
with Adapter(class android.widget.HeaderViewListAdapter)]

反覆檢查了一下所有使用 ListView, 確定都是在 UI Thread 改動, 但是卻一樣發生上面問題. 查看 Listview source code.

} else if (mItemCount != mAdapter.getCount()) {
                throw new IllegalStateException("The content of the adapter has changed but "
                        + "ListView did not receive a notification. Make sure the content of "
                        + "your adapter is not modified from a background thread, but only "
                        + "from the UI thread. [in ListView(" + getId() + ", " + getClass() 
                        + ") with Adapter(" + mAdapter.getClass() + ")]");
            }

裡面判斷 mItemCount 是否等於 mAdapter.getCount(), 而 mItemCount 在以下兩個地方取得:
1. setAdapter 的時候
2. onMeasure 的時候, 也就是 UI 有變動的時候.

而我所使用的 Adapter 都是從 ArrayAdapter 來. 在 add object 時, 都會通知一下資料變動, 理論上, ListView 也會收到通知,
所以跟著 mItemCount 會跟著修改, 但實際上 .... 一樣出現上面錯誤 !!!!
public void add(T object) {
        synchronized (mLock) {
            if (mOriginalValues != null) {
                mOriginalValues.add(object);
            } else {
                mObjects.add(object);
            }
        }
        if (mNotifyOnChange) notifyDataSetChanged();
    }

Google 了半天, 最後我自己歸納以下結果, 當 setAdapter 後, 在大量新增 item 時, 有可能 ListView Upate 會跟不上 Adapter 的 Update.
所以當使用者捲動或者點擊時, 就有可能會出現這種狀況. (發生機率不高, 但從 Acra report, 我卻還滿常看到這 exception).

以下是我的解決方法, 到目前為止沒有在看到此 exception

import android.content.Context;
import android.widget.ArrayAdapter;

import java.util.List;

public class MyArrayAdapter extends ArrayAdapter {

    private List mObjects;
    private int count = 0;
    private boolean mNotifyOnChange = true;

    public MyArrayAdapter(Context context, int textViewResourceId, List objects) {
        super(context, textViewResourceId, objects);
        mObjects = objects;
        count = objects.size();
    }

    final public void beginTrans() {
        setNotifyOnChange(false);
        mNotifyOnChange = false;
    }


    final public void endTrans() {
        setNotifyOnChange(true);
        notifyDataSetChanged();
    }

    @Override
    final public int getCount() {
        return count;
    }

    @Override
    final public void notifyDataSetChanged() {
        count = mObjects.size();
        mNotifyOnChange = true;
        super.notifyDataSetChanged();
    }

    @Override
    final public T getItem(int position) {
        if (position >= getCount()) {
            return null;
        }
        if (position >= mObjects.size()) {
            return null;
        }
        return super.getItem(position);
    }

}


當要加入大量的 item 時, 則做以下動作.
1. call beginTrans
2. start to batch add items.
3. call endTrans

總算解決一個問題 :D

小說閱讀器 v 1.3.4

v 1.3.4
* 修正部份金沙中文網載入方式
> 原有金沙中文網站暫存會失效, 建議清除暫存

BUGS:
* 修正'起點vip'文章處理錯誤問題(顯示文章為 vip 文章)
> 本軟體不提供 vip 文章閱讀, 也不會提供 vip 文章下載.
* 修正部份起點文章暫存時的處理錯誤
* 修正圖檔文章開啟錯誤的問題
* 修正離線閱讀的部份問題
* 修正金沙中文網, 選擇簡體無法載入的問題


Google Play: 小說閱讀器 v1.3.4

2013/07/28

小說閱讀器 v 1.3.3

v 1.3.3
* 新增 起點中文網, 起點女生網 支援

BUGS:
* 修正載入小說清單的問題
* 修正部份 FC 問題
* 修正部份精品小說載入失敗問題
* 再度試著修正容易出現 FC 問題
* 再度修正在某些狀況載入小說集數錯誤的問題.


Google Play: 小說閱讀器 v1.3.3

2013/07/27

2013/07/26

論壇瀏覽器 v2.2.8

v 2.2.8 -
**BUGS:**
* 修正 JKforum 部份FC 問題

Google play store: v2.2.8

小說閱讀器 v 1.2.8

v 1.2.8
BUGS:
* 修正卡提諾開啟就會 FC 問題.


Google Play: 小說閱讀器 v1.2.8

小說閱讀器 v 1.2.7

v 1.2.7
* 閱讀畫面 UI 部份修改
1. 使用者可以左右切畫面話, 或者從選單跳至目錄頁面.
2. 如果此集小說有暫存或者有下載, 此集小說右上角會有提示符號.
3. 下載時, 正在下載目錄頁面會動態更新(右上角提示符號顯示代表以下載完畢)

* 小說最後一頁優先從網路下載, 如果沒有有效的網路, 則會從暫存抓取.
* txt 檔新增編碼選項, 請按選單選取文字編碼
> 預設使用 utf-8 編碼

BUGS:
* 修正搜尋畫面選單(用瀏覽器開啟)無效的問題
* 修正我的書櫃畫面無法跳至上層目錄問題
* 修正閱讀 txt 檔時, 改變文字大小必須跳出再進或者重新整理才會生效的問題
* 修正卡提諾登入進度視窗顯示錯誤的問題
* 修正部份開啟 txt 檔導致 FC 的問題


Google Play: 小說閱讀器 v1.2.7

2013/07/19

小說閱讀器 v 1.2.6

v 1.2.6
* 新增支援 txt 檔的閱讀
使用方式:
1. 先去設定裡面設定我的書櫃的位置(請勿指向小說閱讀下載的目錄.)
2. 主畫面開啟選單, 選擇我的書櫃, 就會列出你設定目錄下的檔案.
3. 在書櫃畫面, 向左滑動可關閉, 在閱讀畫面, 向左滑動可切換到書櫃畫面

BUGS:
* 修正平板在小說清單顯示, 右下角圖示顯示錯誤的問題
* 修正閱讀小說部份錯誤
* 修正閱讀小說時部份選單錯誤問題


Google Play: 小說閱讀器 v1.2.6

2013/07/17

Ask password when release using gradle

總算移轉到 Gradle 來, 但卻出現一個 release sign 的問題.
之前使用 ant 在 sign release 會跳出提示來問密碼, 但是 gradle 卻不知該怎麼做.
Google 一番, 找到以下連結.
assemblerelease-task-dependency-ask-for-keystore-password

但這卻有一個問題, 雖然會提示輸入密碼, 但是最後出來的 apk 一樣沒有 sign.

以下是我的解決方法:
task('readPasswordFromInput') << {
def console = System.console()

ext.keystorePassword = console.readLine('\n\n\n> Enter keystore password: ')

android.signingConfigs.release.storePassword = ext.keystorePassword
android.signingConfigs.release.keyPassword = ext.keystorePassword
}

tasks.whenTaskAdded { task ->
if (task.name.matches("validateReleaseSigning")) {
task.dependsOn('readPasswordFromInput')
}
}

另外在 build type release 那邊加上以下
    signingConfigs {
debug {
storeFile file("my-debug-key.keystore")
}

release {
storeFile file("my-release-key.keystore")
storePassword ""
keyAlias "release_key"
keyPassword ""
}
}

這樣當 release 時就可以輸入密碼也成功的 sign 了.

2013/07/16

小說閱讀器 v 1.2.4

愚蠢的錯誤, 2.3.x 版本資料庫處理又搞出問題

v 1.2.4

BUGS:
* 修正 2.3.x 版本資料庫處理錯誤問題

Google Play: 小說閱讀器 v1.2.4

2013/07/15

XGallery v1.09

v 1.0.9
* Add Basic authorization support
* Fix some bugs.

中文說明

Google Play: XGallery v1.0.9






v 1.0.9
* 支援 Http Basic 認證
* 修正部份錯誤

Implement ImageLoader with picasso

之前發表了一篇使用 volley 來當作 ImageLoader, 但是實際上我自己都是使用 Picasso,
至少作為基本的 Loader 而言, 我認為 Picasso 好用多了.

環境:
SDK: android-17
IDE: android-studio
Device: Moto Atrix with 4.2.2
External Libraries: picasso

本篇跟之前一樣, 使用簡單的 gridview 當作 main layout.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<GridView
android:id="@+id/gridview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="true"
android:alwaysDrawnWithCache="false"
android:fadeScrollbars="true"
android:cacheColorHint="@android:color/transparent"
android:numColumns="3"
android:columnWidth="160dp"/>

</RelativeLayout>

gridview row 的 layout 跟之前稍微有點不一樣.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<ImageView
android:id="@+id/imageview"
android:layout_width="160dp"
android:layout_height="240dp"
android:layout_centerInParent="true"
android:scaleType="centerInside"
android:contentDescription="@null"/>

</RelativeLayout>

這邊我並不使用 Picasso 內建的 loader, 而是根據自己的需求實作.
此範例中我只是很簡單的實作 Disk Cache 的機制.
MyURLConnectionLoader.java
package tw.clotai.picassoexample;

import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import android.util.Log;

import com.squareup.picasso.Loader;

import java.io.*;
import java.math.BigInteger;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
* A {@link com.squareup.picasso.Loader} which uses {@link java.net.HttpURLConnection} to chapter_main images. A disk cache of 10MB
* will automatically be installed in the application's cache directory, when available.
*/
public class MyURLConnectionLoader implements Loader {

private static final String HASH_ALGORITHM = "MD5";
private static final int RADIX = 10 + 26;

private final Context context;

public MyURLConnectionLoader(Context context) {
this.context = context.getApplicationContext();
}

protected HttpURLConnection openConnection(String path) throws IOException {
return (HttpURLConnection) new URL(path).openConnection();
}

@Override
public Response load(Uri uri, boolean b) throws IOException {
Response res = null;

String cacahePath = PicassoHelper.getCachePath(context);
if (cacahePath == null) {
return res;
}

String url = uri.toString();

if (url == null) {
return res;
}

String key = generateUniqueID(url);
if (key == null) {
return res;
}

if (!url.startsWith("http")) {
File f = new File(url);
if (f.exists()) {
FileInputStream fin = new FileInputStream(f);
res = new Response(fin, true);
}
return res;
}

File f = new File(cacahePath, key);
if (f.exists()) {
FileInputStream fin = new FileInputStream(f);
res = new Response(fin, true);

} else {
InputStream in = null;
try {
HttpURLConnection connection = openConnection(url);
connection.setRequestProperty("User-Agent",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.91 Safari/537.11");
connection.setRequestProperty("Accept-Language", "en-US,en;q=0.8");
connection.setUseCaches(true);
connection.setDoInput(true);
connection.setConnectTimeout(30000);
connection.setReadTimeout(30000);
connection.setRequestMethod("GET");
connection.connect();

in = connection.getInputStream();
copyToFile(in, f);
} finally {
if (in != null) {
in.close();
}
}

if (f.exists()) {
FileInputStream fin = new FileInputStream(f);
res = new Response(fin, false);
}
}
return res;
}



private String generateUniqueID(String url) {

StringBuilder sb = new StringBuilder();

byte[] md5;
BigInteger bi = null;

try {
MessageDigest digest = MessageDigest.getInstance(HASH_ALGORITHM);
digest.update(url.getBytes());
md5 = digest.digest();

bi = new BigInteger(md5).abs();

} catch (NoSuchAlgorithmException e) {
}

if (bi == null) {
return null;
}

sb.append(bi.toString(RADIX));
return sb.toString();
}

private void copyToFile(InputStream in, File dest) throws IOException {
FileOutputStream fos = null;
BufferedInputStream bin = null;
BufferedOutputStream bout = null;

try {
fos = new FileOutputStream(dest);
bin = new BufferedInputStream(in, 8192);
bout = new BufferedOutputStream(fos, 8192);

byte[] rdata = new byte[8192];
int count = 0;
while ((count = bin.read(rdata)) != -1) {
bout.write(rdata, 0, count);
}
bout.flush();

} finally {
if (bin != null) {
bin.close();
}
if (fos != null) {
if (fos.getFD() != null) {
fos.getFD().sync();
}
}

if (bout != null) {
bout.close();
}
if (fos != null) {
fos.close();
}
}
}


}

另外為了方便使用, 建立一個 singleton PicassoHelper.
以下為部份內容
public static PicassoHelper getInstance(Context c) {
if (helper == null) {
if (c == null) {
return null;
}
synchronized (PicassoHelper.class) {
if (helper == null) {
helper = new PicassoHelper(c);
}
}
}
return helper;
}

private PicassoHelper(Context c) {
mContext = c.getApplicationContext();

Picasso.Builder builder = new Picasso.Builder(c);
builder.loader(new MyURLConnectionLoader(c));

mPicasso = builder.build();
mPicasso.setDebugging(false);
PicassoHelper.getCachePath(mContext);
}

public void load(String url, ImageView v) {
v.setImageResource(R.drawable.ic_launcher);

if (url == null) {
return;
}

mPicasso.load(url)
.resize(160, 240)
.error(R.drawable.ic_launcher)
.centerCrop()
.into(v);
}

這樣大致上完成了.
同樣使用上次的範例, 執行結果如下:



原始碼下載:
PicassoExampleProject.zip

參考資料:
#1 Picasso v1.1.1