java类android.view.inputmethod.CompletionInfo的实例源码

KP2AKeyboard.java 文件源码 项目:keepass2android 阅读 33 收藏 0 点赞 0 评论 0
@Override
public void onDisplayCompletions(CompletionInfo[] completions) {
    if (DEBUG) {
        Log.i("foo", "Received completions:");
        for (int i=0; i<(completions != null ? completions.length : 0); i++) {
            Log.i("foo", "  #" + i + ": " + completions[i]);
        }
    }
    if (mCompletionOn) {
        mCompletions = completions;
        if (completions == null) {
            clearSuggestions();
            return;
        }

        List<CharSequence> stringList = new ArrayList<CharSequence>();
        for (int i=0; i<(completions != null ? completions.length : 0); i++) {
            CompletionInfo ci = completions[i];
            if (ci != null) stringList.add(ci.getText());
        }
        // When in fullscreen mode, show completions generated by the application
        setSuggestions(stringList, true, true, true);
        mBestWord = null;
        setCandidatesViewShown(true);
    }
}
PCKeyboard.java 文件源码 项目:behe-keyboard 阅读 37 收藏 0 点赞 0 评论 0
/**
 * This tells us about completions that the editor has determined based
 * on the current text in it.  We want to use this in fullscreen mode
 * to show the completions ourself, since the editor can not be seen
 * in that situation.
 */
@Override public void onDisplayCompletions(CompletionInfo[] completions) {
    if (mCompletionOn) {
        mCompletions = completions;
        if (completions == null) {
            setSuggestions(null, false, false);
            return;
        }

        List<String> stringList = new ArrayList<String>();
        for (int i = 0; i < completions.length; i++) {
            CompletionInfo ci = completions[i];
            if (ci != null) stringList.add(ci.getText().toString());
        }
        setSuggestions(stringList, true, true);
    }
}
PCKeyboard.java 文件源码 项目:behe-keyboard 阅读 48 收藏 0 点赞 0 评论 0
public void pickSuggestionManually(int index) {
    if (mCompletionOn && mCompletions != null && index >= 0
            && index < mCompletions.length) {
        CompletionInfo ci = mCompletions[index];
        getCurrentInputConnection().commitCompletion(ci);
        if (mCandidateView != null) {
            mCandidateView.clear();
        }
        updateShiftKeyState(getCurrentInputEditorInfo());
    } else if (mComposing.length() > 0) {

        if (mPredictionOn && mSuggestions != null && index >= 0) {
            mComposing.replace(0, mComposing.length(), mSuggestions.get(index));
        }
        commitTyped(getCurrentInputConnection());

    }
}
TerminalKeyboard.java 文件源码 项目:javaide 阅读 31 收藏 0 点赞 0 评论 0
public void pickSuggestionManually(int index) {
    if (mCompletionOn && mCompletions != null && index >= 0
            && index < mCompletions.length) {
        CompletionInfo ci = mCompletions[index];
        getCurrentInputConnection().commitCompletion(ci);
        if (mCandidateView != null) {
            mCandidateView.clear();
        }
        updateShiftKeyState(getCurrentInputEditorInfo());
    } else if (mComposing.length() > 0) {
        // If we were generating candidate suggestions for the current
        // text, we would commit one of them here.  But for this sample,
        // we will just commit the current text.
        commitTyped(getCurrentInputConnection());
    }
}
QuranKeyboardIME.java 文件源码 项目:QuranKeyboard 阅读 37 收藏 0 点赞 0 评论 0
/**
 * This tells us about completions that the editor has determined based
 * on the current text in it.  We want to use this in fullscreen mode
 * to show the completions ourself, since the editor can not be seen
 * in that situation.
 */
