ManualDialogActivity.java revision 7e3fa36d69ffee874dd364b8e3d9aa3cab9a273b
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig/*
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig * FreeOTP
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig *
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig * Authors: Nathaniel McCallum <npmccallum@redhat.com>
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig *
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig * Copyright (C) 2013 Nathaniel McCallum, Red Hat
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig *
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig * Licensed under the Apache License, Version 2.0 (the "License");
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig * you may not use this file except in compliance with the License.
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig * You may obtain a copy of the License at
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig *
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig * http://www.apache.org/licenses/LICENSE-2.0
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig *
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig * Unless required by applicable law or agreed to in writing, software
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig * distributed under the License is distributed on an "AS IS" BASIS,
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig * See the License for the specific language governing permissions and
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig * limitations under the License.
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig */
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craigpackage org.fedorahosted.freeotp.dialogs;
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craigimport java.util.Locale;
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craigimport org.fedorahosted.freeotp.R;
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craigimport android.net.Uri;
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craigimport android.text.TextWatcher;
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craigimport android.view.View;
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craigimport android.widget.AdapterView;
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craigimport android.widget.AdapterView.OnItemSelectedListener;
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craigimport android.widget.EditText;
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craigimport android.widget.RadioButton;
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craigimport android.widget.Spinner;
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craigimport android.widget.TextView;
ca24c503de081b842357513302d0a57fa0050cd5Mark Craig
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craigpublic class ManualDialogActivity extends BaseAddTokenDialogActivity implements OnItemSelectedListener {
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig private static final String DEFAULT_INTERVAL = "30";
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig private static final String DEFAULT_COUNTER = "0";
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig private final int SHA1_OFFSET = 1;
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig private final int TOTP_OFFSET = 0;
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig private EditText mIssuer;
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig private EditText mLabel;
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig private EditText mSecret;
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig private EditText mInterval;
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig private Spinner mAlgorithm;
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig private Spinner mType;
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig public ManualDialogActivity() {
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig super(R.layout.manual, android.R.string.cancel, 0, R.string.add);
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig }
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig @Override
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig public void onStart() {
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig super.onStart();
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig mIssuer = (EditText) findViewById(R.id.issuer);
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig mLabel = (EditText) findViewById(R.id.label);
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig mSecret = (EditText) findViewById(R.id.secret);
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig mInterval = (EditText) findViewById(R.id.interval);
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig mAlgorithm = (Spinner) findViewById(R.id.algorithm);
d928438fd1d461915babc0464c95fd98d531c4b2Mark Craig mType = (Spinner) findViewById(R.id.type);
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig // Select the default algorithm
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig mAlgorithm.setSelection(SHA1_OFFSET);
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig // Setup the Interval / Counter toggle
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig mType.setOnItemSelectedListener(this);
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig // Disable the Add button
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig getButton(BUTTON_POSITIVE).setEnabled(false);
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig // Set constraints on when the Add button is enabled
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig TextWatcher tw = new ManualTextWatcher(this);
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig mIssuer.addTextChangedListener(tw);
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig mLabel.addTextChangedListener(tw);
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig mSecret.addTextChangedListener(new ManualSecretTextWatcher(this));
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig mInterval.addTextChangedListener(tw);
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig }
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig @Override
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig public void onClick(View view, int which) {
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig if (which != BUTTON_POSITIVE)
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig return;
41a9529116425a49eaabbdab74463b0f98ca5ea8Mark Craig
// Get the fields
String issuer = Uri.encode(mIssuer.getText().toString());
String label = Uri.encode(mLabel.getText().toString());
String secret = Uri.encode(mSecret.getText().toString());
String type = mType.getSelectedItemId() == TOTP_OFFSET ? "totp" : "hotp";
String algorithm = mAlgorithm.getSelectedItem().toString().toLowerCase(Locale.US);
int interval = Integer.parseInt(mInterval.getText().toString());
int digits = ((RadioButton) findViewById(R.id.digits6)).isChecked() ? 6 : 8;
// Create the URI
String uri = String.format(Locale.US, "otpauth://%s/%s:%s?secret=%s&algorithm=%s&digits=%d",
type, issuer, label, secret, algorithm, digits);
if (type.equals("totp"))
uri = uri.concat(String.format("&period=%d", interval));
else
uri = uri.concat(String.format("&counter=%d", interval));
// Add the token
onTokenURI(uri);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
TextView tv = (TextView) findViewById(R.id.interval_label);
if (position == 0) {
tv.setText(R.string.interval);
mInterval.setText(DEFAULT_INTERVAL);
} else {
tv.setText(R.string.counter);
mInterval.setText(DEFAULT_COUNTER);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}