1af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet/*
2af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet * Copyright (C) 2011 The Android Open Source Project
3af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet *
4af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License");
5af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet * you may not use this file except in compliance with the License.
6af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet * You may obtain a copy of the License at
7af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet *
8af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet *      http://www.apache.org/licenses/LICENSE-2.0
9af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet *
10af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet * Unless required by applicable law or agreed to in writing, software
11af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS,
12af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet * See the License for the specific language governing permissions and
14af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet * limitations under the License.
15af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet */
16af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet
17af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohetpackage android.text;
18af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet
190d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Guptaimport com.android.ide.common.rendering.api.LayoutLog;
200d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Guptaimport com.android.layoutlib.bridge.Bridge;
21af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohetimport com.android.tools.layoutlib.annotations.LayoutlibDelegate;
220d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Guptaimport com.ibm.icu.text.Bidi;
23af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet
24af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet
25af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet/**
26af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet * Delegate used to provide new implementation for the native methods of {@link AndroidBidi}
27af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet *
28af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet * Through the layoutlib_create tool, the original  methods of AndroidBidi have been replaced
29af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet * by calls to methods of the same name in this delegate class.
30af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet *
31af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet */
32af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohetpublic class AndroidBidi_Delegate {
33af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet
34af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet    @LayoutlibDelegate
350d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta    /*package*/ static int runBidi(int dir, char[] chars, byte[] charInfo, int count,
360d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta            boolean haveInfo) {
370d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta
380d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta        switch (dir) {
390d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta        case 0: // Layout.DIR_REQUEST_LTR
400d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta        case 1: // Layout.DIR_REQUEST_RTL
410d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta            break;  // No change.
420d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta        case -1:
430d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta            dir = Bidi.LEVEL_DEFAULT_LTR;
440d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta            break;
450d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta        case -2:
460d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta            dir = Bidi.LEVEL_DEFAULT_RTL;
470d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta            break;
480d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta        default:
490d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta            // Invalid code. Log error, assume LEVEL_DEFAULT_LTR and continue.
500d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta            Bridge.getLog().error(LayoutLog.TAG_BROKEN, "Invalid direction flag", null);
510d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta            dir = Bidi.LEVEL_DEFAULT_LTR;
520d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta        }
530d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta        Bidi bidi = new Bidi(chars, 0, null, 0, count, dir);
540d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta        if (charInfo != null) {
550d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta            for (int i = 0; i < count; ++i)
560d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta            charInfo[i] = bidi.getLevelAt(i);
570d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta        }
580d9c922c9614147d1277cb36cfb7296774415d15Deepanshu Gupta        return bidi.getParaLevel();
59af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet    }
60af64556de0064eeb5a4d4e6d634c3f074f5f40ceXavier Ducrohet}
61