summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/cyanogenmod/NavRing.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/cyanogenmod/NavRing.java')
-rw-r--r--src/com/android/settings/cyanogenmod/NavRing.java316
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() {
+ }
+}