@Override public void onDisplayCompletions(CompletionInfo[] completions) {
    if (mCompletionOn) {
        mCompletions = completions;
        if (completions == null) {
            setSuggestions(null, false);
            return;
        }

        List<String> stringList = new ArrayList<>();
        for (CompletionInfo ci : completions) {
            if (ci != null) stringList.add(ci.getText().toString());
        }
        setSuggestions(stringList, true);
    }
}
KP2AKeyboard.java 文件源码 项目:KeePass2Android 阅读 28 收藏 0 点赞 0 评论 0
@Override
public void onDisplayCompletions(CompletionInfo[] completions) {
    if (DEBUG) {
        Log.i("foo", "Received completions:");
        for (int i=0; i<(completions != null ? completions.length : 0); i++) {
            Log.i("foo", "  #" + i + ": " + completions[i]);
        }
    }
    if (mCompletionOn) {
        mCompletions = completions;
        if (completions == null) {
            clearSuggestions();
            return;
        }

        List<CharSequence> stringList = new ArrayList<CharSequence>();
        for (int i=0; i<(completions != null ? completions.length : 0); i++) {
            CompletionInfo ci = completions[i];
            if (ci != null) stringList.add(ci.getText());
        }
        // When in fullscreen mode, show completions generated by the application
        setSuggestions(stringList, true, true, true);
        mBestWord = null;
        setCandidatesViewShown(true);
    }
}
SoftKeyboard.java 文件源码 项目:tibetan-keyboard 阅读 25 收藏 0 点赞 0 评论 0
/**
 * This tells us about completions that the editor has determined based
 * on the current text in it.  We want to use this in fullscreen mode
 * to show the completions ourself, since the editor can not be seen
 * in that situation.
 */
@Override public void onDisplayCompletions(CompletionInfo[] completions) {
    if (mCompletionOn) {
        mCompletions = completions;
        if (completions == null) {
            setSuggestions(null, false, false);
            return;
        }

        List<String> stringList = new ArrayList<String>();
        for (int i=0; i<(completions != null ? completions.length : 0); i++) {
            CompletionInfo ci = completions[i];
            if (ci != null) stringList.add(ci.getText().toString());
        }
        setSuggestions(stringList, true, true);
    }
}
SoftKeyboard.java 文件源码 项目:tibetan-keyboard 阅读 24 收藏 0 点赞 0 评论 0
public void pickSuggestionManually(int index) {
    if (mCompletionOn && mCompletions != null && index >= 0
            && index < mCompletions.length) {
        CompletionInfo ci = mCompletions[index];
        getCurrentInputConnection().commitCompletion(ci);
        if (mCandidateView != null) {
            mCandidateView.clear();
        }
        updateShiftKeyState(getCurrentInputEditorInfo());
    } else if (mComposing.length() > 0) {
        // If we were generating candidate suggestions for the current
        // text, we would commit one of them here.  But for this sample,
        // we will just commit the current text.
        commitTyped(getCurrentInputConnection());
    }
}
SoftKeyboard.java 文件源码 项目:accentype-android 阅读 30 收藏 0 点赞 0 评论 0
/**
 * This tells us about completions that the editor has determined based
 * on the current text in it.  We want to use this in fullscreen mode
 * to show the completions ourself, since the editor can not be seen
 * in that situation.
 */
@Override public void onDisplayCompletions(CompletionInfo[] completions) {
    if (mCompletionOn) {
        mCompletions = completions;
        if (completions == null) {
            setSuggestions(null, null, false, false);
            return;
        }

        List<String> stringList = new ArrayList<String>();
        for (int i = 0; i < completions.length; i++) {
            CompletionInfo ci = completions[i];
            if (ci != null) stringList.add(ci.getText().toString());
        }
        setSuggestions(stringList, null, true, true);
    }
}
SoftKeyboard.java 文件源码 项目:literatim 阅读 45 收藏 0 点赞 0 评论 0
/**
 * This tells us about completions that the editor has determined based
 * on the current text in it.  We want to use this in fullscreen mode
 * to show the completions ourself, since the editor can not be seen
 * in that situation.
 */
@Override public void onDisplayCompletions(CompletionInfo[] completions) {
    if (mCompletionOn) {
        mCompletions = completions;
        if (completions == null) {
            setSuggestions((List<Suggestion>) null, false, false);
            return;
        }

        List<Suggestion> suggestions = new ArrayList<Suggestion>();
        for (int i=0; i<(completions != null ? completions.length : 0); i++) {
            CompletionInfo ci = completions[i];
            if (ci != null) suggestions.add(new Suggestion(0, ci.getText().toString()));
        }
        this.suggestions = null;
        setSuggestions(suggestions, true, true);
    }
}
SoftKeyboard.java 文件源码 项目:accentype-android 阅读 26 收藏 0 点赞 0 评论 0
/**
 * This tells us about completions that the editor has determined based
 * on the current text in it.  We want to use this in fullscreen mode
 * to show the completions ourself, since the editor can not be seen
 * in that situation.
 */
