diff options
author | Danny Baumann <dannybaumann@web.de> | 2013-06-25 23:36:04 -0700 |
---|---|---|
committer | Gerrit Code Review <gerrit@cyanogenmod.org> | 2013-06-25 23:36:04 -0700 |
commit | 3754b94205e9f22b38337a099376e406c390d372 (patch) | |
tree | 885af562be24cecb8738f5576df9ab59b7132ce7 /packages | |
parent | a08b2419493163832cbb44f8f85dfd36c3203f39 (diff) | |
parent | 60f0747301c7dad9a3ac88e2016b93a3194033bc (diff) | |
download | frameworks_base-3754b94205e9f22b38337a099376e406c390d372.zip frameworks_base-3754b94205e9f22b38337a099376e406c390d372.tar.gz frameworks_base-3754b94205e9f22b38337a099376e406c390d372.tar.bz2 |
Merge "Profiles: Add a profile picker activity" into cm-10.1
Diffstat (limited to 'packages')
-rw-r--r-- | packages/SettingsProvider/AndroidManifest.xml | 10 | ||||
-rw-r--r-- | packages/SettingsProvider/src/com/android/providers/settings/ProfilePickerActivity.java | 217 |
2 files changed, 227 insertions, 0 deletions
diff --git a/packages/SettingsProvider/AndroidManifest.xml b/packages/SettingsProvider/AndroidManifest.xml index ab2feb9..2538ad9 100644 --- a/packages/SettingsProvider/AndroidManifest.xml +++ b/packages/SettingsProvider/AndroidManifest.xml @@ -17,5 +17,15 @@ android:exported="true" android:writePermission="android.permission.WRITE_SETTINGS" android:initOrder="100" /> + + <activity android:name="ProfilePickerActivity" + android:theme="@*android:style/Theme.Holo.Dialog.Alert" + android:excludeFromRecents="true"> + <intent-filter> + <action android:name="android.intent.action.PROFILE_PICKER" /> + <category android:name="android.intent.category.DEFAULT" /> + </intent-filter> + </activity> + </application> </manifest> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/ProfilePickerActivity.java b/packages/SettingsProvider/src/com/android/providers/settings/ProfilePickerActivity.java new file mode 100644 index 0000000..d03660e --- /dev/null +++ b/packages/SettingsProvider/src/com/android/providers/settings/ProfilePickerActivity.java @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * Copyright (C) 2013 The CyanogenMod Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.providers.settings; + +import android.app.Profile; +import android.app.ProfileManager; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.widget.ArrayAdapter; +import android.widget.ListView; +import android.widget.TextView; + +import com.android.internal.app.AlertActivity; +import com.android.internal.app.AlertController; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +/** + * The {@link ProfilePickerActivity} allows the user to choose one from all of the + * available profiles. + * + * @see ProfileManager#ACTION_PROFILE_PICKER + * @hide + */ +public final class ProfilePickerActivity extends AlertActivity implements + DialogInterface.OnClickListener, AlertController.AlertParams.OnPrepareListViewListener { + + private static final String TAG = "ProfilePickerActivity"; + + private static final String SAVE_CLICKED_POS = "clicked_pos"; + + private ProfileManager mProfileManager; + + /** The position in the list of the 'None' item. */ + private int mNonePos = -1; + + /** The position in the list of the last clicked item. */ + private int mClickedPos = -1; + + /** Whether this list has the 'None' item. */ + private boolean mHasNoneItem; + + /** The UUID to place a checkmark next to. */ + private UUID mExistingUUID; + + private List<Profile> mProfiles; + + private DialogInterface.OnClickListener mProfileClickListener = + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // Save the position of most recently clicked item + mClickedPos = which; + } + + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Intent intent = getIntent(); + + if (savedInstanceState != null) { + mClickedPos = savedInstanceState.getInt(SAVE_CLICKED_POS, -1); + } + + // Get whether to show the 'None' item + mHasNoneItem = intent.getBooleanExtra(ProfileManager.EXTRA_PROFILE_SHOW_NONE, true); + + // Give the Activity so it can do managed queries + mProfileManager = (ProfileManager) getSystemService(Context.PROFILE_SERVICE); + mProfiles = Arrays.asList(mProfileManager.getProfiles()); + + // Get the UUID whose list item should have a checkmark + String uuid = intent.getStringExtra(ProfileManager.EXTRA_PROFILE_EXISTING_UUID); + if (uuid == null) { + mExistingUUID = null; + } else { + try { + mExistingUUID = UUID.fromString(uuid); + } catch (IllegalArgumentException e) { + Log.e(TAG, "Invalid existing UUID: " + uuid); + mExistingUUID = ProfileManager.NO_PROFILE; + } + } + + final ArrayList<String> profileNames = new ArrayList<String>(); + for (Profile profile : mProfiles) { + profileNames.add(profile.getName()); + } + + final AlertController.AlertParams p = mAlertParams; + p.mAdapter = new ArrayAdapter<String>(this, + com.android.internal.R.layout.select_dialog_singlechoice_holo, profileNames); + p.mOnClickListener = mProfileClickListener; + p.mIsSingleChoice = true; + p.mPositiveButtonText = getString(com.android.internal.R.string.ok); + p.mPositiveButtonListener = this; + p.mNegativeButtonText = getString(com.android.internal.R.string.cancel); + p.mPositiveButtonListener = this; + p.mOnPrepareListViewListener = this; + + p.mTitle = intent.getCharSequenceExtra(ProfileManager.EXTRA_PROFILE_TITLE); + if (p.mTitle == null) { + p.mTitle = getString(com.android.internal.R.string.profile_picker_title); + } + + setupAlert(); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putInt(SAVE_CLICKED_POS, mClickedPos); + } + + @Override + public void onPrepareListView(ListView listView) { + if (mHasNoneItem) { + mNonePos = addNoneItem(listView); + + // The 'None' item should use a NO_PROFILE UUID + if (mExistingUUID == null || mExistingUUID.equals(ProfileManager.NO_PROFILE)) { + mClickedPos = mNonePos; + } + } + + // Has a valid UUID + if (mClickedPos == -1 && mExistingUUID != null) { + mClickedPos = getPositionForUUID(mExistingUUID); + } + if (mClickedPos == -1) { + mClickedPos = getPositionForUUID(mProfileManager.getActiveProfile().getUuid()); + } + + // Put a checkmark next to an item. + mAlertParams.mCheckedItem = mClickedPos; + } + + private int getPositionForUUID(UUID uuid) { + int count = mProfiles.size(); + for (int i = 0; i < count; i++) { + if (mProfiles.get(i).getUuid().equals(uuid)) { + return mNonePos + i + 1; + } + } + return -1; + } + + /** + * Adds a static item to the top of the list. A static item is one that is not from the + * ProfileManager. + * + * @param listView The ListView to add to. + * @param textResId The resource ID of the text for the item. + * @return The position of the inserted item. + */ + private int addStaticItem(ListView listView, int textResId) { + TextView textView = (TextView) getLayoutInflater().inflate( + com.android.internal.R.layout.select_dialog_singlechoice_holo, listView, false); + textView.setText(textResId); + listView.addHeaderView(textView); + return listView.getHeaderViewsCount() - 1; + } + + private int addNoneItem(ListView listView) { + return addStaticItem(listView, com.android.internal.R.string.profile_none); + } + + /* + * On click of Ok/Cancel buttons + */ + public void onClick(DialogInterface dialog, int which) { + boolean positiveResult = which == DialogInterface.BUTTON_POSITIVE; + + if (positiveResult) { + Intent resultIntent = new Intent(); + UUID uuid = ProfileManager.NO_PROFILE; + + if (mClickedPos != mNonePos) { + int pos = mHasNoneItem ? mClickedPos - 1 : mClickedPos; + if (pos >= 0 && pos < mProfiles.size()) { + uuid = mProfiles.get(pos).getUuid(); + } + } + + resultIntent.putExtra(ProfileManager.EXTRA_PROFILE_PICKED_UUID, uuid.toString()); + setResult(RESULT_OK, resultIntent); + } else { + setResult(RESULT_CANCELED); + } + + finish(); + } +} |