diff options
Diffstat (limited to 'src/com/android/settings/cyanogenmod/NavRing.java')
-rw-r--r-- | src/com/android/settings/cyanogenmod/NavRing.java | 316 |
1 files changed, 316 insertions, 0 deletions
diff --git a/src/com/android/settings/cyanogenmod/NavRing.java b/src/com/android/settings/cyanogenmod/NavRing.java new file mode 100644 index 0000000..6eba01d --- /dev/null +++ b/src/com/android/settings/cyanogenmod/NavRing.java @@ -0,0 +1,316 @@ +/* + * 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.settings.cyanogenmod; + +import android.app.AlertDialog; +import android.app.Fragment; +import android.content.ContentResolver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.Intent.ShortcutIconResource; +import android.content.res.Configuration; +import android.os.Bundle; +import android.os.Vibrator; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import static com.android.internal.util.cm.NavigationRingConstants.*; +import com.android.internal.util.cm.NavigationRingHelpers; +import com.android.internal.widget.multiwaveview.GlowPadView; +import com.android.internal.widget.multiwaveview.TargetDrawable; +import com.android.settings.R; +import com.android.settings.Utils; + +import java.util.ArrayList; + +public class NavRing extends Fragment implements + ShortcutPickHelper.OnPickListener, GlowPadView.OnTriggerListener { + private GlowPadView mGlowPadView; + private ShortcutPickHelper mPicker; + private String[] mTargetActivities; + private ViewGroup mContainer; + + private int mTargetIndex = 0; + private int mStartPosOffset; + private int mEndPosOffset; + + private boolean mIsLandscape; + private boolean mIsScreenLarge; + + private ActionHolder mActions; + + private static final int MENU_RESET = Menu.FIRST; + private static final int MENU_SAVE = Menu.FIRST + 1; + + private class ActionHolder { + private ArrayList<CharSequence> mAvailableEntries = new ArrayList<CharSequence>(); + private ArrayList<String> mAvailableValues = new ArrayList<String>(); + + public void addAction(String action, int entryResId) { + mAvailableEntries.add(getString(entryResId)); + mAvailableValues.add(action); + } + public int getActionIndex(String action) { + int count = mAvailableValues.size(); + for (int i = 0; i < count; i++) { + if (TextUtils.equals(mAvailableValues.get(i), action)) { + return i; + } + } + return -1; + } + public String getAction(int index) { + if (index > mAvailableValues.size()) { + return null; + } + return mAvailableValues.get(index); + } + public CharSequence[] getEntries() { + return mAvailableEntries.toArray(new CharSequence[mAvailableEntries.size()]); + } + }; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + mContainer = container; + setHasOptionsMenu(true); + createActionList(); + + mIsScreenLarge = !Utils.isPhone(getActivity()); + mIsLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; + + mPicker = new ShortcutPickHelper(getActivity(), this); + + return inflater.inflate(R.layout.navigation_ring_targets, container, false); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + mGlowPadView = ((GlowPadView) getActivity().findViewById(R.id.navring_target)); + mGlowPadView.setOnTriggerListener(this); + updateDrawables(); + } + + private void createActionList() { + mActions = new ActionHolder(); + mActions.addAction(ACTION_NONE, R.string.navring_action_none); + + if (NavigationRingHelpers.isAssistantAvailable(getActivity())) { + mActions.addAction(ACTION_ASSIST, R.string.navring_action_google_now); + } + if (NavigationRingHelpers.isTorchAvailable(getActivity())) { + mActions.addAction(ACTION_TORCH, R.string.navring_action_torch); + } + + mActions.addAction(ACTION_SCREENSHOT, R.string.navring_action_take_screenshot); + mActions.addAction(ACTION_IME, R.string.navring_action_open_ime_switcher); + mActions.addAction(ACTION_SILENT, R.string.navring_action_ring_silent); + + Vibrator vibrator = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE); + if (vibrator != null && vibrator.hasVibrator()) { + mActions.addAction(ACTION_VIBRATE, R.string.navring_action_ring_vibrate); + mActions.addAction(ACTION_RING_SILENT_VIBRATE, R.string.navring_action_ring_vibrate_silent); + } + + mActions.addAction(ACTION_KILL, R.string.navring_action_kill_app); + mActions.addAction(ACTION_POWER, R.string.navring_action_screen_off); + + mActions.addAction(ACTION_APP, R.string.select_application); + } + + private void setDrawables() { + final ArrayList<TargetDrawable> targets = new ArrayList<TargetDrawable>(); + final Context context = getActivity(); + + if (!mIsLandscape || mIsScreenLarge) { + mStartPosOffset = 1; + mEndPosOffset = 4; + } else { + mStartPosOffset = 3; + mEndPosOffset = 2; + } + + // Add Initial Place Holder Targets + for (int i = 0; i < mStartPosOffset; i++) { + targets.add(NavigationRingHelpers.getTargetDrawable(context, null)); + } + // Add User Targets + for (int i = 0; i < mTargetActivities.length; i++) { + final TargetDrawable drawable = + NavigationRingHelpers.getTargetDrawable(context, mTargetActivities[i]); + // we also want empty targets to be selectable here + drawable.setEnabled(true); + targets.add(drawable); + } + + // Add End Place Holder Targets + for (int i = 0; i < mEndPosOffset; i++) { + targets.add(NavigationRingHelpers.getTargetDrawable(context, null)); + } + + mGlowPadView.setTargetResources(targets); + NavigationRingHelpers.swapSearchIconIfNeeded(context, mGlowPadView); + } + + @Override + public void onResume() { + super.onResume(); + + // If running on a phone, remove padding around container + if (!mIsScreenLarge) { + mContainer.setPadding(0, 0, 0, 0); + } + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + menu.add(0, MENU_RESET, 0, R.string.profile_reset_title) + .setIcon(R.drawable.ic_settings_backup) + .setAlphabeticShortcut('r') + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | + MenuItem.SHOW_AS_ACTION_WITH_TEXT); + menu.add(0, MENU_SAVE, 0, R.string.wifi_save) + .setIcon(R.drawable.ic_menu_save) + .setAlphabeticShortcut('s') + .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | + MenuItem.SHOW_AS_ACTION_WITH_TEXT); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case MENU_RESET: + resetAll(); + return true; + case MENU_SAVE: + saveAll(); + Toast.makeText(getActivity(), R.string.navring_target_save, Toast.LENGTH_LONG).show(); + return true; + default: + return false; + } + } + + private void resetAll() { + final AlertDialog d = new AlertDialog.Builder(getActivity()) + .setTitle(R.string.lockscreen_target_reset_title) + .setIconAttribute(android.R.attr.alertDialogIcon) + .setMessage(R.string.navring_target_reset_message) + .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + NavigationRingHelpers.resetActionsToDefaults(getActivity()); + updateDrawables(); + Toast.makeText(getActivity(), + R.string.navring_target_reset, + Toast.LENGTH_LONG).show(); + } + }) + .setNegativeButton(R.string.cancel, null) + .create(); + + d.show(); + } + + private void saveAll() { + final ContentResolver cr = getActivity().getContentResolver(); + for (int i = 0; i < mTargetActivities.length; i++) { + Settings.System.putString(cr, + Settings.System.NAVIGATION_RING_TARGETS[i], mTargetActivities[i]); + } + updateDrawables(); + } + + @Override + public void shortcutPicked(String uri, String friendlyName, boolean isApplication) { + mTargetActivities[mTargetIndex] = uri; + setDrawables(); + } + + public void onActivityResult(int requestCode, int resultCode, Intent data) { + mPicker.onActivityResult(requestCode, resultCode, data); + super.onActivityResult(requestCode, resultCode, data); + } + + public void updateDrawables() { + mTargetActivities = NavigationRingHelpers.getTargetActions(getActivity()); + setDrawables(); + } + + public void onTargetChange(String uri) { + if (uri.equals(ACTION_APP)) { + final String label = getResources().getString(R.string.lockscreen_target_empty); + final ShortcutIconResource iconResource = + ShortcutIconResource.fromContext(getActivity(), android.R.drawable.ic_delete); + mPicker.pickShortcut( + new String[] { label }, + new ShortcutIconResource[] { iconResource }, + getId()); + } else { + mTargetActivities[mTargetIndex] = uri; + setDrawables(); + } + } + + @Override + public void onTrigger(View v, final int target) { + mTargetIndex = target - mStartPosOffset; + + final DialogInterface.OnClickListener l = new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int item) { + onTargetChange(mActions.getAction(item)); + dialog.dismiss(); + } + }; + + final int selection = mActions.getActionIndex(mTargetActivities[mTargetIndex]); + final AlertDialog dialog = new AlertDialog.Builder(getActivity()) + .setTitle(R.string.navring_choose_action_title) + .setSingleChoiceItems(mActions.getEntries(), selection, l) + .create(); + + dialog.show(); + } + + @Override + public void onGrabbed(View v, int handle) { + } + + @Override + public void onReleased(View v, int handle) { + } + + @Override + public void onGrabbedStateChange(View v, int handle) { + } + + @Override + public void onFinishFinalAnimation() { + } +} |