@Override public void onDisplayCompletions(CompletionInfo[] completions) {
    if (mCompletionOn) {
        mCompletions = completions;
        if (completions == null) {
            setSuggestions(null, null, false, false);
            return;
        }

        List<String> stringList = new ArrayList<String>();
        for (int i = 0; i < completions.length; i++) {
            CompletionInfo ci = completions[i];
            if (ci != null) stringList.add(ci.getText().toString());
        }
        setSuggestions(stringList, null, true, true);
    }
}
Pathfinder.java 文件源码 项目:sinovoice-pathfinder 阅读 35 收藏 0 点赞 0 评论 0
/**
 * This tells us about completions that the editor has determined based
 * on the current text in it.  We want to use this in fullscreen mode
 * to show the completions ourself, since the editor can not be seen
 * in that situation.
 */
@Override 
public void onDisplayCompletions(CompletionInfo[] completions) {
    if (mCompletionOn) {
        mCompletions = completions;
        if (completions == null) {
            setSuggestions(null, false, false);
            return;
        }

        List<String> stringList = new ArrayList<String>();
        for (int i = 0; i < completions.length; i++) {
            CompletionInfo ci = completions[i];
            if (ci != null) stringList.add(ci.getText().toString());
        }
        setSuggestions(stringList, true, true);
    }
}
Pathfinder.java 文件源码 项目:sinovoice-pathfinder 阅读 39 收藏 0 点赞 0 评论 0
public void pickSuggestionManually(int index, String text) {
    mComposing.setLength(0);
    mComposing.append(text);

    if (mCompletionOn && mCompletions != null && index >= 0
            && index < mCompletions.length) {
        CompletionInfo ci = mCompletions[index];
        getCurrentInputConnection().commitCompletion(ci);
        if (mCandidateView != null) {
            mCandidateView.clear();
        }
    } else if (mComposing.length() > 0) {
        // If we were generating candidate suggestions for the current
        // text, we would commit one of them here.  But for this sample,
        // we will just commit the current text.
        commitTyped(getCurrentInputConnection());
    }
}
TerminalKeyboard.java 文件源码 项目:ZShaolin 阅读 31 收藏 0 点赞 0 评论 0
public void pickSuggestionManually(int index) {
    if (mCompletionOn && mCompletions != null && index >= 0
            && index < mCompletions.length) {
        CompletionInfo ci = mCompletions[index];
        getCurrentInputConnection().commitCompletion(ci);
        if (mCandidateView != null) {
            mCandidateView.clear();
        }
        updateShiftKeyState(getCurrentInputEditorInfo());
    } else if (mComposing.length() > 0) {
        // If we were generating candidate suggestions for the current
        // text, we would commit one of them here.  But for this sample,
        // we will just commit the current text.
        commitTyped(getCurrentInputConnection());
    }
}
AnimalKeyboard.java 文件源码 项目:animal 阅读 24 收藏 0 点赞 0 评论 0
/**
 * This tells us about completions that the editor has determined based
 * on the current text in it.  We want to use this in fullscreen mode
 * to show the completions ourself, since the editor can not be seen
 * in that situation.
 */
