Home | History | Annotate | Download | only in settings
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.settings;
     18 
     19 import android.app.ActivityManagerNative;
     20 import android.app.IActivityManager;
     21 import android.app.ListActivity;
     22 import android.app.backup.BackupManager;
     23 import android.content.res.Configuration;
     24 import android.os.Bundle;
     25 import android.os.RemoteException;
     26 import android.os.SystemProperties;
     27 import android.util.Log;
     28 import android.view.View;
     29 import android.widget.ArrayAdapter;
     30 import android.widget.ListView;
     31 
     32 import java.io.BufferedWriter;
     33 import java.io.FileOutputStream;
     34 import java.text.Collator;
     35 import java.util.Arrays;
     36 import java.util.Locale;
     37 
     38 public class LocalePicker extends ListActivity {
     39     private static final String TAG = "LocalePicker";
     40     private static final boolean DEBUG = false;
     41 
     42     Loc[] mLocales;
     43     String[] mSpecialLocaleCodes;
     44     String[] mSpecialLocaleNames;
     45 
     46     private static class Loc implements Comparable {
     47         static Collator sCollator = Collator.getInstance();
     48 
     49         String label;
     50         Locale locale;
     51 
     52         public Loc(String label, Locale locale) {
     53             this.label = label;
     54             this.locale = locale;
     55         }
     56 
     57         @Override
     58         public String toString() {
     59             return this.label;
     60         }
     61 
     62         public int compareTo(Object o) {
     63             return sCollator.compare(this.label, ((Loc) o).label);
     64         }
     65     }
     66 
     67     int getContentView() {
     68         return R.layout.locale_picker;
     69     }
     70 
     71     @Override
     72     public void onCreate(Bundle icicle) {
     73         super.onCreate(icicle);
     74         setContentView(getContentView());
     75 
     76         mSpecialLocaleCodes = getResources().getStringArray(R.array.special_locale_codes);
     77         mSpecialLocaleNames = getResources().getStringArray(R.array.special_locale_names);
     78 
     79         String[] locales = getAssets().getLocales();
     80         Arrays.sort(locales);
     81 
     82         final int origSize = locales.length;
     83         Loc[] preprocess = new Loc[origSize];
     84         int finalSize = 0;
     85         for (int i = 0 ; i < origSize; i++ ) {
     86             String s = locales[i];
     87             int len = s.length();
     88             if (len == 5) {
     89                 String language = s.substring(0, 2);
     90                 String country = s.substring(3, 5);
     91                 Locale l = new Locale(language, country);
     92 
     93                 if (finalSize == 0) {
     94                     if (DEBUG) {
     95                         Log.v(TAG, "adding initial "+ toTitleCase(l.getDisplayLanguage(l)));
     96                     }
     97                     preprocess[finalSize++] =
     98                             new Loc(toTitleCase(l.getDisplayLanguage(l)), l);
     99                 } else {
    100                     // check previous entry:
    101                     //  same lang and a country -> upgrade to full name and
    102                     //    insert ours with full name
    103                     //  diff lang -> insert ours with lang-only name
    104                     if (preprocess[finalSize-1].locale.getLanguage().equals(
    105                             language)) {
    106                         if (DEBUG) {
    107                             Log.v(TAG, "backing up and fixing "+
    108                                     preprocess[finalSize-1].label+" to "+
    109                                     getDisplayName(preprocess[finalSize-1].locale));
    110                         }
    111                         preprocess[finalSize-1].label = toTitleCase(
    112                                 getDisplayName(preprocess[finalSize-1].locale));
    113                         if (DEBUG) {
    114                             Log.v(TAG, "  and adding "+ toTitleCase(getDisplayName(l)));
    115                         }
    116                         preprocess[finalSize++] =
    117                                 new Loc(toTitleCase(getDisplayName(l)), l);
    118                     } else {
    119                         String displayName;
    120                         if (s.equals("zz_ZZ")) {
    121                             displayName = "Pseudo...";
    122                         } else {
    123                             displayName = toTitleCase(l.getDisplayLanguage(l));
    124                         }
    125                         if (DEBUG) {
    126                             Log.v(TAG, "adding "+displayName);
    127                         }
    128                         preprocess[finalSize++] = new Loc(displayName, l);
    129                     }
    130                 }
    131             }
    132         }
    133         mLocales = new Loc[finalSize];
    134         for (int i = 0; i < finalSize ; i++) {
    135             mLocales[i] = preprocess[i];
    136         }
    137         Arrays.sort(mLocales);
    138         int layoutId = R.layout.locale_picker_item;
    139         int fieldId = R.id.locale;
    140         ArrayAdapter<Loc> adapter =
    141                 new ArrayAdapter<Loc>(this, layoutId, fieldId, mLocales);
    142         getListView().setAdapter(adapter);
    143     }
    144 
    145     private static String toTitleCase(String s) {
    146         if (s.length() == 0) {
    147             return s;
    148         }
    149 
    150         return Character.toUpperCase(s.charAt(0)) + s.substring(1);
    151     }
    152 
    153     private String getDisplayName(Locale l) {
    154         String code = l.toString();
    155 
    156         for (int i = 0; i < mSpecialLocaleCodes.length; i++) {
    157             if (mSpecialLocaleCodes[i].equals(code)) {
    158                 return mSpecialLocaleNames[i];
    159             }
    160         }
    161 
    162         return l.getDisplayName(l);
    163     }
    164 
    165     @Override
    166     public void onResume() {
    167         super.onResume();
    168         getListView().requestFocus();
    169     }
    170 
    171     @Override
    172     protected void onListItemClick(ListView l, View v, int position, long id) {
    173         try {
    174             IActivityManager am = ActivityManagerNative.getDefault();
    175             Configuration config = am.getConfiguration();
    176 
    177             Loc loc = mLocales[position];
    178             config.locale = loc.locale;
    179 
    180             // indicate this isn't some passing default - the user wants this remembered
    181             config.userSetLocale = true;
    182 
    183             am.updateConfiguration(config);
    184             // Trigger the dirty bit for the Settings Provider.
    185             BackupManager.dataChanged("com.android.providers.settings");
    186         } catch (RemoteException e) {
    187             // Intentionally left blank
    188         }
    189         finish();
    190     }
    191 }
    192