RemoteInputCompatJellybean.java revision 2bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7
1ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen/*
2ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Copyright (C) 2014 The Android Open Source Project
3ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen *
4ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Licensed under the Apache License, Version 2.0 (the "License");
5ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * you may not use this file except in compliance with the License.
6ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * You may obtain a copy of the License at
7ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen *
8ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen *      http://www.apache.org/licenses/LICENSE-2.0
9ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen *
10ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * Unless required by applicable law or agreed to in writing, software
11ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * distributed under the License is distributed on an "AS IS" BASIS,
12ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * See the License for the specific language governing permissions and
14ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen * limitations under the License.
15ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen */
16ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
17ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazenpackage android.support.v4.app;
18ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
19ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazenimport android.content.ClipData;
20ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazenimport android.content.ClipDescription;
21ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazenimport android.content.Intent;
22ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazenimport android.os.Bundle;
23ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
24ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazenclass RemoteInputCompatJellybean {
25ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /** Label used to denote the clip data type used for remote input transport */
26ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
27ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
28ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    /** Extra added to a clip data intent object to hold the results bundle. */
29ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
30ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
31ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    private static final String KEY_RESULT_KEY = "resultKey";
32ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    private static final String KEY_LABEL = "label";
33ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    private static final String KEY_CHOICES = "choices";
34ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    private static final String KEY_ALLOW_FREE_FORM_INPUT = "allowFreeFormInput";
35ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    private static final String KEY_EXTRAS = "extras";
36ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
372bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    static RemoteInputCompatBase.RemoteInput fromBundle(Bundle data,
382bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            RemoteInputCompatBase.RemoteInput.Factory factory) {
39ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return factory.build(data.getString(KEY_RESULT_KEY),
40ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                data.getCharSequence(KEY_LABEL),
41ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                data.getCharSequenceArray(KEY_CHOICES),
42ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                data.getBoolean(KEY_ALLOW_FREE_FORM_INPUT),
43ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                data.getBundle(KEY_EXTRAS));
44ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
45ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
46ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    static Bundle toBundle(RemoteInputCompatBase.RemoteInput remoteInput) {
47ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        Bundle data = new Bundle();
48ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        data.putString(KEY_RESULT_KEY, remoteInput.getResultKey());
49ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        data.putCharSequence(KEY_LABEL, remoteInput.getLabel());
50ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        data.putCharSequenceArray(KEY_CHOICES, remoteInput.getChoices());
51ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        data.putBoolean(KEY_ALLOW_FREE_FORM_INPUT, remoteInput.getAllowFreeFormInput());
52ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        data.putBundle(KEY_EXTRAS, remoteInput.getExtras());
53ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return data;
54ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
55ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
562bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen    static RemoteInputCompatBase.RemoteInput[] fromBundleArray(Bundle[] bundles,
572bb98d48fdaf79a2bbd9d247da81a2bb9834dfc7Griff Hazen            RemoteInputCompatBase.RemoteInput.Factory factory) {
58ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        if (bundles == null) {
59ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return null;
60ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
61ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        RemoteInputCompatBase.RemoteInput[] remoteInputs = factory.newArray(bundles.length);
62ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        for (int i = 0; i < bundles.length; i++) {
63ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            remoteInputs[i] = fromBundle(bundles[i], factory);
64ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
65ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return remoteInputs;
66ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
67ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
68ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    static Bundle[] toBundleArray(RemoteInputCompatBase.RemoteInput[] remoteInputs) {
69ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        if (remoteInputs == null) {
70ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return null;
71ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
72ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        Bundle[] bundles = new Bundle[remoteInputs.length];
73ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        for (int i = 0; i < remoteInputs.length; i++) {
74ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            bundles[i] = toBundle(remoteInputs[i]);
75ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
76ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return bundles;
77ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
78ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
79ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    static Bundle getResultsFromIntent(Intent intent) {
80ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        ClipData clipData = intent.getClipData();
81ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        if (clipData == null) {
82ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return null;
83ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
84ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        ClipDescription clipDescription = clipData.getDescription();
85ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        if (!clipDescription.hasMimeType(ClipDescription.MIMETYPE_TEXT_INTENT)) {
86ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return null;
87ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
88ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        if (clipDescription.getLabel().equals(RESULTS_CLIP_LABEL)) {
89ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            return clipData.getItemAt(0).getIntent().getExtras().getParcelable(EXTRA_RESULTS_DATA);
90ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
91ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        return null;
92ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
93ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen
94ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    static void addResultsToIntent(RemoteInputCompatBase.RemoteInput[] remoteInputs, Intent intent,
95ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            Bundle results) {
96ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        Bundle resultsBundle = new Bundle();
97ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        for (RemoteInputCompatBase.RemoteInput remoteInput : remoteInputs) {
98ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            Object result = results.get(remoteInput.getResultKey());
99ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            if (result instanceof CharSequence) {
100ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen                resultsBundle.putCharSequence(remoteInput.getResultKey(), (CharSequence) result);
101ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen            }
102ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        }
103ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        Intent clipIntent = new Intent();
104ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        clipIntent.putExtra(EXTRA_RESULTS_DATA, resultsBundle);
105ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen        intent.setClipData(ClipData.newIntent(RESULTS_CLIP_LABEL, clipIntent));
106ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen    }
107ce16e4276c2f61109a23b3f6707cfcd87b07c735Griff Hazen}
108