@Override public void onDisplayCompletions(CompletionInfo[] completions) {
    if (mCompletionOn) {
        mCompletions = completions;
        if (completions == null) {
            setSuggestions(null, false, false);
            return;
        }

        List<String> stringList = new ArrayList<String>();
        for (int i = 0; i < completions.length; i++) {
            CompletionInfo ci = completions[i];
            if (ci != null) stringList.add(ci.getText().toString());
        }
        setSuggestions(stringList, true, true);
    }
}
AnimalKeyboard.java 文件源码 项目:animal 阅读 24 收藏 0 点赞 0 评论 0
public void pickSuggestionManually(int index) {
    if (mCompletionOn && mCompletions != null && index >= 0
            && index < mCompletions.length) {
        CompletionInfo ci = mCompletions[index];
        getCurrentInputConnection().commitCompletion(ci);
        store("["+ci.getText().toString()+"]");
        if (mCandidateView != null) {
            mCandidateView.clear();
        }
        updateShiftKeyState(getCurrentInputEditorInfo());
    } else if (mComposing.length() > 0) {
        // If we were generating candidate suggestions for the current
        // text, we would commit one of them here.  But for this sample,
        // we will just commit the current text.
        commitTyped(getCurrentInputConnection());
    }
}
RichInputConnection.java 文件源码 项目:android-kioskime 阅读 38 收藏 0 点赞 0 评论 0
public void commitCompletion(final CompletionInfo completionInfo) {
    if (DEBUG_BATCH_NESTING) checkBatchEdit();
    if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug();
    CharSequence text = completionInfo.getText();
    // text should never be null, but just in case, it's better to insert nothing than to crash
    if (null == text) text = "";
    mCommittedTextBeforeComposingText.append(text);
    mCurrentCursorPosition += text.length() - mComposingText.length();
    mComposingText.setLength(0);
    if (null != mIC) {
        mIC.commitCompletion(completionInfo);
        if (ProductionFlag.USES_DEVELOPMENT_ONLY_DIAGNOSTICS) {
            ResearchLogger.richInputConnection_commitCompletion(completionInfo);
        }
    }
    if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug();
}
RichInputConnection.java 文件源码 项目:AOSP-Kayboard-7.1.2 阅读 31 收藏 0 点赞 0 评论 0
public void commitCompletion(final CompletionInfo completionInfo) {
    if (DEBUG_BATCH_NESTING) checkBatchEdit();
    if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug();
    CharSequence text = completionInfo.getText();
    // text should never be null, but just in case, it's better to insert nothing than to crash
    if (null == text) text = "";
    mCommittedTextBeforeComposingText.append(text);
    mExpectedSelStart += text.length() - mComposingText.length();
    mExpectedSelEnd = mExpectedSelStart;
    mComposingText.setLength(0);
    if (isConnected()) {
        mIC.commitCompletion(completionInfo);
    }
    if (DEBUG_PREVIOUS_TEXT) checkConsistencyForDebug();
}
CompletionInfoUtils.java 文件源码 项目:AOSP-Kayboard-7.1.2 阅读 23 收藏 0 点赞 0 评论 0
public static CompletionInfo[] removeNulls(final CompletionInfo[] src) {
    int j = 0;
    final CompletionInfo[] dst = new CompletionInfo[src.length];
    for (int i = 0; i < src.length; ++i) {
        if (null != src[i] && !TextUtils.isEmpty(src[i].getText())) {
            dst[j] = src[i];
            ++j;
        }
    }
    return Arrays.copyOfRange(dst, 0, j);
}
LatinIME.java 文件源码 项目:AOSP-Kayboard-7.1.2 阅读 40 收藏 0 点赞 0 评论 0
@Override
public void onDisplayCompletions(final CompletionInfo[] applicationSpecifiedCompletions) {
    if (DebugFlags.DEBUG_ENABLED) {
        Log.i(TAG, "Received completions:");
        if (applicationSpecifiedCompletions != null) {
            for (int i = 0; i < applicationSpecifiedCompletions.length; i++) {
                Log.i(TAG, "  #" + i + ": " + applicationSpecifiedCompletions[i]);
            }
        }
    }
    if (!mSettings.getCurrent().isApplicationSpecifiedCompletionsOn()) {
        return;
    }
    // If we have an update request in flight, we need to cancel it so it does not override
    // these completions.
    mHandler.cancelUpdateSuggestionStrip();
    if (applicationSpecifiedCompletions == null) {
        setNeutralSuggestionStrip();
        return;
    }

    final ArrayList<SuggestedWords.SuggestedWordInfo> applicationSuggestedWords =
            SuggestedWords.getFromApplicationSpecifiedCompletions(
                    applicationSpecifiedCompletions);
    final SuggestedWords suggestedWords = new SuggestedWords(applicationSuggestedWords,
            null /* rawSuggestions */,
            null /* typedWord */,
            false /* typedWordValid */,
            false /* willAutoCorrect */,
            false /* isObsoleteSuggestions */,
            SuggestedWords.INPUT_STYLE_APPLICATION_SPECIFIED /* inputStyle */,
            SuggestedWords.NOT_A_SEQUENCE_NUMBER);
    // When in fullscreen mode, show completions generated by the application forcibly
    setSuggestedWords(suggestedWords);
}
SuggestedWords.java 文件源码 项目:AOSP-Kayboard-7.1.2 阅读 25 收藏 0 点赞 0 评论 0
public static ArrayList<SuggestedWordInfo> getFromApplicationSpecifiedCompletions(
        final CompletionInfo[] infos) {
    final ArrayList<SuggestedWordInfo> result = new ArrayList<>();
    for (final CompletionInfo info : infos) {
        if (null == info || null == info.getText()) {
            continue;
        }
        result.add(new SuggestedWordInfo(info));
    }
    return result;
}
SuggestedWords.java 文件源码 项目:AOSP-Kayboard-7.1.2 阅读 24 收藏 0 点赞 0 评论 0
/**
 * Create a new suggested word info from an application-specified completion.
 * If the passed argument or its contained text is null, this throws a NPE.
 * @param applicationSpecifiedCompletion The application-specified completion info.
 */
