diff --git a/AndroidManifest.xml b/AndroidManifest.xml old mode 100644 new mode 100755 index 7cec83d8..c196a036 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -244,7 +244,7 @@ android:label="@string/phoneIconLabel" android:excludeFromRecents="true" android:launchMode="singleInstance" - android:screenOrientation="nosensor" + android:screenOrientation="sensor" android:configChanges="keyboardHidden" android:exported="false"> diff --git a/res/layout/incall_touch_ui.xml b/res/layout/incall_touch_ui.xml index 8dd8b611..0804ce97 100644 --- a/res/layout/incall_touch_ui.xml +++ b/res/layout/incall_touch_ui.xml @@ -204,15 +204,23 @@ don't have an icon in the downward direction so the whole bottom area of this widget is just wasted space. --> - + + + diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index af013e27..47ad41bd 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -168,8 +168,12 @@ "Upřednostňovaný režim sítě: pouze CDMA" "Upřednostňovaný režim sítě: pouze EvDo" "Upřednostňovaný režim sítě: LTE / CDMA" + Upřednostňovaný režim sítě: LTE / CDMA / EvDo + Upřednostňovaný režim sítě: LTE / GSM / WCDMA + Upřednostňovaný režim sítě: LTE / CMDA / EvDo / GSM / WCDMA + Upřednostňovaný režim sítě: LTE / WCDMA - "LTE/CDMA" + "Všechny" "Pouze EvDo" "CDMA bez EvDo" "CDMA/EvDo – automaticky" @@ -179,9 +183,16 @@ "GSM/WCDMA – upřednostňováno" + LTE/CMDA/EvDo/GSM/WCDMA + LTE/CDMA/EvDo "LTE/CDMA" - "CDMA" + "CDMA/EvDo - automaticky" + + LTE/WCDMA + LTE/GSM/WCDMA + GSM/WCDMA - upřednostňováno + "Dat. přenosy aktivovány" "Aktivovat datový přístup prostřednictvím mobilní sítě" "Datový roaming" @@ -622,4 +633,23 @@ "Vibrace při vyzvánění" "Tóny při dotyku číselníku" "Vyzvánění" + Vibrace telefonu + Nastavení vytáčení + Nastavení číselníku vytáčení + Návrat na předchozí aktivitu + Vrátit se k poslední prováděné aktivitě po ukončení hovoru (místo výpisu hovorů) + Zapnout rotaci obrazovky + Zapnout automatickou rotaci obrazovky (pokud je senzor aktivní) + Národní datový roaming + Připojit k datové síti během národního roamingu + Nepřipojovat k datové síti během národního roamingu + Rozšířené nastavení + Vibrace při odpovědi + Vibrace pokud druhá strana zvedne hovor + Vibrace každých 60 sekund + Při odchozím hovoru vibrovat každých 60 sekund + Vibrace po zavěšení + Vibrace po ukončení hovoru + Vibrace při dalším hovoru + Vibrace při čekajícím hovoru na lince diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index ac2441b0..d6067a12 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -628,4 +628,17 @@ "Vibrer ved opringning" "Tastaturtoner" "Ringetone" + Telefon vibration + + + Afslut til forrige aktivitet ved afsluttet opkald + Afslut til forrige aktivitet ved afsluttet opkald i stedet for at gå til opkaldslog + Aktiver Landskab + Aktiver Landskab Mode (hvis sensor er aktiveret) + + + Nummerblok indstillinger + Indstillinger for nummerblok + + diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 74e8596e..62f2dc9f 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -626,4 +626,8 @@ "Beim Klingeln vibrieren" "Wähltastentöne" "Klingelton" + + Lärmunterdrückung + Aktiviere Lärmunterdrückung für Anrufe + diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 261dba28..38c88613 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -330,6 +330,8 @@ "TTY-mód beállítása" "Automatikus újrapróbálkozás" "Automatikus újrapróbálkozás-mód bekapcsolása" + Kezdőképernyőre lépés hívás végén + Kilép a kezdőképernyőre hívás végén, nem megy az Előzményekre "Névjegy hozzáadása" "Névjegy szerkesztése" "Névjegy törlése" @@ -622,4 +624,11 @@ "Csengetéskor rezegjen" "Tárcsázó érintési hangjai" "Csengőhang" + Fekvőmód engedélyezése + Engedélyezi a fekvőmódot (ha a szenzor engedi) + + + Tárcsázó beállítás + Tárcsázó beállításai + Telefon rezgés diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index daf08442..b188220c 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -166,8 +166,13 @@ "優先ネットワークモード: CDMA" "優先ネットワークモード: CDMA/EV-DO" "優先ネットワークモード: CDMAのみ" - "優先ネットワークモード: EvDoのみ" + "優先ネットワークモード: EV-DOのみ" "優先ネットワークモード: LTE/CDMA" + "優先ネットワークモード: LTE/CDMA/EV-DO" + 優先ネットワークモード: LTE/GSM/WCDMA + 優先ネットワークモード: LTE/CMDA/EV-DO/GSM/WCDMA + 優先ネットワークモード: LTE/WCDMA + "LTE/CDMA" "EV-DOのみ" @@ -179,8 +184,11 @@ "GSM/WCDMAを優先" - "LTE/CDMA" - "CDMA" + + LTE/CMDA/EV-DO/GSM/WCDMA + LTE/CDMA/EV-DO + LTE/CDMA + CDMA/EV-DO自動 "データ通信を有効にする" "モバイルネットワーク経由のデータアクセスを有効にする" @@ -330,6 +338,11 @@ "TTYモードの設定" "自動再試行" "自動再試行モードを有効にする" + 通話終了後に元の画面に戻る + 通話終了後に通話履歴画面を表示せずに元の画面に戻る + 横画面を有効 + 横画面モードを有効にする (自動回転有効時) + "連絡先を追加" "連絡先を編集" "連絡先を削除" @@ -504,6 +517,8 @@ "セットアップ" "<未設定>" "その他の通話設定" + ダイヤルパッド設定 + @null "%sで発信中" "連絡先の写真" "個別通話に切り替え" @@ -619,7 +634,17 @@ "使用しない" "着信音" + 着信バイブレーション "着信時のバイブレーション" "ダイヤルパッドのタッチ操作音" "着信音" + 国内データローミング + 国内ローミング時にデータサービスに接続する + 国内ローミング時にデータサービスに接続しない + + + ノイズ抑制 + 通話ノイズを抑制する + + diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 7f014a83..583eaa79 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -1,625 +1,567 @@ - - - - - "Mobil Veriler" - "Telefon" - "Acil Durum Çeviricisi" - "Telefon" - "SAN listesi" - "Bilinmiyor" - "Özel numara" - "Ankesörlü telefon" - "Beklemede" - "Hat meşgul" - "Ağ meşgul" - "Yanıt yok, zaman aşımı oluştu" - "Sunucuya ulaşılamıyor" - "Numaraya ulaşılamıyor" - "Hatalı kullanıcı adı veya şifre" - "Çağrı, ağın dışından yapıldı" - "Sunucu hatası. Daha sonra tekrar deneyin." - "Sinyal yok" - "ACM sınırı aşıldı" - "Radyo kapalı" - "SIM kart yok veya SIM hatası" - "Hizmet alanı dışında" - "Giden çağrılar SAN tarafından kısıtlandı." - "Çağrı engelleme açıkken arama yapamazsınız" - "Tüm çağrılar erişim denetimi tarafından kısıtlandı." - "Acil durum çağrıları erişim denetimi tarafından kısıtlandı." - "Normal çağrılar erişim denetimi tarafından kısıtlanmış." - "Geçersiz numara" - "Konferans görüşmesi" - "Çağrı istemeden sonlandırıldı." - "Tamam" - "MMI kodu başlatıldı" - "USSD kodu çalışıyor…" - "MMI kodu iptal edildi" - "İptal" - "Konferans görüşmesini yönet" - "Hoparlör" - "Mobil cihaz kulaklığı" - "Kablolu kulaklık" - "Bluetooth" - "Şu zil sesleri gönderilsin mi?"\n - "Sayı tonları gönderiliyor"\n - "Gönder" - "Evet" - "Hayır" - "Joker karakteri şununla değiştir:" - "Eksik sesli mesaj numarası" - "SIM kartta depolanan sesli mesaj numarası yok." - "Numara ekle" - "SIM kartınızın engellemesi kaldırıldı. Telefonunuzun kilidi açılıyor..." - "SIM ağı kilit açma PIN kodu" - "Kilit Aç" - "Kapat" - "Ağ kilidini açma isteği yapılıyor..." - "Ağ kilidi açma isteği başarısız." - "Ağ kilidi açılamadı." - "GSM çağrı ayarları" - "CDMA çağrı ayarları" - "Erişim Noktası Adları" - "Ağ ayarları" - "Sesli mesaj" - "VM:" - "Ağ operatörleri" - "Çağrı ayarları" - "Ek ayarlar" - "Yalnızca GSM çağrısı ek ayarları" - "Ek CDMA çağrı ayarları" - "Yalnızca CDMA çağrısı ek ayarları" - "Ağ hizmeti ayarları" - "Arayan Kimliği" - "Ayarlar yükleniyor..." - "Giden çağrılarda numara gizli" - "Giden çağrılarda numara görüntüleniyor" - "Giden çağrılarda numaramı görüntülemek için varsayılan operatör ayarlarını kullan" - "Çağrı bekletme" - "Bir çağrı sırasında, gelen çağrıları bana bildir" - "Bir çağrı sırasında, gelen çağrıları bana bildir" - "Çağrı yönlendirme ayarları" - "Çağrı yönlendirme" - "Her zaman yönlendir" - "Daima bu numarayı kullan" - "Tüm çağrılar yönlendiriliyor" - "Tüm çağrılar şuraya yönlendiriliyor: {0}" - "Numara kullanılamıyor" - "Devre dışı" - "Meşgul olduğunda yönlendir" - "Meşgulken kullanılacak numara" - "Şuraya yönlendiriliyor: {0}" - "Devre dışı" - "Operatörünüz, telefonunuz meşgul olduğunda çağrı yönlendirmenin devre dışı bırakılmasını desteklemiyor." - "Yanıtlanmadığında yönlendir" - "Yanıtlanmadığında kullanılacak numara" - "Şuraya yönlendiriliyor: {0}" - "Devre dışı" - "Operatörünüz, telefonunuz yanıt vermediğinde çağrı yönlendirmenin devre dışı bırakılmasını desteklemiyor." - "Ulaşılamadığında yönlendir" - "Ulaşılamadığında kullanılacak numara" - "Şuraya yönlendiriliyor: {0}" - "Devre dışı" - "Operatörünüz, telefonunuza ulaşılamadığında çağrı yönlendirmenin devre dışı bırakılmasını desteklemiyor." - "Çağrı ayarları" - "Çağrı ayarları hatası" - "Ayarlar okunuyor..." - "Ayarlar güncelleniyor..." - "Ayarlar geri alınıyor..." - "Ağdan beklenmeyen yanıt." - "Ağ veya SIM kart hatası." - "Telefon uygulamanızın Sabit Arama Numaraları ayarı açık. Bu nedenle çağrıyla ilgili bazı özellikler çalışmıyor." - "Bu ayarları görüntülemeden önce radyoyu açın." - "Tamam" - "Etkinleştir" - "Devre Dışı Bırak" - "Güncelle" - - "Ağ varsayılanı" - "Numarayı gizle" - "Numarayı göster" - - "Sesli mesaj numarası değiştirildi." - "Sesli mesaj numarası değiştirilemedi."\n"Bu sorun devam ederse operatörünüzle bağlantı kurun." - "Yönlendirme numarası değiştirilemedi."\n"Bu sorun devam ederse operatörünüzle bağlantı kurun." - "Mevcut yönlendirme numarası ayarları alınıp kaydedilemedi."\n"Yine de yeni sağlayıcıya geçilsin mi?" - "Hiçbir değişiklik yapılmadı." - "Sesli mesaj hizmetini seç" - "Operatörüm" - "Mobil ağ ayarları" - "Kullanılabilir ağlar" - "Aranıyor..." - "Hiçbir ağ bulunamadı." - "Ağları ara" - "Ağlar aranırken hata oluştu." - "%s ağına kaydediliyor..." - "SIM kartınız bu ağa bağlanmaya izin vermiyor." - "Şu an bu ağa bağlanılamıyor. Daha sonra tekrar deneyin." - "Ağa kaydedildi." - "Bir ağ operatörü seçin" - "Kullanılabilen tüm ağları ara" - "Otomatik olarak seç" - "Tercih edilen ağı otomatik olarak seç" - "Otomatik kayıt..." - "Ağ Modu" - "Ağın çalışma modunu değiştir" - "Tercih edilen ağ modu" - "Tercih edilen ağ modu: WCDMA tercih edilir" - "Tercih edilen ağ modu: Yalnızca GSM" - "Tercih edilen ağ modu: Yalnızca WCDMA" - "Tercih edilen ağ modu: GSM / WCDMA" - "Tercih edilen ağ modu: CDMA" - "Tercih edilen ağ modu: CDMA / EvDo" - "Tercih edilen ağ modu: Yalnızca CDMA" - "Tercih edilen ağ modu: Yalnızca EvDo" - "Tercih edilen ağ modu: LTE / CDMA" - - "LTE/CDMA" - "Yalnızca EvDo" - "EvDo olmadan CDMA" - "CDMA/EvDo otomatik" - "GSM/WCDMA otomatik" - "Yalnızca WCDMA" - "Yalnızca GSM" - "GSM/WCDMA tercih edilen" - - - "LTE/CDMA" - "CDMA" - - "Veri etkin" - "Mobil ağ üzerinden veri erişimini etkinleştir" - "Veri dolaşımı" - "Dolaşırken veri hizmetlerine bağlan" - "Dolaşırken veri hizmetlerine bağlan" - "Veri dolaşımı kapalıyken ev ağınızdan ayrıldığınız için veri bağlantısını kaybettiniz." - "Veri dolaşımına izin verilsin mi? Kayda değer dolaşım ücretleri ödeyebilirsiniz!" - "GSM/UMTS Seçenekleri" - "CDMA Seçenekleri" - "Veri kullanımı" - "Geçerli dönemde kullanılan veri" - "Veri kullanım dönemi" - "Veri hızı politikası" - "Daha fazla bilgi edinin" - "%1$s%2$d) / %3$s dönem maksimumu"\n"Bir sonraki dönem %4$d gün sonra başlıyor (%5$s)" - "Maksimum dönem %1$s%2$d) / %3$s" - "Maksimum değer %1$s aşıldı"\n"Veri hızı %2$d Kb/s\'ye düşürüldü" - "Dönemin tamamlanan bölümü:٪ %1$d"\n"Bir sonraki dönem %2$d gün sonra başlıyor (%3$s)" - "Veri kullanım sınırı aşılırsa veri hızı %1$d Kb/s\'ye düşürülür" - "Operatörünüzün mobil ağ üzerinden veri kullanımı politikası hakkında daha fazla bilgi edinin" - "Hücre Yayını SMS\'i" - "Hücre Yayını SMS\'i" - "Hücre Yayını SMS\'si etkinleştirildi" - "Hücre Yayını SMS\'si devre dışı bırakıldı" - "Hücre Yayını SMS ayarları" - "Acil Durum Yayını" - "Acil Durum Yayını etkinleştirildi" - "Acil Durum Yayını devre dışı bırakıldı" - "İdari" - "İdari seçeneği etkinleştirildi" - "İdari seçeneği devre dışı bırakıldı" - "Bakım" - "Bakım etkinleştirildi" - "Bakım devre dışı bırakıldı" - "Genel Haberler" - "İşletme ve Finans Haberleri" - "Spor Haberleri" - "Eğlence Haberleri" - "Yerel" - "Yerel haberler etkinleştirildi" - "Yerel haberler devre dışı bırakıldı" - "Bölgesel" - "Bölgesel haberler etkinleştirildi" - "Bölgesel haberler devre dışı bırakıldı" - "Ulusal" - "Ulusal haberler etkinleştirildi" - "Ulusal haberler devre dışı bırakıldı" - "Uluslararası" - "Uluslararası haberler etkinleştirildi" - "Uluslararası haberler devre dışı bırakıldı" - "Dil" - "Haber dilini seçin" - - "İngilizce" - "Fransızca" - "İspanyolca" - "Japonca" - "Korece" - "Çince" - "İbranice" - - - "1" - "2" - "3" - "4" - "5" - "6" - "7" - - "Diller" - "Yerel Hava Durumu" - "Yerel Hava Durumu etkinleştirildi" - "Yerel Hava Durumu devre dışı bırakıldı" - "Bölge Trafik Raporları" - "Bölge Trafik Raporları etkinleştirildi" - "Bölge Trafik Raporları devre dışı bırakıldı" - "Yerel Havaalanı Uçuş Tarifeleri" - "Yerel Havaalanı Uçuş Tarifeleri etkinleştirildi" - "Yerel Havaalanı Uçuş Tarifeleri devre dışı bırakıldı" - "Restoranlar" - "Restoranlar etkinleştirildi" - "Restoranlar devre dışı bırakıldı" - "Konaklamalar" - "Konaklama etkinleştirildi" - "Konaklama devre dışı bırakıldı" - "Perakende Dizini" - "Perakende Dizini etkinleştirildi" - "Perakende Dizini devre dışı bırakıldı" - "Reklamlar" - "Reklamlar etkinleştirildi" - "Reklamlar devre dışı bırakıldı" - "Hisse Senetleri" - "Hisse Senetleri etkinleştirildi" - "Hisse Senetleri devre dışı bırakıldı" - "İş İmkanları" - "İş İmkanları etkinleştirildi" - "İş İmkanları devre dışı bırakıldı" - "Tıp, Sağlık ve Hastane" - "Tıp, Sağlık ve Hastane seçenekleri etkinleştirildi" - "Tıp, Sağlık ve Hastane seçeneği devre dışı bırakıldı" - "Teknoloji Haberleri" - "Teknoloji Haberleri etkinleştirildi" - "Teknoloji Haberleri devre dışı bırakıldı" - "Çoklu kategori" - "Çoklu kategori etkinleştirildi" - "Çoklu kategori devre dışı bırakıldı" - "Yalnızca 2G ağlarını kullan" - "Pil tasarrufu sağlar" - "Sistem seç" - "CDMA dolaşım modunu değiştir" - "Sistem seçin" - - "Yalnızca ev" - "Otomatik" - - "CDMA aboneliği" - "RUIM/SIM ve NV arasında değiştir" - "abonelik" - - "RUIM/SIM" - "NV" - - - "0" - "1" - - "Cihazı etkinleştir" - "Veri hizmetini ayarla" - "Sabit Arama Numaraları" - "SAN listesi" - "SAN etkinleştirme" - "Sabit Arama Numaraları etkin" - "Sabit Arama Numaraları devre dışı" - "SAN\'yi etkinleştir" - "SAN\'yi devre dışı bırak" - "PIN2 kodunu değiştir" - "SAN\'yi devre dışı bırak" - "SAN\'yi etkinleştir" - "Sabit Arama Numaralarını Yönet" - "SAN erişimi için PIN kodunu değiştir" - "Telefon numarası listesini yönet" - "Ses gizliliği" - "Gelişmiş gizlilik modunu etkinleştir" - "TTY modu" - "TTY modunu ayarla" - "Otomatik yeniden deneme" - "Otomatik Yeniden Deneme modunu etkinleştir" - "Kişi ekle" - "Kişiyi düzenle" - "Kişiyi sil" - "PIN2\'yi yazın" - "Ad" - "Numara" - "Kaydet" - "Sabit arama numarası ekle" - "Sabit arama numarası ekleniyor..." - "Sabit arama numarası eklendi." - "Sabit arama numarasını düzenle" - "Sabit arama numarası güncelleniyor..." - "Sabit arama numarası güncellendi." - "Sabit arama numarasını sil" - "Sabit arama numarası siliniyor..." - "Sabit arama numarası silindi." - "Yanlış PIN girdiğiniz için FDN güncellenmedi." - "Sayı 20 basamaktan uzun olamayacağından FDN güncellenmedi." - "FDN güncellenmedi. PIN2 doğru değildi veya telefon numarası reddedildi." - "SIM karttan okunuyor..." - "SIM kartınızda hiçbir kişi yok." - "İçe aktarılacak kişileri seçin" - "Kişileri SIM karttan içe aktarmak için, önce Uçak modunu kapatın." - "SIM PIN Kodunu Etkinleştir/Devre Dışı Bırak" - "SIM PIN Kodunu Değiştir" - "SIM PIN kodu:" - "Eski PIN" - "Yeni PIN" - "Yeni PIN kodunu doğrula" - "Yazdığınız eski PIN doğru değil. Tekrar deneyin." - "Yazdığınız PIN\'ler eşleşmiyor. Tekrar deneyin." - "4 ila 8 haneli bir PIN yazın." - "SIM PIN kodunu devre dışı bırak" - "SIM PIN Kodunu Etkinleştir" - "Lütfen bekleyin..." - "SIM PIN kodu etkin." - "SIM PIN kodu devre dışı." - "Yazdığınız PIN hatalı." - "SIM PIN kodu başarıyla değiştirildi." - "Şifre hatalı, SIM kilitlendi! PUK2 isteniyor." - "PIN2" - "Eski PIN2" - "Yeni PIN2" - "Yeni PIN2 kodunu doğrula" - "Yazdığınız PUK2 doğru değil. Tekrar deneyin." - "Yazdığınız eski PIN2 doğru değil. Tekrar deneyin." - "Yazdığınız PIN2 kodları eşleşmiyor. Tekrar deneyin." - "4 ila 8 haneli bir PIN2 kodu yazın." - "8 haneli bir PUK2 yazın." - "PIN2 başarıyla değiştirildi." - "PUK2 kodunu yazın" - "Şifre hatalı. PIN2 kodunu değiştirin ve tekrar deneyin." - "Şifre hatalı, SIM kilitlendi! PUK2 isteniyor." - "Bitti" - "Konferans görüşmesi %s" - "Sesli mesaj numarası" - "Çevriliyor" - "Tekrar deniyor" - "Konferans görüşmesi" - "Gelen çağrı" - "Çağrı sonlandırıldı" - "Beklemede" - "Sonlandırılıyor" - "Çağrı halinde" - "Numaram: %s" - "Çevriliyor" - "Cevapsız çağrı" - "Cevapsız çağrılar" - "%s cevapsız çağrı" - "Cevapsız çağrı: %s" - "Devam eden çağrılar" - "Beklemede" - "Gelen çağrı" - "Yeni sesli mesaj" - "Yeni sesli mesaj (%d)" - "Çevir: %s" - "Sesli mesaj numarası bilinmiyor" - "Hizmet yok" - "Seçili ağ (%s) kullanılamıyor" - "Kapat" - "Geri ara" - "Mesaj gönder" - "Bir çağrı yapmak için öncelikle Uçak modunu kapatın." - "Ağda kayıtlı değil." - "Mobil ağ kullanılamıyor." - "Çağrı gönderilmedi. Geçerli numara girilmedi." - "Çağrı gönderilmedi." - "MMI dizisi başlatılıyor..." - "Desteklenmeyen hizmet." - "Çağrılar arasında geçiş yapılamıyor." - "Çağrı ayrılamıyor." - "Çağrı aktarılamıyor." - "Çağrılar konferans görüşmesi olarak birleştirilemiyor." - "Çağrı reddedilemiyor." - "Çağrılar serbest bırakılamıyor." - "İnternet çağrısı" - "Acil durum çağrısı" - "Radyo açılıyor..." - "Hizmet alanı dışında, tekrar deneniyor..." - "Çağrı gönderilmedi, %s bir acil durum numarası değil!" - "Çağrı gönderilmedi. Bir acil durum numarası çevirin!" - "Çevirmek için klavyeyi kullan" - "Beklet" - "Sonlandır" - "Tuş takımı" - "Sesi Kapat" - "Çağrı ekle" - "Çağrıları birleştir" - "Değiştir" - "Aramaları yönet" - "Konferansı yönet" - "Ses" - "İçe aktar" - "Tümünü içe aktar" - "SIM kişileri içe aktarılıyor" - "Kişilerden içe aktar" - "İşitme cihazları" - "İşitme cihazı uyumluluğunu aç" - - "TTY Kapalı" - "TTY Tam" - "TTY HCO" - "TTY VCO" - - "DTMF tonları" - "DTMF seslerinin uzunluğunu ayarla" - - "Normal" - "Uzun" - - "Ağ mesajı" - "Telefonunuzu aktive edin" - "Telefon hizmetinizin aktive edilmesi için özel bir çağrı yapılması gerekiyor. "\n\n"“Aktive Et”e bastıktan sonra, telefonunuzun aktive edilmesi için sağlanan talimatları dinleyin." - "Etkinleştirme atlansın mı?" - "Etkinleştirmeyi atlarsanız, arama yapamaz veya mobil veri ağlarına bağlanamazsınız (yine de Kablosuz ağlara bağlanabilirsiniz). Telefonunuzu etkinleştirinceye kadar, telefonu her açışınızda ürünü etkinleştirip etkinleştirmeyeceğiniz sorulur." - "Atla" - "Etkinleştir" - "Telefon etkinleştirildi." - "Aktivasyon sorunu" - "Etkinleştirmenin tamamlandığını duyuncaya kadar söylenen talimatları izleyin." - "Hoparlör" - "Telefonunuz programlanırken lütfen bekleyin." - "Programlama başarısız" - "Telefonunuz şimdi aktive edildi. Hizmetin başlaması 15 dakika sürebilir." - "Telefonunuz etkinleştirilemedi. "\n"Daha iyi çeken bir yer (pencere kenarı veya dış mekan) bulmanız gerekebilir. "\n\n"Tekrar deneyin veya daha fazla seçenek için müşteri hizmetlerini arayın." - "AŞIRI SPC HATASI" - "Geri" - "Tekrar dene" - "İleri" - "EcmExitDialog" - "Acil Geri Arama Moduna Girildi" - "Acil Geri Arama Modu" - "Veri bağlantısı devre dışı bırakıldı" - - "%s dakika boyunca veri bağlantısı yok" - "%s dakika boyunca veri bağlantısı yok" - - - "Telefon %s dakika boyunca Acil Geri Arama modunda olacaktır. Bu moddayken, veri bağlantısı kullanan uygulamalar kullanılamaz. Şimdi çıkmak istiyor musunuz?" - "Telefon %s dakika boyunca Acil Geri Arama modunda olacaktır. Bu moddayken, veri bağlantısı kullanan uygulamalar kullanılamaz. Şimdi çıkmak istiyor musunuz?" - - - "Seçilen işlem Acil Geri Arama modunda kullanılamaz. Telefon %s dakika boyunca bu modda kalacak. Şimdi çıkmak istiyor musunuz?" - "Seçilen işlem Acil Geri Arama modunda kullanılamaz. Telefon %s dakika boyunca bu modda kalacak. Şimdi çıkmak istiyor musunuz?" - - "Seçilen işlem, acil durum çağrısında kullanılamaz." - "Acil Geri Arama Modundan çıkılıyor" - "Evet" - "Hayır" - "Kapat" - "Hizmet" - "Kurulum" - "<Ayarlanmadı>" - "Diğer çağrı ayarları" - "%s üzerinden çağrı yapılıyor" - "kişi fotoğrafı" - "özele git" - "kişi seçin" - "İnternet üzerinden çağrı ayarları" - "İnternet çağrısı (SIP) hesapları" - "Hesaplar" - "Gelen çağrıları al" - "Pil ömrünü kısaltır" - "İnternet çağrısını kullan" - "İnternet çağrısı kullan (yalnızca kablosuz)" - "Veri ağı uygun durumdayken yapılan tüm çağrılar için" - "Yalnızca İnternet numaraları için" - "Her çağrı için sor" - "Tüm çağrılar için" - "Çağrı yap" - "İnternet çağrısı hesabını kullan:" - "Her zaman İnternet çağrıları yapmak için kullan" - "Varsayılan olarak hangi İnternet çağrısı hesabının kullanılacağını Telefon > Ayarlar > İnternet çağrısı ayarları > Hesaplar ekranını kullanarak değiştirebilirsiniz." - "Cep telefonu çağrısı" - "İnternet çağrısı" - "İnternet çağrısı hesabı yok" - "Bu telefonda hiç İnternet çağrısı hesabı yok. Şimdi eklemek ister misiniz?" - "Ekle" - "Hesap ekle" - "Hesabı kaldır" - "SIP hesapları" - "Hesap kaydediliyor..." - "Hesap kaldırılıyor..." - "Kaydet" - "Sil" - "Profili kapat" - "Tamam" - "Kapat" - "Birincil hesap. %s" - "Durum denetleniyor..." - "Kayıt olunuyor..." - "Denemeye devam ediliyor..." - "Çağrıları almıyor." - "İnternet bağlantısı olmadığı için hesap kaydı durduruldu." - "Kablosuz bağlantı olmadığından hesap kayıt işlemi durduruldu." - "Hesap kaydı başarısız oldu." - "Çağrıları alıyor." - "Hesap kaydı başarısız oldu: (%s); daha sonra tekrar denenecek" - "Hesap kaydı başarısız oldu: Yanlış kullanıcı adı veya şifre." - "Hesap kaydı başarısız oldu: Sunucu adını kontrol edin." - "Bu hesap şu anda %s uygulaması tarafından kullanılıyor." - "SIP hesabı ayrıntıları" - "SIP hesabı ayrıntıları" - "Sunucu" - "Kullanıcı adı" - "Şifre" - "Görüntülenen ad" - "Giden proxy adresi" - "Bağlantı noktası numarası" - "Aktarım türü" - "Canlı tutma mesajı gönder" - "Birincil hesap olarak ayarla" - "Giden çağrılar için kullanılır" - "İsteğe bağlı ayarlar" - "Kimlik doğrulama kullanıcı adı" - "Kimlik doğrulama için kullanılan kullanıcı adı" - "<Ayarlanmadı>" - "<Kullanıcı adıyla aynı>" - "<İsteğe bağlı>" - "▷ Tümünü göstermek için dokunun" - "▽ Tümünü gizlemek için dokunun" - "%s gerekli, bu alan boş bırakılamaz." - "Bağlantı noktası numarası 1000 ile 65534 arasında olmalıdır." - "İnternet bağlantısı yok" - "Kablosuz bağlantı yok" - "İnternet çağrısı yapmak için öncelikle İnternet bağlantınızı denetleyin." - "İnternet çağrıları için bir Kablosuz ağa bağlı olmalısınız (Kablosuz ve Ağ ayarlarını kullanın)." - "İnternet çağrısı desteklenmiyor" - "Otomatik" - "Her zaman gönder" - "Sesli arama desteklenmiyor" - "Şimdi konuşamam. Ne oldu?" - "Seni hemen geri arayacağım." - "Seni daha sonra ararım." - "Şimdi konuşamam. Daha sonra arar mısın?" - "Özel mesaj" - "Hızlı yanıtlar" - "Hızlı yanıtları düzenle" - - "Hızlı yanıt" - "Mesaj, %s numaralı telefona gönderildi." - "bir" - "iki" - "üç" - "dört" - "beş" - "altı" - "yedi" - "sekiz" - "dokuz" - "yıldız" - "sıfır" - "kare" - "çevir" - "geri tuşu" - "Hoparlör etkin." - "Çağrı sesi kapatıldı." - "Yanıtla" - "SMS gönder" - "Reddet" - "Titreşim" - "Titreşim" - "Zil sesi" - - "Her zaman" - "Yalnızca sessizken" - "Hiçbir zaman" - - "Telefon zil sesi" - "Çalarken titret" - "Tuşlara basınca ses çıksın" - "Zil sesi" +Tekrar deneyin veya daha fazla seçenek için müşteri hizmetlerini arayın." + AŞIRI SPC HATASI + Geri + Tekrar dene + İleri + EcmExitDialog + Acil Geri Arama Moduna Girildi + Acil Geri Arama Modu + Veri bağlantısı devre dışı bırakıldı + Seçilen işlem, acil durum çağrısında kullanılamaz. + Acil Geri Arama Modundan çıkılıyor + Evet + Hayır + Kapat + Hizmet + Kurulum + <Ayarlanmadı> + Diğer çağrı ayarları + Arama tuşu ayarları + Arama tuşları için ayarlar + %s üzerinden çağrı yapılıyor + kişi fotoğrafı + özele git + kişi seçin + İnternet üzerinden çağrı ayarları + İnternet çağrısı (SIP) hesapları + Hesaplar + Gelen çağrıları al + Pil ömrünü kısaltır + İnternet çağrısını kullan + İnternet çağrısı kullan (yalnızca kablosuz) + Veri ağı uygun durumdayken yapılan tüm çağrılar için + Yalnızca İnternet numaraları için + Her çağrı için sor + Tüm çağrılar için + Çağrı yap + İnternet çağrısı hesabını kullan: + Her zaman İnternet çağrıları yapmak için kullan + Varsayılan olarak hangi İnternet çağrısı hesabının kullanılacağını Telefon > Ayarlar > İnternet çağrısı ayarları > Hesaplar ekranını kullanarak değiştirebilirsiniz. + Cep telefonu çağrısı + İnternet çağrısı + İnternet çağrısı hesabı yok + Bu telefonda hiç İnternet çağrısı hesabı yok. Şimdi eklemek ister misiniz? + Ekle + Hesap ekle + Hesabı kaldır + SIP hesapları + Hesap kaydediliyor... + Hesap kaldırılıyor... + Kaydet + Sil + Profili kapat + Tamam + Kapat + Birincil hesap. %s + Durum denetleniyor... + Kayıt olunuyor... + Denemeye devam ediliyor... + Çağrıları almıyor. + İnternet bağlantısı olmadığı için hesap kaydı durduruldu. + Kablosuz bağlantı olmadığından hesap kayıt işlemi durduruldu. + Hesap kaydı başarısız oldu. + Çağrıları alıyor. + Hesap kaydı başarısız oldu: (%s); daha sonra tekrar denenecek + Hesap kaydı başarısız oldu: Yanlış kullanıcı adı veya şifre. + Hesap kaydı başarısız oldu: Sunucu adını kontrol edin. + Bu hesap şu anda %s uygulaması tarafından kullanılıyor. + SIP hesabı ayrıntıları + SIP hesabı ayrıntıları + Sunucu + Kullanıcı adı + Şifre + Görüntülenen ad + Giden proxy adresi + Bağlantı noktası numarası + Aktarım türü + Canlı tutma mesajı gönder + Birincil hesap olarak ayarla + Giden çağrılar için kullanılır + İsteğe bağlı ayarlar + Kimlik doğrulama kullanıcı adı + Kimlik doğrulama için kullanılan kullanıcı adı + <Ayarlanmadı> + <Kullanıcı adıyla aynı> + <İsteğe bağlı> + ▷ Tümünü göstermek için dokunun + ▽ Tümünü gizlemek için dokunun + %s gerekli, bu alan boş bırakılamaz. + Bağlantı noktası numarası 1000 ile 65534 arasında olmalıdır. + İnternet bağlantısı yok + Kablosuz bağlantı yok + İnternet çağrısı yapmak için öncelikle İnternet bağlantınızı denetleyin. + İnternet çağrıları için bir Kablosuz ağa bağlı olmalısınız (Kablosuz ve Ağ ayarlarını kullanın). + İnternet çağrısı desteklenmiyor + Otomatik + Her zaman gönder + Sesli arama desteklenmiyor + Şimdi konuşamam. Ne oldu? + Seni hemen geri arayacağım. + Seni daha sonra ararım. + Şimdi konuşamam. Daha sonra arar mısın? + Özel mesaj + Hızlı yanıtlar + Hızlı yanıtları düzenle + + Hızlı yanıt + Mesaj, %s numaralı telefona gönderildi. + bir + iki + üç + dört + beş + altı + yedi + sekiz + dokuz + yıldız + sıfır + kare + çevir + geri tuşu + Hoparlör etkin. + Çağrı sesi kapatıldı. + Yanıtla + SMS gönder + Reddet + Titreşim + Titreşim + Zil sesi + asla + Telefon zil sesi + Telefon titreşimi + Çalarken titret + Tuşlara basınca ses çıksın + Zil sesi + Veri dolaşımı + Dolaşım esnasında veri hizmetine bağlan + Dolaşım esnasında veri hizmetine bağlanma + Gelişmiş Ayarlar + Cevaplandığında Titret + Giden arama yanıtlandığında titrer + Her 60 saniyede bir Titret + Yapılan görüşmeler sırasında dakikayı belirtmek için her 60 saniyede bir titrer + Kapandığında Titret + Görüşme sonlandığında titrer + Bekleyen çağrıda Titret + Bekleyen arama olduğunda titrer + Gürültü önleyici + Aramalar için gürültü önleyiciyi etkinleştirir diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 1d3aafa6..fc4e7c59 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -168,6 +168,10 @@ "首选网络模式:仅限 CDMA" "首选网络模式:仅限 EvDo" "首选网络模式:LTE/CDMA" + "首选网络模式:LTE / CDMA / EvDo" + "首选网络模式:LTE / GSM/WCDMA" + "首选网络模式:LTE / CMDA / EvDo / GSM/WCDMA" + "首选网络模式:LTE / WCDMA" "LTE/CDMA" "仅 EvDo" @@ -179,8 +183,15 @@ "首选 GSM/WCDMA" + LTE/CMDA/EvDo/GSM/WCDMA + LTE/CDMA/EvDo "LTE/CDMA" "CDMA" + + + LTE/WCDMA + LTE/GSM/WCDMA + "首选 GSM/WCDMA" "启用数据网络" "允许通过移动网络存取数据" @@ -330,6 +341,10 @@ "设置 TTY 模式" "自动重拨" "启用自动重拨模式" + 通话结束后返回主屏幕 + 通话结束后返回主屏幕而不是返回通话记录 + 启用旋转 + 允许通话界面旋转(如果传感器启用) "添加联系人" "编辑联系人" "删除联系人" @@ -504,6 +519,8 @@ "设置" "<未设置>" "其他通话设置" + 拨号器设置 + 是否开启传感器,是否开启T9搜索 "通过%s进行通话" "联系人照片" "私聊" @@ -619,7 +636,11 @@ "永不" "手机铃声" + 振动效果 "响铃时振动" "拨号键盘触摸音效" "铃声" + 全国漫游 + 当全国漫游时允许连接移动数据网络 + 当全国漫游时禁止连接移动数据网络 diff --git a/res/values/config.xml b/res/values/config.xml index eb9de4c3..0fa506c2 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -91,6 +91,9 @@ false + + noise_suppression=on=off + false + + + -1 diff --git a/res/values/strings.xml b/res/values/strings.xml index a051173b..8c91df82 100755 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -364,9 +364,17 @@ Preferred network mode: EvDo only Preferred network mode: LTE / CDMA + + Preferred network mode: LTE / CDMA / EvDo + + Preferred network mode: LTE / GSM/WCDMA + + Preferred network mode: LTE / CMDA / EvDo / GSM/WCDMA + + Preferred network mode: LTE / WCDMA - LTE/CDMA + Global EvDo only CDMA w/o EvDo CDMA/EvDo auto @@ -387,13 +395,30 @@ + + LTE/CMDA/EvDo/GSM/WCDMA + LTE/CDMA/EvDo LTE/CDMA - CDMA + CDMA/EvDo auto + + "10" + "8" "7" "4" + + + LTE/WCDMA + LTE/GSM/WCDMA + GSM/WCDMA preferred + + + "12" + "9" + "0" + Data enabled @@ -627,6 +652,10 @@ Set TTY mode Auto-retry Enable Auto-retry mode + Exit to Last Activity on End Call + Exit to Previous activity screen on End Call rather than going to Call Log + Enable Landscape + Enable Landscape Mode (if sensor enabled) Add contact @@ -1061,6 +1090,10 @@ Other call settings + + Dialpad settings + Settings for the dialpad + Calling via %s @@ -1447,6 +1480,7 @@ Phone ringtone + Phone vibration Ringtone + + + + + National data roaming + + Connect to data services when nationally roaming + + Connect to data services when nationally roaming + + + + + Advanced Settings + Vibrate on answer + Vibrate when an outgoing call is answered + Vibrate every 60 seconds + Vibrates at the 60 second mark of every minute during outgoing calls + Vibrate on hangup + Vibrate when a call has ended + Vibrate call waiting + Vibrate on call waiting + + + Noise suppression + Enable noise suppression for calls + diff --git a/res/xml/call_feature_setting.xml b/res/xml/call_feature_setting.xml old mode 100644 new mode 100755 index 780fdee9..3b2dd158 --- a/res/xml/call_feature_setting.xml +++ b/res/xml/call_feature_setting.xml @@ -34,8 +34,41 @@ android:title="@string/vibrate_on_ring_title" android:persistent="false" android:defaultValue="false" /> + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/xml/gsm_umts_options.xml b/res/xml/gsm_umts_options.xml index afdd0d30..fd0b676d 100644 --- a/res/xml/gsm_umts_options.xml +++ b/res/xml/gsm_umts_options.xml @@ -24,7 +24,7 @@ + android:targetClass="com.android.settings.Settings$ApnSettingsActivity" /> diff --git a/res/xml/network_setting.xml b/res/xml/network_setting.xml index b24b82cc..f88b459e 100644 --- a/res/xml/network_setting.xml +++ b/res/xml/network_setting.xml @@ -35,6 +35,13 @@ android:summaryOn="@string/roaming_enable" android:summaryOff="@string/roaming_disable"/> + + callInfoLp.bottomMargin: " + reservedVerticalSpace); mCallInfoContainer.setLayoutParams(callInfoLp); diff --git a/src/com/android/phone/CallController.java b/src/com/android/phone/CallController.java index e33e4428..0d295a29 100644 --- a/src/com/android/phone/CallController.java +++ b/src/com/android/phone/CallController.java @@ -306,6 +306,9 @@ public void placeCall(Intent intent) { // and if so simply call updateInCallScreen() instead. mApp.displayCallScreen(); + + // enable noise suppression + PhoneUtils.turnOnNoiseSuppression(mApp.getApplicationContext(), true); } /** diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java old mode 100644 new mode 100755 index ee1233d5..a010f3a7 --- a/src/com/android/phone/CallFeaturesSetting.java +++ b/src/com/android/phone/CallFeaturesSetting.java @@ -20,7 +20,10 @@ import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; +import android.app.DialogFragment; import android.app.ProgressDialog; +import android.app.VibrationPickerDialog; +import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; @@ -33,6 +36,7 @@ import android.database.sqlite.SQLiteException; import android.media.AudioManager; import android.media.RingtoneManager; +import android.media.VibrationPattern; import android.net.Uri; import android.net.sip.SipManager; import android.os.AsyncResult; @@ -65,6 +69,7 @@ import com.android.internal.telephony.cdma.TtyIntent; import com.android.phone.sip.SipSharedPreferences; +import java.net.URI; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -166,11 +171,14 @@ public class CallFeaturesSetting extends PreferenceActivity private static final String BUTTON_RINGTONE_KEY = "button_ringtone_key"; private static final String BUTTON_VIBRATE_ON_RING = "button_vibrate_on_ring"; + private static final String BUTTON_VIBRATION_KEY = + "button_vibration_key"; private static final String BUTTON_PLAY_DTMF_TONE = "button_play_dtmf_tone"; private static final String BUTTON_DTMF_KEY = "button_dtmf_settings"; private static final String BUTTON_RETRY_KEY = "button_auto_retry_key"; private static final String BUTTON_TTY_KEY = "button_tty_mode_key"; private static final String BUTTON_HAC_KEY = "button_hac_key"; + private static final String BUTTON_NOISE_SUPPRESSION_KEY = "button_noise_suppression_key"; private static final String BUTTON_GSM_UMTS_OPTIONS = "button_gsm_more_expand_key"; private static final String BUTTON_CDMA_OPTIONS = "button_cdma_more_expand_key"; @@ -192,6 +200,8 @@ public class CallFeaturesSetting extends PreferenceActivity private static final int EVENT_FORWARDING_GET_COMPLETED = 502; private static final int MSG_UPDATE_RINGTONE_SUMMARY = 1; + private static final int VIB_OK = 10; + private static final int VIB_CANCEL = 11; // preferred TTY mode // Phone.TTY_MODE_xxx @@ -243,14 +253,27 @@ public class CallFeaturesSetting extends PreferenceActivity @Override public void handleMessage(Message msg) { switch (msg.what) { - case MSG_UPDATE_RINGTONE_SUMMARY: - mRingtonePreference.setSummary((CharSequence) msg.obj); - break; + case MSG_UPDATE_RINGTONE_SUMMARY: + mRingtonePreference.setSummary((CharSequence) msg.obj); + break; + case VIB_OK: + VibrationPattern mPattern = (VibrationPattern) msg.obj; + if (mPattern == null) { + break; + } + mVibrationPreference.setSummary(mPattern.getName()); + Settings.System.putString(getContentResolver(), + Settings.System.PHONE_VIBRATION, mPattern.getUri().toString()); + break; + case VIB_CANCEL: + default: + break; } } }; private Preference mRingtonePreference; + private Preference mVibrationPreference; private CheckBoxPreference mVibrateWhenRinging; /** Whether dialpad plays DTMF tone or not. */ private CheckBoxPreference mPlayDtmfTone; @@ -258,6 +281,7 @@ public void handleMessage(Message msg) { private CheckBoxPreference mButtonHAC; private ListPreference mButtonDTMF; private ListPreference mButtonTTY; + private CheckBoxPreference mButtonNoiseSuppression; private ListPreference mButtonSipCallOptions; private ListPreference mVoicemailProviders; private PreferenceScreen mVoicemailSettings; @@ -474,6 +498,12 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen return true; } else if (preference == mButtonTTY) { return true; + } else if (preference == mButtonNoiseSuppression) { + int nsp = mButtonNoiseSuppression.isChecked() ? 1 : 0; + // Update Noise suppression value in Settings database + Settings.System.putInt(mPhone.getContext().getContentResolver(), + Settings.System.NOISE_SUPPRESSION, nsp); + return true; } else if (preference == mButtonAutoRetry) { android.provider.Settings.Global.putInt(mPhone.getContext().getContentResolver(), android.provider.Settings.Global.CALL_AUTO_RETRY, @@ -513,6 +543,12 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen // This should let the preference use default behavior in the xml. return false; } + } else if (preference == mVibrationPreference) { + String uriString = VibrationPattern.getPhoneVibration(getApplicationContext()); + DialogFragment newFragment = VibrationPickerDialog.newInstance(mRingtoneLookupComplete, false, + uriString); + newFragment.show(getFragmentManager(), "dialog"); + return true; } return false; } @@ -1499,12 +1535,14 @@ protected void onCreate(Bundle icicle) { } mRingtonePreference = findPreference(BUTTON_RINGTONE_KEY); + mVibrationPreference = findPreference(BUTTON_VIBRATION_KEY); mVibrateWhenRinging = (CheckBoxPreference) findPreference(BUTTON_VIBRATE_ON_RING); mPlayDtmfTone = (CheckBoxPreference) findPreference(BUTTON_PLAY_DTMF_TONE); mButtonDTMF = (ListPreference) findPreference(BUTTON_DTMF_KEY); mButtonAutoRetry = (CheckBoxPreference) findPreference(BUTTON_RETRY_KEY); mButtonHAC = (CheckBoxPreference) findPreference(BUTTON_HAC_KEY); mButtonTTY = (ListPreference) findPreference(BUTTON_TTY_KEY); + mButtonNoiseSuppression = (CheckBoxPreference) findPreference(BUTTON_NOISE_SUPPRESSION_KEY); mVoicemailProviders = (ListPreference) findPreference(BUTTON_VOICEMAIL_PROVIDER_KEY); if (mVoicemailProviders != null) { mVoicemailProviders.setOnPreferenceChangeListener(this); @@ -1568,6 +1606,15 @@ protected void onCreate(Bundle icicle) { } } + if (mButtonNoiseSuppression != null) { + if (getResources().getBoolean(R.bool.has_in_call_noise_suppression)) { + mButtonNoiseSuppression.setOnPreferenceChangeListener(this); + } else { + prefSet.removePreference(mButtonNoiseSuppression); + mButtonNoiseSuppression = null; + } + } + if (!getResources().getBoolean(R.bool.world_phone)) { Preference options = prefSet.findPreference(BUTTON_CDMA_OPTIONS); if (options != null) @@ -1615,6 +1662,7 @@ protected void onCreate(Bundle icicle) { } } } + lookupVibrationName(); updateVoiceNumberField(); mVMProviderSettingsForced = false; createSipCallSettings(); @@ -1745,6 +1793,7 @@ protected void onResume() { } lookupRingtoneName(); + lookupVibrationName(); } /** @@ -1769,6 +1818,11 @@ private void lookupRingtoneName() { new Thread(mRingtoneLookupRunnable).start(); } + private void lookupVibrationName() { + String uriString = VibrationPattern.getPhoneVibration(getApplicationContext()); + mVibrationPreference.setSummary(new VibrationPattern(Uri.parse(uriString), getApplicationContext()).getName()); + } + private boolean isAirplaneModeOn() { return Settings.System.getInt(getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0; diff --git a/src/com/android/phone/CallNotifier.java b/src/com/android/phone/CallNotifier.java index 99636dfc..3480ba4f 100755 --- a/src/com/android/phone/CallNotifier.java +++ b/src/com/android/phone/CallNotifier.java @@ -34,9 +34,11 @@ import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothHeadset; import android.bluetooth.BluetoothProfile; +import android.content.ContentResolver; import android.content.Context; import android.media.AudioManager; import android.media.ToneGenerator; +import android.media.VibrationPattern; import android.net.Uri; import android.os.AsyncResult; import android.os.Handler; @@ -449,6 +451,9 @@ private void onNewRingingConnection(AsyncResult r) { if (PhoneUtils.isRealIncomingCall(state)) { startIncomingCallQuery(c); } else { + if (PhoneUtils.PhoneSettings.vibCallWaiting(mApplication)) { + mApplication.vibrate(200,300,500); + } if (VDBG) log("- starting call waiting tone..."); if (mCallWaitingTonePlayer == null) { mCallWaitingTonePlayer = new InCallTonePlayer(InCallTonePlayer.TONE_CALL_WAITING); @@ -567,6 +572,8 @@ private void startIncomingCallQuery(Connection c) { if (shouldStartQuery) { // Reset the ringtone to the default first. mRinger.setCustomRingtoneUri(Settings.System.DEFAULT_RINGTONE_URI); + String vibUriString = VibrationPattern.getPhoneVibration(mApplication); + mRinger.setCustomVibrationUri(Uri.parse(vibUriString)); // query the callerinfo to try to get the ringer. PhoneUtils.CallerInfoToken cit = PhoneUtils.startGetCallerInfo( @@ -771,6 +778,26 @@ private void onPhoneStateChanged(AsyncResult r) { } if (VDBG) log("onPhoneStateChanged: OFF HOOK"); + + Call call = PhoneUtils.getCurrentCall(fgPhone); + Connection c = PhoneUtils.getConnection(fgPhone, call); + if (VDBG) PhoneUtils.dumpCallState(fgPhone); + Call.State cstate = call.getState(); + + if (cstate == Call.State.ACTIVE && !c.isIncoming()) { + long callDurationMsec = c.getDurationMillis(); + if (VDBG) Log.v(LOG_TAG, "duration is " + callDurationMsec); + boolean vibOut = PhoneUtils.PhoneSettings.vibOutgoing(mApplication); + if (vibOut && callDurationMsec < 200) { + mApplication.vibrate(100,0,0); + } + boolean vib60 = PhoneUtils.PhoneSettings.vibOn60Secs(mApplication); + if (vib60) { + callDurationMsec = callDurationMsec % 60000; + mApplication.start60SecondVibration(callDurationMsec); + } + } + // make sure audio is in in-call mode now PhoneUtils.setAudioMode(mCM); @@ -947,6 +974,13 @@ public void onQueryComplete(int token, Object cookie, CallerInfo ci) { Ringer r = ((CallNotifier) cookie).mRinger; r.setCustomRingtoneUri(ci.contactRingtoneUri); } + + // set the vibration uri to prepare for the ring. + if (ci.contactVibrationUri != null) { + if (DBG) log("custom vibration found, setting up ringer."); + Ringer r = ((CallNotifier) cookie).mRinger; + r.setCustomVibrationUri(ci.contactVibrationUri); + } // ring, and other post-ring actions. onCustomRingQueryComplete(); } @@ -1028,6 +1062,14 @@ private void onDisconnect(AsyncResult r) { removeMessages(CALLWAITING_ADDCALL_DISABLE_TIMEOUT); } + if (c != null) { + boolean vibHangup = PhoneUtils.PhoneSettings.vibHangup(mApplication); + if (vibHangup && c.getDurationMillis() > 0) { + mApplication.vibrate(50, 100, 50); + } + mApplication.stopVibrationThread(); + } + // Stop the ringer if it was ringing (for an incoming call that // either disconnected by itself, or was rejected by the user.) // @@ -1111,6 +1153,9 @@ private void onDisconnect(AsyncResult r) { } } + // disable noise suppression + PhoneUtils.turnOnNoiseSuppression(mApplication.getApplicationContext(), false); + // If we don't need to play BUSY or CONGESTION, then play the // "call ended" tone if this was a "regular disconnect" (i.e. a // normal call where one end or the other hung up) *and* this diff --git a/src/com/android/phone/CallerInfoCache.java b/src/com/android/phone/CallerInfoCache.java index 76f79aff..a47e4610 100644 --- a/src/com/android/phone/CallerInfoCache.java +++ b/src/com/android/phone/CallerInfoCache.java @@ -65,29 +65,35 @@ public class CallerInfoCache { Data.DATA1, // 0 Phone.NORMALIZED_NUMBER, // 1 Data.CUSTOM_RINGTONE, // 2 - Data.SEND_TO_VOICEMAIL // 3 + Data.SEND_TO_VOICEMAIL, // 3 + Data.CUSTOM_VIBRATION // 4 }; private static final int INDEX_NUMBER = 0; private static final int INDEX_NORMALIZED_NUMBER = 1; private static final int INDEX_CUSTOM_RINGTONE = 2; private static final int INDEX_SEND_TO_VOICEMAIL = 3; + private static final int INDEX_CUSTOM_VIBRATION = 4; private static final String SELECTION = "(" - + "(" + Data.CUSTOM_RINGTONE + " IS NOT NULL OR " + Data.SEND_TO_VOICEMAIL + "=1)" + + "(" + Data.CUSTOM_RINGTONE + " IS NOT NULL OR " + + Data.CUSTOM_VIBRATION + " IS NOT NULL OR " + + Data.SEND_TO_VOICEMAIL + "=1)" + " AND " + Data.DATA1 + " IS NOT NULL)"; public static class CacheEntry { public final String customRingtone; + public final String customVibration; public final boolean sendToVoicemail; - public CacheEntry(String customRingtone, boolean shouldSendToVoicemail) { + public CacheEntry(String customRingtone, boolean shouldSendToVoicemail, String customVibration) { this.customRingtone = customRingtone; + this.customVibration = customVibration; this.sendToVoicemail = shouldSendToVoicemail; } @Override public String toString() { - return "ringtone: " + customRingtone + ", " + sendToVoicemail; + return "ringtone: " + customRingtone + ", " + "vibration: " + customVibration + "," + sendToVoicemail; } } @@ -227,12 +233,13 @@ private void refreshCacheEntry() { normalizedNumber = PhoneNumberUtils.normalizeNumber(number); } final String customRingtone = cursor.getString(INDEX_CUSTOM_RINGTONE); + final String customVibration = cursor.getString(INDEX_CUSTOM_VIBRATION); final boolean sendToVoicemail = cursor.getInt(INDEX_SEND_TO_VOICEMAIL) == 1; if (PhoneNumberUtils.isUriNumber(number)) { // SIP address case putNewEntryWhenAppropriate( - newNumberToEntry, number, customRingtone, sendToVoicemail); + newNumberToEntry, number, customRingtone, sendToVoicemail, customVibration); } else { // PSTN number case // Each normalized number may or may not have full content of the number. @@ -247,7 +254,7 @@ private void refreshCacheEntry() { ? normalizedNumber.substring(length - 7, length) : normalizedNumber; putNewEntryWhenAppropriate( - newNumberToEntry, key, customRingtone, sendToVoicemail); + newNumberToEntry, key, customRingtone, sendToVoicemail, customVibration); } } @@ -281,18 +288,18 @@ private void refreshCacheEntry() { } private void putNewEntryWhenAppropriate(HashMap newNumberToEntry, - String numberOrSipAddress, String customRingtone, boolean sendToVoicemail) { + String numberOrSipAddress, String customRingtone, boolean sendToVoicemail, String customVibration) { if (newNumberToEntry.containsKey(numberOrSipAddress)) { // There may be duplicate entries here and we should prioritize // "send-to-voicemail" flag in any case. final CacheEntry entry = newNumberToEntry.get(numberOrSipAddress); if (!entry.sendToVoicemail && sendToVoicemail) { newNumberToEntry.put(numberOrSipAddress, - new CacheEntry(customRingtone, sendToVoicemail)); + new CacheEntry(customRingtone, sendToVoicemail, customVibration)); } } else { newNumberToEntry.put(numberOrSipAddress, - new CacheEntry(customRingtone, sendToVoicemail)); + new CacheEntry(customRingtone, sendToVoicemail, customVibration)); } } diff --git a/src/com/android/phone/InCallScreen.java b/src/com/android/phone/InCallScreen.java index f8ba9c76..62bfea71 100755 --- a/src/com/android/phone/InCallScreen.java +++ b/src/com/android/phone/InCallScreen.java @@ -33,6 +33,7 @@ import android.content.DialogInterface.OnCancelListener; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Typeface; @@ -74,6 +75,9 @@ import com.android.phone.InCallUiState.InCallScreenMode; import com.android.phone.OtaUtils.CdmaOtaScreenState; +import android.preference.PreferenceManager; +import android.content.SharedPreferences; + import java.util.List; @@ -120,6 +124,9 @@ public class InCallScreen extends Activity /* package */ static final String EXTRA_GATEWAY_URI = "com.android.phone.extra.GATEWAY_URI"; + private static final String BUTTON_EXIT_TO_HOMESCREEN_KEY = "button_exit_to_home_screen_key"; + private static final String BUTTON_LANDSCAPE_KEY = "button_landscape_key"; + // Amount of time (in msec) that we display the "Call ended" state. // The "short" value is for calls ended by the local user, and the // "long" value is for calls ended by the remote caller. @@ -244,6 +251,9 @@ private enum SyncWithPhoneStateStatus { private boolean mIsForegroundActivityForProximity = false; private PowerManager mPowerManager; + public boolean Exit_To_Home_Screen = false; + private boolean Enable_Landscape_In_Call = false; + // For use with Pause/Wait dialogs private String mPostDialStrAfterPause; private boolean mPauseInProgress = false; @@ -450,6 +460,8 @@ protected void onCreate(Bundle icicle) { return; } + updateSettings(); + mApp = PhoneGlobals.getInstance(); mApp.setInCallScreenInstance(this); @@ -550,6 +562,13 @@ protected void onResume() { if (DBG) log("onResume()..."); super.onResume(); + updateSettings(); + + if (Enable_Landscape_In_Call) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); + } else { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); + } mIsForegroundActivity = true; mIsForegroundActivityForProximity = true; @@ -2195,7 +2214,8 @@ private void showPausePromptDialog(final Connection c, String postDialStrAfterPa private View createWildPromptView() { LinearLayout result = new LinearLayout(this); - result.setOrientation(LinearLayout.VERTICAL); + //result.setOrientation(LinearLayout.VERTICAL); + // Let the Manfiest determine Layout. result.setPadding(5, 5, 5, 5); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( @@ -2644,7 +2664,8 @@ private void delayedCleanupAfterDisconnect() { log("- Show Call Log (or Dialtacts) after disconnect. Current intent: " + intent); } - try { + if (!Exit_To_Home_Screen) + try { startActivity(intent, opts.toBundle()); } catch (ActivityNotFoundException e) { // Don't crash if there's somehow no "Call log" at @@ -2662,8 +2683,8 @@ private void delayedCleanupAfterDisconnect() { // stay in the activity history. } + endInCallScreenSession(); } - endInCallScreenSession(); // Reset the call origin when the session ends and this in-call UI is being finished. mApp.setLatestActiveCallOrigin(null); @@ -4590,6 +4611,14 @@ private void log(String msg) { Log.d(LOG_TAG, msg); } + protected void updateSettings() { + SharedPreferences callsettings = PreferenceManager.getDefaultSharedPreferences(this); + + Exit_To_Home_Screen = (callsettings.getBoolean(BUTTON_EXIT_TO_HOMESCREEN_KEY,false)); + Enable_Landscape_In_Call = callsettings.getBoolean(BUTTON_LANDSCAPE_KEY,false); + + } + /** * Requests to remove provider info frame after having * {@link #PROVIDER_INFO_TIMEOUT}) msec delay. diff --git a/src/com/android/phone/InCallTouchUi.java b/src/com/android/phone/InCallTouchUi.java index 986765e4..b690e561 100644 --- a/src/com/android/phone/InCallTouchUi.java +++ b/src/com/android/phone/InCallTouchUi.java @@ -1005,6 +1005,10 @@ public void onReleased(View v, int handle) { } + public void onTargetChange(View v, int whichHandle) { + + } + /** * Handles "Answer" and "Reject" actions for an incoming call. * We get this callback from the incoming call widget diff --git a/src/com/android/phone/MobileNetworkSettings.java b/src/com/android/phone/MobileNetworkSettings.java index a81d7c2c..6753a0ad 100644 --- a/src/com/android/phone/MobileNetworkSettings.java +++ b/src/com/android/phone/MobileNetworkSettings.java @@ -70,6 +70,7 @@ public class MobileNetworkSettings extends PreferenceActivity private static final String BUTTON_PREFERED_NETWORK_MODE = "preferred_network_mode_key"; private static final String BUTTON_ROAMING_KEY = "button_roaming_key"; private static final String BUTTON_CDMA_LTE_DATA_SERVICE_KEY = "cdma_lte_data_service_key"; + private static final String BUTTON_NATIONAL_ROAMING_KEY = "button_national_roaming_key"; static final int preferredNetworkMode = Phone.PREFERRED_NT_MODE; @@ -83,6 +84,7 @@ public class MobileNetworkSettings extends PreferenceActivity private CheckBoxPreference mButtonDataRoam; private CheckBoxPreference mButtonDataEnabled; private Preference mLteDataServicePref; + private CheckBoxPreference mButtonNationalDataRoam; private Preference mButtonDataUsage; private DataUsageListener mDataUsageListener; @@ -168,6 +170,11 @@ public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preferen mPhone.setDataRoamingEnabled(false); } return true; + } else if (preference == mButtonNationalDataRoam) { + android.provider.Settings.System.putInt(mPhone.getContext().getContentResolver(), + android.provider.Settings.System.MVNO_ROAMING, + mButtonNationalDataRoam.isChecked() ? 1 : 0); + return true; } else if (preference == mButtonDataEnabled) { if (DBG) log("onPreferenceTreeClick: preference == mButtonDataEnabled."); ConnectivityManager cm = @@ -217,12 +224,14 @@ protected void onCreate(Bundle icicle) { mButtonDataEnabled = (CheckBoxPreference) prefSet.findPreference(BUTTON_DATA_ENABLED_KEY); mButtonDataRoam = (CheckBoxPreference) prefSet.findPreference(BUTTON_ROAMING_KEY); + mButtonNationalDataRoam = (CheckBoxPreference) prefSet.findPreference(BUTTON_NATIONAL_ROAMING_KEY); mButtonPreferredNetworkMode = (ListPreference) prefSet.findPreference( BUTTON_PREFERED_NETWORK_MODE); mButtonDataUsage = prefSet.findPreference(BUTTON_DATA_USAGE_KEY); mLteDataServicePref = prefSet.findPreference(BUTTON_CDMA_LTE_DATA_SERVICE_KEY); boolean isLteOnCdma = mPhone.getLteOnCdmaMode() == PhoneConstants.LTE_ON_CDMA_TRUE; + boolean isLteOnGsm = mPhone.getLteOnGsmMode() != 0; if (getResources().getBoolean(R.bool.world_phone) == true) { // set the listener for the mButtonPreferredNetworkMode list preference so we can issue // change Preferred Network Mode. @@ -236,7 +245,7 @@ protected void onCreate(Bundle icicle) { mCdmaOptions = new CdmaOptions(this, prefSet, mPhone); mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet); } else { - if (!isLteOnCdma) { + if (!isLteOnCdma && !isLteOnGsm) { prefSet.removePreference(mButtonPreferredNetworkMode); } int phoneType = mPhone.getPhoneType(); @@ -258,6 +267,19 @@ protected void onCreate(Bundle icicle) { } else if (phoneType == PhoneConstants.PHONE_TYPE_GSM) { mGsmUmtsOptions = new GsmUmtsOptions(this, prefSet); + if (isLteOnGsm) { + mButtonPreferredNetworkMode.setOnPreferenceChangeListener(this); + mButtonPreferredNetworkMode.setEntries( + R.array.preferred_network_mode_choices_lte_gsm); + mButtonPreferredNetworkMode.setEntryValues( + R.array.preferred_network_mode_values_lte_gsm); + int settingsNetworkMode = android.provider.Settings.Secure.getInt( + mPhone.getContext().getContentResolver(), + android.provider.Settings.Global.PREFERRED_NETWORK_MODE, + preferredNetworkMode); + mButtonPreferredNetworkMode.setValue( + Integer.toString(settingsNetworkMode)); + } } else { throw new IllegalStateException("Unexpected phone type: " + phoneType); } @@ -299,6 +321,10 @@ protected void onResume() { // and the UI state would be inconsistent with actual state mButtonDataRoam.setChecked(mPhone.getDataRoamingEnabled()); + mButtonNationalDataRoam.setChecked(android.provider.Settings.System.getInt( + mPhone.getContext().getContentResolver(), + android.provider.Settings.System.MVNO_ROAMING, 0) == 1); + if (getPreferenceScreen().findPreference(BUTTON_PREFERED_NETWORK_MODE) != null) { mPhone.getPreferredNetworkType(mHandler.obtainMessage( MyHandler.MESSAGE_GET_PREFERRED_NETWORK_TYPE)); @@ -333,6 +359,18 @@ public boolean onPreferenceChange(Preference preference, Object objValue) { if (buttonNetworkMode != settingsNetworkMode) { int modemNetworkMode; switch(buttonNetworkMode) { + case Phone.NT_MODE_LTE_WCDMA: + modemNetworkMode = Phone.NT_MODE_LTE_WCDMA; + break; + case Phone.NT_MODE_LTE_CMDA_EVDO_GSM_WCDMA: + modemNetworkMode = Phone.NT_MODE_LTE_CMDA_EVDO_GSM_WCDMA; + break; + case Phone.NT_MODE_LTE_GSM_WCDMA: + modemNetworkMode = Phone.NT_MODE_LTE_GSM_WCDMA; + break; + case Phone.NT_MODE_LTE_CDMA_AND_EVDO: + modemNetworkMode = Phone.NT_MODE_LTE_CDMA_AND_EVDO; + break; case Phone.NT_MODE_GLOBAL: modemNetworkMode = Phone.NT_MODE_GLOBAL; break; @@ -431,7 +469,11 @@ private void handleGetPreferredNetworkTypeResponse(Message msg) { modemNetworkMode == Phone.NT_MODE_CDMA || modemNetworkMode == Phone.NT_MODE_CDMA_NO_EVDO || modemNetworkMode == Phone.NT_MODE_EVDO_NO_CDMA || - modemNetworkMode == Phone.NT_MODE_GLOBAL ) { + modemNetworkMode == Phone.NT_MODE_GLOBAL || + modemNetworkMode == Phone.NT_MODE_LTE_CDMA_AND_EVDO || + modemNetworkMode == Phone.NT_MODE_LTE_GSM_WCDMA || + modemNetworkMode == Phone.NT_MODE_LTE_CMDA_EVDO_GSM_WCDMA || + modemNetworkMode == Phone.NT_MODE_LTE_WCDMA ) { if (DBG) { log("handleGetPreferredNetworkTypeResponse: if 1: modemNetworkMode = " + modemNetworkMode); @@ -516,17 +558,18 @@ private void UpdatePreferredNetworkModeSummary(int NetworkMode) { R.string.preferred_network_mode_gsm_wcdma_summary); break; case Phone.NT_MODE_CDMA: - switch (mPhone.getLteOnCdmaMode()) { + // Show the same label whether a CDMA or CDMA/LTE phone. + /*switch (mPhone.getLteOnCdmaMode()) { case PhoneConstants.LTE_ON_CDMA_TRUE: mButtonPreferredNetworkMode.setSummary( R.string.preferred_network_mode_cdma_summary); break; case PhoneConstants.LTE_ON_CDMA_FALSE: - default: + default:*/ mButtonPreferredNetworkMode.setSummary( R.string.preferred_network_mode_cdma_evdo_summary); - break; - } + /*break; + }*/ break; case Phone.NT_MODE_CDMA_NO_EVDO: mButtonPreferredNetworkMode.setSummary( @@ -536,6 +579,22 @@ private void UpdatePreferredNetworkModeSummary(int NetworkMode) { mButtonPreferredNetworkMode.setSummary( R.string.preferred_network_mode_evdo_only_summary); break; + case Phone.NT_MODE_LTE_CDMA_AND_EVDO: + mButtonPreferredNetworkMode.setSummary( + R.string.preferred_network_mode_lte_cdma_evdo_summary); + break; + case Phone.NT_MODE_LTE_GSM_WCDMA: + mButtonPreferredNetworkMode.setSummary( + R.string.preferred_network_mode_lte_gsm_summary); + break; + case Phone.NT_MODE_LTE_CMDA_EVDO_GSM_WCDMA: + mButtonPreferredNetworkMode.setSummary( + R.string.preferred_network_mode_lte_cdma_evdo_gsm_wcdma_summary); + break; + case Phone.NT_MODE_LTE_WCDMA: + mButtonPreferredNetworkMode.setSummary( + R.string.preferred_network_mode_lte_wcdma_summary); + break; case Phone.NT_MODE_GLOBAL: default: mButtonPreferredNetworkMode.setSummary( diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java index acfdd7e2..5cb2d387 100644 --- a/src/com/android/phone/PhoneGlobals.java +++ b/src/com/android/phone/PhoneGlobals.java @@ -71,6 +71,11 @@ import com.android.phone.OtaUtils.CdmaOtaScreenState; import com.android.server.sip.SipService; +import android.os.Vibrator; +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.os.HandlerThread; + /** * Global state for the telephony subsystem when running in the primary * phone process. @@ -255,6 +260,14 @@ public enum WakeState { // Current TTY operating mode selected by user private int mPreferredTtyMode = Phone.TTY_MODE_OFF; + // handling of vibration on call begin/each minute/call end + private static final String ACTION_VIBRATE_60 = "com.android.phone.PhoneApp.ACTION_VIBRATE_60"; + private PendingIntent mVibrateIntent; + private Vibrator mVibrator; + private AlarmManager mAM; + private HandlerThread mVibrationThread; + private Handler mVibrationHandler; + /** * Set the restore mute state flag. Used when we are setting the mute state * OUTSIDE of user interaction {@link PhoneUtils#startNewCall(Phone)} @@ -563,6 +576,7 @@ public void onCreate() { intentFilter.addAction(TelephonyIntents.ACTION_RADIO_TECHNOLOGY_CHANGED); intentFilter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED); intentFilter.addAction(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED); + intentFilter.addAction(ACTION_VIBRATE_60); if (mTtyEnabled) { intentFilter.addAction(TtyIntent.TTY_PREFERRED_MODE_CHANGE_ACTION); } @@ -611,6 +625,10 @@ public void onCreate() { // start with the default value to set the mute state. mShouldRestoreMuteOnInCallResume = false; + mVibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE); + mAM = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); + mVibrateIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_VIBRATE_60), 0); + // TODO: Register for Cdma Information Records // phone.registerCdmaInformationRecord(mHandler, EVENT_UNSOL_CDMA_INFO_RECORD, null); @@ -1518,6 +1536,10 @@ public void onReceive(Context context, Intent intent) { if (ringerMode == AudioManager.RINGER_MODE_SILENT) { notifier.silenceRinger(); } + } else if (action.equals(ACTION_VIBRATE_60)) { + if (VDBG) Log.d(LOG_TAG, "mReceiver: ACTION_VIBRATE_60"); + mAM.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 60000, mVibrateIntent); + vibrate(70, 70, -1); } } } @@ -1832,6 +1854,58 @@ public Intent createPhoneEndIntentUsingCallOrigin() { } } + private final class TriVibRunnable implements Runnable { + private int v1, p1, v2; + TriVibRunnable(int a, int b, int c) { + v1 = a; p1 = b; v2 = c; + } + public void run() { + if (DBG) Log.d(LOG_TAG, "vibrate " + v1 + ":" + p1 + ":" + v2); + if (v1 > 0) mVibrator.vibrate(v1); + if (p1 > 0) SystemClock.sleep(p1); + if (v2 > 0) mVibrator.vibrate(v2); + } + } + + public void start60SecondVibration(long callDurationMsec) { + if (VDBG) Log.v(LOG_TAG, "vibrate start @" + callDurationMsec); + stop60SecondVibration(); + long timer; + if (callDurationMsec > 60000) { + // Schedule the alarm at the next minute + 60 secs + timer = 60000 + 60000 - callDurationMsec; + } else { + // Schedule the alarm at the first 60 second mark + timer = 60000 - callDurationMsec; + } + long nextAlarm = SystemClock.elapsedRealtime() + timer; + if (VDBG) Log.v(LOG_TAG, "am at: " + nextAlarm); + mAM.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, nextAlarm, mVibrateIntent); + } + + private void stop60SecondVibration() { + if (VDBG) Log.v(LOG_TAG, "vibrate stop @" + SystemClock.elapsedRealtime()); + mAM.cancel(mVibrateIntent); + } + + public void vibrate(int v1, int p1, int v2) { + if (mVibrationThread == null) { + mVibrationThread = new HandlerThread("Vibrate 60 handler"); + mVibrationThread.start(); + mVibrationHandler = new Handler(mVibrationThread.getLooper()); + } + mVibrationHandler.post(new TriVibRunnable(v1, p1, v2)); + } + + public void stopVibrationThread() { + stop60SecondVibration(); + mVibrationHandler = null; + if (mVibrationThread != null) { + mVibrationThread.quit(); + mVibrationThread = null; + } + } + /** Service connection */ private final ServiceConnection mBluetoothPhoneConnection = new ServiceConnection() { diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java index 441270a2..5a90a065 100644 --- a/src/com/android/phone/PhoneInterfaceManager.java +++ b/src/com/android/phone/PhoneInterfaceManager.java @@ -30,10 +30,13 @@ import android.os.Message; import android.os.Process; import android.os.ServiceManager; +import android.os.SystemProperties; +import android.provider.Settings; import android.os.UserHandle; import android.telephony.NeighboringCellInfo; import android.telephony.CellInfo; import android.telephony.ServiceState; +import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; @@ -62,6 +65,8 @@ public class PhoneInterfaceManager extends ITelephony.Stub { private static final int CMD_ANSWER_RINGING_CALL = 4; private static final int CMD_END_CALL = 5; // not used yet private static final int CMD_SILENCE_RINGER = 6; + private static final int CMD_TOGGLE_LTE = 7; + private static final int CMD_TOGGLE_2G = 8; /** The singleton instance. */ private static PhoneInterfaceManager sInstance; @@ -284,6 +289,50 @@ public void call(String number) { mApp.startActivity(intent); } + public void toggleLTE(boolean on) { + int network = -1; + boolean usesQcLte = SystemProperties.getBoolean( + "ro.config.qc_lte_network_modes", false); + + if (getLteOnGsmMode() != 0) { + if (on) { + network = Phone.NT_MODE_LTE_GSM_WCDMA; + } else { + network = Phone.NT_MODE_WCDMA_PREF; + } + } else if (usesQcLte) { + if (on) { + network = PhoneConstants.NT_MODE_LTE_CDMA_EVDO; + } else { + network = PhoneConstants.NT_MODE_CDMA; + } + } else { + if (on) { + network = PhoneConstants.NT_MODE_GLOBAL; + } else { + network = PhoneConstants.NT_MODE_CDMA; + } + } + + mPhone.setPreferredNetworkType(network, + mMainThreadHandler.obtainMessage(CMD_TOGGLE_LTE)); + Settings.Secure.putInt(mApp.getContentResolver(), + Settings.Global.PREFERRED_NETWORK_MODE, network); + } + + public void toggle2G(boolean on) { + int network = -1; + if (on) { + network = PhoneConstants.NT_MODE_GSM_ONLY; + } else { + network = PhoneConstants.NT_MODE_WCDMA_PREF; + } + mPhone.setPreferredNetworkType(network, + mMainThreadHandler.obtainMessage(CMD_TOGGLE_2G)); + Settings.Secure.putInt(mApp.getContentResolver(), + Settings.Global.PREFERRED_NETWORK_MODE, network); + } + private boolean showCallScreenInternal(boolean specifyInitialDialpadState, boolean initialDialpadState) { if (!PhoneGlobals.sVoiceCapable) { @@ -841,4 +890,8 @@ public boolean hasIccCard() { public int getLteOnCdmaMode() { return mPhone.getLteOnCdmaMode(); } + + public int getLteOnGsmMode() { + return mPhone.getLteOnGsmMode(); + } } diff --git a/src/com/android/phone/PhoneUtils.java b/src/com/android/phone/PhoneUtils.java index b71ae35c..34faeb25 100644 --- a/src/com/android/phone/PhoneUtils.java +++ b/src/com/android/phone/PhoneUtils.java @@ -72,6 +72,7 @@ import java.util.Iterator; import java.util.List; +import android.preference.PreferenceManager; /** * Misc utilities for the Phone app. */ @@ -249,14 +250,17 @@ private PhoneUtils() { final PhoneGlobals app = PhoneGlobals.getInstance(); // If the ringer is currently ringing and/or vibrating, stop it - // right now (before actually answering the call.) - app.getRinger().stopRing(); + // right now and prevent new rings (before actually answering the call) + app.notifier.silenceRinger(); final Phone phone = ringing.getPhone(); final boolean phoneIsCdma = (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA); boolean answered = false; IBluetoothHeadsetPhone btPhone = null; + // enable noise suppression + turnOnNoiseSuppression(app.getApplicationContext(), true); + if (phoneIsCdma) { // Stop any signalInfo tone being played when a Call waiting gets answered if (ringing.getState() == Call.State.WAITING) { @@ -387,6 +391,51 @@ static boolean hangup(CallManager cm) { return hungup; } + static Call getCurrentCall(Phone phone) { + Call ringing = phone.getRingingCall(); + Call fg = phone.getForegroundCall(); + Call bg = phone.getBackgroundCall(); + if (!ringing.isIdle()) { + return ringing; + } + if (!fg.isIdle()) { + return fg; + } + if (!bg.isIdle()) { + return bg; + } + return fg; + } + + static Connection getConnection(Phone phone, Call call) { + if (call == null) { + return null; + } + if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_CDMA) { + return call.getLatestConnection(); + } + return call.getEarliestConnection(); + } + + static class PhoneSettings { + static boolean vibOn60Secs(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean("button_vibrate_60", false); + } + static boolean vibHangup(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean("button_vibrate_hangup", false); + } + static boolean vibOutgoing(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean("button_vibrate_outgoing", false); + } + static boolean vibCallWaiting(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context) + .getBoolean("button_vibrate_call_waiting", false); + } + } + static boolean hangupRingingCall(Call ringing) { if (DBG) log("hangup ringing call"); int phoneType = ringing.getPhone().getPhoneType(); @@ -1930,8 +1979,7 @@ static boolean isSpeakerOn(Context context) { return audioManager.isSpeakerphoneOn(); } - - static void turnOnNoiseSuppression(Context context, boolean flag, boolean store) { + static void turnOnNoiseSuppression(Context context, boolean flag) { if (DBG) log("turnOnNoiseSuppression: " + flag); AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); @@ -1939,47 +1987,31 @@ static void turnOnNoiseSuppression(Context context, boolean flag, boolean store) return; } - if (flag) { - audioManager.setParameters("noise_suppression=auto"); - } else { - audioManager.setParameters("noise_suppression=off"); - } - - // record the speaker-enable value - if (store) { - sIsNoiseSuppressionEnabled = flag; - } - - // TODO: implement and manage ICON + int nsp = android.provider.Settings.System.getInt(context.getContentResolver(), + android.provider.Settings.System.NOISE_SUPPRESSION, + 1); - } + String aParam = context.getResources().getString(R.string.in_call_noise_suppression_audioparameter); + String[] aPValues = aParam.split("="); - static void restoreNoiseSuppression(Context context) { - if (DBG) log("restoreNoiseSuppression, restoring to: " + sIsNoiseSuppressionEnabled); - - if (!context.getResources().getBoolean(R.bool.has_in_call_noise_suppression)) { - return; + if(aPValues[0].length() == 0) { + aPValues[0] = "noise_suppression"; } - // change the mode if needed. - if (isNoiseSuppressionOn(context) != sIsNoiseSuppressionEnabled) { - turnOnNoiseSuppression(context, sIsNoiseSuppressionEnabled, false); + if(aPValues[1].length() == 0) { + aPValues[1] = "on"; } - } - static boolean isNoiseSuppressionOn(Context context) { - - if (!context.getResources().getBoolean(R.bool.has_in_call_noise_suppression)) { - return false; + if(aPValues[2].length() == 0) { + aPValues[2] = "off"; } - AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); - String noiseSuppression = audioManager.getParameters("noise_suppression"); - if (DBG) log("isNoiseSuppressionOn: " + noiseSuppression); - if (noiseSuppression.contains("off")) { - return false; + if (nsp == 1 && flag) { + if (DBG) log("turnOnNoiseSuppression: " + aPValues[0] + "=" + aPValues[1]); + audioManager.setParameters(aPValues[0] + "=" + aPValues[1]); } else { - return true; + if (DBG) log("turnOnNoiseSuppression: " + aPValues[0] + "=" + aPValues[2]); + audioManager.setParameters(aPValues[0] + "=" + aPValues[2]); } } diff --git a/src/com/android/phone/Ringer.java b/src/com/android/phone/Ringer.java index e97716f8..7d91941a 100644 --- a/src/com/android/phone/Ringer.java +++ b/src/com/android/phone/Ringer.java @@ -20,6 +20,7 @@ import android.media.AudioManager; import android.media.Ringtone; import android.media.RingtoneManager; +import android.media.VibrationPattern; import android.net.Uri; import android.os.Handler; import android.os.IPowerManager; @@ -34,6 +35,8 @@ import android.provider.Settings; import android.util.Log; +import java.util.Calendar; + import com.android.internal.telephony.Phone; /** * Ringer manager for the Phone app. @@ -54,8 +57,10 @@ public class Ringer { // Uri for the ringtone. Uri mCustomRingtoneUri = Settings.System.DEFAULT_RINGTONE_URI; + Uri mCustomVibrationUri = Settings.System.DEFAULT_VIBRATION_URI; Ringtone mRingtone; + VibrationPattern mVibrationPattern; Vibrator mVibrator; IPowerManager mPowerManager; volatile boolean mContinueVibrating; @@ -159,6 +164,10 @@ void ring() { } if (shouldVibrate() && mVibratorThread == null) { + mVibrationPattern = new VibrationPattern(mCustomVibrationUri, mContext); + if (mVibrationPattern.getPattern() == null) { + mVibrationPattern = VibrationPattern.getFallbackVibration(mContext); + } mContinueVibrating = true; mVibratorThread = new VibratorThread(); if (DBG) log("- starting vibrator..."); @@ -167,7 +176,7 @@ void ring() { AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); - if (audioManager.getStreamVolume(AudioManager.STREAM_RING) == 0) { + if (audioManager.getStreamVolume(AudioManager.STREAM_RING) == 0 || inQuietHours()) { if (DBG) log("skipping ring because volume is zero"); return; } @@ -239,6 +248,7 @@ void stopRing() { if (mVibratorThread != null) { if (DBG) log("- stopRing: cleaning up vibrator thread..."); + mVibrationPattern.stop(); mContinueVibrating = false; mVibratorThread = null; } @@ -250,8 +260,8 @@ void stopRing() { private class VibratorThread extends Thread { public void run() { while (mContinueVibrating) { - mVibrator.vibrate(VIBRATE_LENGTH); - SystemClock.sleep(VIBRATE_LENGTH + PAUSE_LENGTH); + mVibrationPattern.play(); + SystemClock.sleep(mVibrationPattern.getLength() + PAUSE_LENGTH); } } } @@ -301,6 +311,16 @@ void setCustomRingtoneUri (Uri uri) { } } + /** + * Sets the vibration uri in preparation for vibrating. + * This uri is defaulted to the phone-wide default vibration. + */ + void setCustomVibrationUri (Uri uri) { + if (uri != null) { + mCustomVibrationUri = uri; + } + } + private void makeLooper() { if (mRingThread == null) { mRingThread = new Worker("ringer"); @@ -351,4 +371,27 @@ public void handleMessage(Message msg) { private static void log(String msg) { Log.d(LOG_TAG, msg); } + + private boolean inQuietHours() { + boolean quietHoursEnabled = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.QUIET_HOURS_ENABLED, 0) != 0; + int quietHoursStart = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.QUIET_HOURS_START, 0); + int quietHoursEnd = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.QUIET_HOURS_END, 0); + boolean quietHoursRinger = Settings.System.getInt(mContext.getContentResolver(), + Settings.System.QUIET_HOURS_RINGER, 0) != 0; + if (quietHoursEnabled && quietHoursRinger && (quietHoursStart != quietHoursEnd)) { + // Get the date in "quiet hours" format. + Calendar calendar = Calendar.getInstance(); + int minutes = calendar.get(Calendar.HOUR_OF_DAY) * 60 + calendar.get(Calendar.MINUTE); + if (quietHoursEnd < quietHoursStart) { + // Starts at night, ends in the morning. + return (minutes > quietHoursStart) || (minutes < quietHoursEnd); + } else { + return (minutes > quietHoursStart) && (minutes < quietHoursEnd); + } + } + return false; + } }