public SuggestedWordInfo(final CompletionInfo applicationSpecifiedCompletion) {
    mWord = applicationSpecifiedCompletion.getText().toString();
    mPrevWordsContext = "";
    mApplicationSpecifiedCompletionInfo = applicationSpecifiedCompletion;
    mScore = SuggestedWordInfo.MAX_SCORE;
    mKindAndFlags = SuggestedWordInfo.KIND_APP_DEFINED;
    mSourceDict = Dictionary.DICTIONARY_APPLICATION_DEFINED;
    mCodePointCount = StringUtils.codePointCount(mWord);
    mIndexOfTouchPointOfSecondWord = SuggestedWordInfo.NOT_AN_INDEX;
    mAutoCommitFirstWordConfidence = SuggestedWordInfo.NOT_A_CONFIDENCE;
}
SoftKeyboard.java 文件源码 项目:accentype-android 阅读 30 收藏 0 点赞 0 评论 0
public void pickSuggestionManually(int index) {
    if (mCompletionOn && mCompletions != null && index >= 0
            && index < mCompletions.length) {
        CompletionInfo ci = mCompletions[index];
        getCurrentInputConnection().commitCompletion(ci);
        if (mCandidateView != null) {
            mCandidateView.clear();
        }
        updateShiftKeyState(getCurrentInputEditorInfo());
    } else if (mComposing.length() > 0) {
        commitTyped(getCurrentInputConnection(), index);
    }
}
LatinIME.java 文件源码 项目:hackerskeyboard 阅读 41 收藏 0 点赞 0 评论 0
@Override
public void onDisplayCompletions(CompletionInfo[] completions) {
    if (DEBUG) {
        Log.i("foo", "Received completions:");
        for (int i = 0; i < (completions != null ? completions.length : 0); i++) {
            Log.i("foo", "  #" + i + ": " + completions[i]);
        }
    }
    if (mCompletionOn) {
        mCompletions = completions;
        if (completions == null) {
            clearSuggestions();
            return;
        }

        List<CharSequence> stringList = new ArrayList<CharSequence>();
        for (int i = 0; i < (completions != null ? completions.length : 0); i++) {
            CompletionInfo ci = completions[i];
            if (ci != null)
                stringList.add(ci.getText());
        }
        // When in fullscreen mode, show completions generated by the
        // application
        setSuggestions(stringList, true, true, true);
        mBestWord = null;
        setCandidatesViewShown(true);
    }
}
SoftKeyboard.java 文件源码 项目:literatim 阅读 53 收藏 0 点赞 0 评论 0
public void pickCandidateManually(int index) {
    InputConnection ic = getCurrentInputConnection();
    if (mCompletionOn && mCompletions != null && index >= 0 && index < mCompletions.length) {
        CompletionInfo ci = mCompletions[index];
        ic.commitCompletion(ci);
        if (mCandidateView != null) {
            mCandidateView.clear();
        }
        updateShiftKeyState(getCurrentInputEditorInfo());
    } else if (suggestions != null && index < suggestions.size()) {
        String text = lexicon.getSuggestionText(mComposing.toString(), suggestions.get(index));
        if (text.charAt(0) == '\'') {
            // test to make sure we don't insert double ''
            CharSequence lastChar = ic.getTextBeforeCursor(1, 0);
            if (lastChar.charAt(0) == '\'') {
                text = text.substring(1);
            }
        }
        mComposing.setLength(0);
        mComposing.append(text);
        commitWithSpacing(ic);

    }
    else if (mComposing.length() > 0) {
        // Strange error; just commit the current text
        commitWithSpacing(ic);
    }
}
SoftKeyboard.java 文件源码 项目:accentype-android 阅读 27 收藏 0 点赞 0 评论 0
public void pickSuggestionManually(int index) {
    if (mCompletionOn && mCompletions != null && index >= 0
            && index < mCompletions.length) {
        CompletionInfo ci = mCompletions[index];
        getCurrentInputConnection().commitCompletion(ci);
        if (mCandidateView != null) {
            mCandidateView.clear();
        }
        updateShiftKeyState(getCurrentInputEditorInfo());
    } else if (mComposing.length() > 0) {
        commitTyped(getCurrentInputConnection(), index);
    }
}
EditableInputConnection.java 文件源码 项目:JotaTextEditor 阅读 48 收藏 0 点赞 0 评论 0
public boolean commitCompletion(CompletionInfo text) {
    if (DEBUG) Log.v(TAG, "commitCompletion " + text);
    mTextView.beginBatchEdit();
    mTextView.onCommitCompletion(text);
    mTextView.endBatchEdit();
    return true;
}
SearchBar.java 文件源码 项目:adt-leanback-support 阅读 27 收藏 0 点赞 0 评论 0
/**
 * Update the completion list shown by the IME
 *
 * @param completions list of completions shown in the IME, can be null or empty to clear them
 */
public void displayCompletions(List<String> completions) {
    List<CompletionInfo> infos = new ArrayList<CompletionInfo>();
    if (null != completions) {
        for (String completion : completions) {
            infos.add(new CompletionInfo(infos.size(), infos.size(), completion));
        }
    }

    mInputMethodManager.displayCompletions(mSearchTextEditor,
            infos.toArray(new CompletionInfo[] {}));
}
AutoCompleteTextView.java 文件源码 项目:gloomy-dungeons-2 阅读 24 收藏 0 点赞 0 评论 0
private void buildImeCompletions() {
    final ListAdapter adapter = mAdapter;
    if (adapter != null) {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            final int count = Math.min(adapter.getCount(), 20);
            CompletionInfo[] completions = new CompletionInfo[count];
            int realCount = 0;
            for (int i = 0; i < count; i++) {
                if (adapter.isEnabled(i)) {
                    Object item = adapter.getItem(i);
                    long id = adapter.getItemId(i);
                    completions[realCount] = new CompletionInfo(id,
                            realCount, convertSelectionToString(item));
                    realCount++;
                }
            }
            if (realCount != count) {
                CompletionInfo[] tmp = new CompletionInfo[realCount];
                System.arraycopy(completions, 0, tmp, 0, realCount);
                completions = tmp;
            }

            imm.displayCompletions(this, completions);
        }
    }
}
AutoCompleteTextView.java 文件源码 项目:laposte-android 阅读 23 收藏 0 点赞 0 评论 0
private void buildImeCompletions() {
    final ListAdapter adapter = mAdapter;
    if (adapter != null) {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            final int count = Math.min(adapter.getCount(), 20);
            CompletionInfo[] completions = new CompletionInfo[count];
            int realCount = 0;
            for (int i = 0; i < count; i++) {
                if (adapter.isEnabled(i)) {
                    Object item = adapter.getItem(i);
                    long id = adapter.getItemId(i);
                    completions[realCount] = new CompletionInfo(id,
                            realCount, convertSelectionToString(item));
                    realCount++;
                }
            }
            if (realCount != count) {
                CompletionInfo[] tmp = new CompletionInfo[realCount];
                System.arraycopy(completions, 0, tmp, 0, realCount);
                completions = tmp;
            }

            imm.displayCompletions(this, completions);
        }
    }
}


问题


面经


文章

微信
公众号

扫码关注公众号